主要内容

音频设备编写器

播放声卡

描述

这个音频设备编写器系统对象™将音频样本写入音频输出设备。音频设备写入器的属性指定驱动程序、设备和设备属性,如采样率、位深和缓冲区大小。

看见音频I/O:缓冲、延迟和吞吐量有关音频设备写入器数据流的详细说明。

将数据流传输到音频设备:

  1. 创建音频设备编写器对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解有关系统对象如何工作的更多信息,请参见什么是系统对象?

创建

描述

设备编写器= audioDeviceWriter返回一个System对象,设备编写器,它实时地将音频样本写入音频输出设备。

设备编写器=音频设备编写器(sampleRateValue)设置SampleRate财产sampleRateValue

设备编写器=音频设备编写器(___,名称、值)设置每个属性的名字到指定的价值.未指定的属性具有默认值。

例子:deviceWriter = audioDeviceWriter(48000,'BitDepth','8位整数')创建一个System对象,设备编写器,它的采样率为48 kHz,深度为8位整数。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改其值。

有关更改属性值的更多信息,请参见基于系统对象的MATLAB系统设计

用于访问音频设备的驱动程序,指定为声音处理软件的,“阿西奥”,或“瓦萨皮”

  • 阿西奥™ 驱动程序不是预装在Windows上的®机器。使用“阿西奥”驱动程序选项,在MATLAB外部安装ASIO驱动程序®

    笔记

    如果司机被指定为“阿西奥”,使用asiosettings将声卡缓冲区大小设置为您的缓冲区大小音频设备编写器系统对象。

  • WASAPI驱动程序仅在独占模式下受支金宝app持。

ASIO和WASAPI驱动程序不提供样本速率转换。对于ASIO和WASAPI驱动程序,设置SampleRate到您的音频设备支持的采样率。金宝app

此属性仅适用于Windows计算机。Linux®机器总是使用ALSA驱动程序。Mac机器总是使用CoreAudio驱动程序。

指定非默认值的步骤司机值,则必须具有音频工具箱™许可证。如果工具箱未安装,请指定非默认司机值返回一个错误。

数据类型:字符|字符串

用于播放音频样本的设备,指定为字符向量或字符串标量。使用getAudioDevices列出所选驱动程序的可用设备。

数据类型:字符|字符串

发送到音频设备的信号采样率,以Hz为单位,指定为正整数SampleRate取决于您的音频硬件。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

设备使用的数据类型,指定为字符向量或字符串标量。在进行数模转换之前,将输入数据转换为指定的数据类型BitDepth

指定非默认值BitDepth,则必须有“音频工具箱”许可证。如果工具箱未安装,请指定非默认值BitDepth返回一个错误。

数据类型:字符|字符串

选项支持可变的帧大小金宝app,指定为真正的错误的

  • 错误的——如果音频设备编写器对象被锁定时,每次调用的输入必须具有相同的帧大小。音频设备的缓冲区大小与输入帧大小相同。

  • 真正的——如果音频设备编写器对象被锁定时,输入帧的大小可以在每次调用时改变。属性指定音频设备的缓冲区大小缓冲区大小所有物

数据类型:字符

音频设备的缓冲区大小,指定为正整数。

笔记

如果司机被指定为“阿西奥”,打开ASIO UI设置声卡缓冲区大小为缓冲区大小你的价值音频设备编写器系统对象。

依赖关系

若要启用此属性,请设置金宝appSupportVariableSizeInput真正的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

输入矩阵的列与音频输出设备的通道之间的映射源,指定为“汽车”“属性”

  • “汽车”–默认设置确定输入矩阵的列与音频输出设备的通道之间的映射。例如,假设您的输入是一个包含四列的矩阵,并且您的音频设备有四个可用通道。输入数据的第1列写入设备的通道1,输入数据的第2列写入设备的通道2您的设备,等等。

  • “属性”——这是ChannelMapping属性确定输入矩阵列和音频输出设备通道之间的映射。

数据类型:字符|字符串

输入矩阵列和输出设备通道之间的非默认映射,指定为有效通道索引的标量或向量。看到为audioDeviceWriter指定通道映射有关更多信息,请参见示例。

要有选择地在输入矩阵的列和声卡的输出通道之间进行映射,您必须有一个Audio Toolbox许可证。如果工具箱未安装,请指定非默认值ChannelMapping返回一个错误。

笔记

要确保立体声设备仅在一个通道上进行单声道输出,请使用默认设置ChannelMapping设置并提供一个立体声信号,其中一个通道都是零。

例子:outputLeftOnly=[x(:,1)个零(大小(x,1),1)];

例子:outputRightOnly = [zeros(size(x,1),1) x(:,1)];

依赖关系

若要启用此属性,请设置ChannelMappingSource“属性”

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

使用

描述

实例

numUnderrun= deviceWriter (audioToDevice)写一帧音频样本,audioToDevice,并返回自上次调用以来运行过的音频样本数量设备编写器

注意:当你呼叫音频设备编写器对象指定的音频设备设备属性已锁定。音频设备只能由一个用户锁定音频设备编写器在一个时间。要释放音频设备,请调用释放在你的音频设备编写器系统对象。

输入参数

全部展开

要写入设备的音频信号,指定为矩阵。矩阵的列被视为独立的音频通道。

如果audioToDevice是数据类型“双”“单一”,音频设备写入器剪辑范围[- 1,1]之外的值。对于其他数据类型,允许的输入范围是指定数据类型的[min, max]。

数据类型:||int16|int32|uint8

输出参数

全部展开

自上次调用以来音频设备写入程序队列运行不足的样本数设备编写器

数据类型:uint32

目标函数

若要使用对象函数,请将系统对象指定为第一个输入参数。例如,释放名为的系统对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

getAudioDevices 列出可用的音频设备
信息 获取音频设备信息
克隆 创建重复的系统对象
isLocked 确定系统对象在使用
释放 释放资源并允许更改系统对象属性值和输入特征
重置 使内部状态复位系统对象
一步 运行系统对象算法
设置 一次性为System对象设置任务

例子

全部折叠

读取MP3音频文件并通过默认音频输出设备播放。

创建一个音频文件读取器具有默认设置的对象。使用audioinfo函数返回包含有关音频文件信息的结构。

fileReader=dsp.AudioFileReader(“speech_dft.mp3”);fileInfo = audioinfo (“speech_dft.mp3”)
文件信息=结构体字段:文件名:'/mathworks/devel/bat/Bdoc21a/build/matlab/toolbox/dsp/dsp/speech_dft.mp3'压缩方法:'mp3'数字通道:1采样器:22050总采样数:112320持续时间:5.0939标题:[]注释:[]艺术家:[]比特率:64

创建一个音频设备编写器对象,并指定采样率。

deviceWriter = audioDeviceWriter (“SampleRate”, fileInfo.SampleRate);

调用设置减少音频流循环中初始化的计算负载。

设置(deviceWriter,零(fileReader.sampleperframe,fileInfo.NumChannels))

使用信息命令功能获取设备写入器的特征信息。

信息(deviceWriter)
ans=结构体字段:驱动程序:'ALSA' DeviceName: 'ALSAdefault' MaximumOutputChannels: 32

在音频流循环中,从文件中读取音频信号帧,并将帧写入设备。

~isDone(fileReader)audioData=fileReader();deviceWriter(audioData);终止

关闭输入文件并释放设备。

发布(fileReader)发布(deviceWriter)

延迟由于输出设备的缓冲是写入一帧数据的时间延迟。修改您的默认属性音频设备编写器系统对象™ 减少因设备缓冲区大小而导致的延迟。

创建一个音频文件读取器读取带有默认设置的音频文件的系统对象。

fileReader=dsp.AudioFileReader(“speech_dft.mp3”);

创建一个音频设备编写器系统对象,并指定与音频文件读取器匹配的采样率。

deviceWriter = audioDeviceWriter (...“SampleRate”, fileReader.SampleRate);

计算由于您的设备缓冲区的延迟,以秒为单位。

bufferLatency = fileReader.SamplesPerFrame / deviceWriter.SampleRate% #好吧
缓冲延迟=0.0464

设置SamplesPerFrame你的财产音频文件读取器系统对象为256。以秒为单位计算缓冲延迟。

fileReader。SamplesPerFrame = 256;bufferLatency = fileReader.SamplesPerFrame / deviceWriter.SampleRate
bufferLatency = 0.0116

暗流指输出信号沉默,当音频流循环与输出设备不同步时发生。确定音频流循环的欠运行,向音频流循环添加人工计算负载,然后修改音频设备编写器对象以减少欠运行。你的成绩取决于你的电脑。

创建一个音频文件读取器对象,并指定要读取的文件。使用audioinfo函数返回包含有关音频文件信息的结构。

fileReader=dsp.AudioFileReader(“speech_dft.mp3”);fileInfo = audioinfo (“speech_dft.mp3”);

创建一个音频设备编写器对象。使用SampleRate文件读取器的SampleRate设备写入器的。调用设置减少音频流循环中初始化的计算负载。

deviceWriter = audioDeviceWriter (“SampleRate”, fileReader.SampleRate);设置(deviceWriter,零(fileReader.sampleperframe,fileInfo.NumChannels))

运行您的音频流循环从文件输入和输出到设备。以秒为单位打印总样本运行次数和运行次数。

totalUnderrun = 0;~isDone(fileReader)input=fileReader();numUnderrun=deviceWriter(input);totalUnderrun=totalUnderrun+numUnderrun;终止fprintf('未运行的总样本:%d.\n'totalUnderrun)
未运行的样本总数:0。
fprintf('运行总秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
总落后秒:0。

释放你的音频文件读取器音频设备编写器对象,并将计数器变量设置为零。

release(fileReader) release(deviceWriter) totalUnderrun = 0;

使用暂停来模拟一个需要0.075秒处理的算法。暂停会导致音频流循环比设备慢,从而导致输出音频信号出现一段时间的沉默。

~isDone(fileReader)input=fileReader();numUnderrun=deviceWriter(input);totalUnderrun=totalUnderrun+numUnderrun;暂停(0.075)终止fprintf('未运行的总样本:%d.\n'totalUnderrun)
欠检样本总数:71680个。
fprintf('运行总秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
欠载总秒数:3.250794e+00。

释放你的audioDeviceReaderdsp。AudioFileWriter并将计数器变量设置为零。

release(fileReader) release(deviceWriter) totalUnderrun = 0;

将音频流循环的帧大小设置为2048。因为金宝appSupportVariableSizeInput你的财产音频设备编写器系统对象设置为错误的,音频设备的缓冲区大小与输入帧大小相同。增加设备缓冲区大小会减少欠载。

fileReader=dsp.AudioFileReader(“speech_dft.mp3”);fileReader.sampleperframe=2048;fileInfo=audioinfo(“speech_dft.mp3”); deviceWriter=音频设备编写器(“SampleRate”, fileReader.SampleRate);设置(deviceWriter,零(fileReader.sampleperframe,fileInfo.NumChannels))

计算总潜流。

~isDone(fileReader)input=fileReader();numUnderrun=deviceWriter(input);totalUnderrun=totalUnderrun+numUnderrun;暂停(0.075)终止fprintf('未运行的总样本:%d.\n'totalUnderrun)
未运行的样本总数:0。
fprintf('运行总秒数:%d.\n'双(totalUnderrun) /双(deviceWriter.SampleRate))
总落后秒:0。

增加的帧大小减少了音频流循环的总滞后运行。然而,增加帧大小也会增加延迟。其他减少underrun的方法包括:

  • 增加独立于输入帧大小的缓冲区大小。要增加独立于输入帧大小的缓冲区大小,您必须首先设置金宝appSupportVariableSizeInput真正的.这种方法还会增加延迟。

  • 降低采样率。降低采样率以降低信号分辨率为代价降低了延迟和欠运行。

  • 为您的系统选择一个最佳的驱动程序和设备。

对象的非默认通道映射音频设备编写器对象。这个示例是特定于硬件的。它假定您的计算机具有带有两个可用通道的默认音频输出设备。

创建一个音频设备编写器对象的默认设置。

deviceWriter = audioDeviceWriter;

默认情况下,音频设备编写器对象写入与输入矩阵的列相对应的最大可用通道数。使用信息获取设备的最大通道数。

信息(deviceWriter)
ans=结构体字段:驱动程序:“DirectSound”设备名称:“主要声音驱动程序”最大输出通道:2

如果设备编写器用一列数据调用时,两个通道被写入音频输出设备。两个通道都对应于一列数据。

使用audioOscillator对象将音调输出到您的音频设备编写器对象。你的对象,sineGenerator,在调用时返回一个vector。

正弦发生器=音频振荡器;

将正弦音写入音频设备。如果你使用耳机,你可以听到两个频道的音调。

数= 0;count < 500 sin = sineGenerator();deviceWriter (sin);Count = Count + 1;终止

如果你的音频设备编写器对象的两列数据被调用,两个通道被写入音频输出设备。第一列对应于音频输出设备的通道1,第二列对应于音频输出设备的通道2。

写一个两列矩阵到您的音频输出设备。第一列对应正弦信号,第二列对应静态信号。如果你使用耳机,你可以听到一个扬声器的声音和另一个扬声器的静电声。

数= 0;count < 500 sin = sineGenerator();静态= randn(长度(sin), 1);deviceWriter ((sin,静态));Count = Count + 1;终止

通过在对应于输入列的索引处指示输出通道号,指定设备通道和输出矩阵列之间的替代映射。集ChannelMappingSource“属性”。指示输入数据的第一列写入输出设备的通道2,第二列写入输出设备的通道1。若要修改通道映射,必须首先解锁audioDeviceReader对象。

发布(deviceWriter)deviceWriter.ChannelMappingSource=“属性”;deviceWriter。ChannelMapping = (2, 1);

播放您的音频信号与反向映射。如果您使用耳机,请注意音调和静态已经切换扬声器。

数= 0;count < 500 sin = sineGenerator();静态= randn(长度(sin), 1);deviceWriter ((sin,静态));Count = Count + 1;终止

扩展功能

R2016a中引入