OSX:用于设置 IO 缓冲区长度的 CoreAudio API?

Posted

技术标签:

【中文标题】OSX:用于设置 IO 缓冲区长度的 CoreAudio API?【英文标题】:OSX: CoreAudio API for setting IO Buffer length? 【发布时间】:2016-04-11 10:47:08 【问题描述】:

这是对上一个问题的跟进: OSX CoreAudio: Getting inNumberFrames in advance - on initialization?

我正在试图弄清楚 AudioUnit API 可能设置 inNumberFramespreffered IO 缓冲区持续时间 的输入回调OSX 中的单个 HAL 音频组件实例(不是插件!)。 虽然我知道有一个关于如何在 ios 中通过 AVAudioSession API 实现这一点的综合文档,但我既无法弄清楚也找不到关于在OSX,无论哪个 API。 网络上充斥着专家但相互矛盾的陈述,从“有一个音频单元 API 可以请求采样率和首选的缓冲持续时间......”,到“你绝对可以得到帧数,但仅适用于当前回调调用..."。

有没有办法至少获得(并适应)系统提供的 inNumberFrames音频缓冲区长度,用于OSX 中输入选择的采样率?例如,对于 44.1k 及其倍数(这似乎部分起作用),以及对于 48k 及其倍数(这似乎根本不起作用,我不知道允许调整缓冲区的 hack 在哪里这些值的长度)?这是控制台打印输出:

Available 7 Sample Rates
Available Sample Rate value : 8000.000000
Available Sample Rate value : 16000.000000
Available Sample Rate value : 32000.000000
Available Sample Rate value : 44100.000000
Available Sample Rate value : 48000.000000
Available Sample Rate value : 88200.000000
Available Sample Rate value : 96000.000000

.mSampleRate          =   48000.00
.mFormatID            = 1819304813
.mBytesPerPacket      = 8
.mFramesPerPacket     = 1
.mBytesPerFrame       = 8
.mChannelsPerFrame    = 2
.mBitsPerChannel      = 32
.mFormatFlags         = 9
_mFormatHumanReadable = kAudioFormatFlagIsFloat 
    kAudioFormatFlagIsPacked 
    kLinearPCMFormatFlagIsFloat 
    kLinearPCMFormatFlagIsPacked 
    kLinearPCMFormatFlagsSampleFractionShift 
    kAppleLosslessFormatFlag_16BitSourceData 
    kAppleLosslessFormatFlag_24BitSourceData 

expectedInNumberFrames = 512

Couldn't render in current context (Error -10863)

从系统中读取预期的 inNumberFrames:

UInt32 expectedInNumberFrames = 0;
UInt32 propSize = sizeof(UInt32);
AudioUnitGetProperty(gInputUnitComponentInstance,
                     kAudioDevicePropertyBufferFrameSize,
                     kAudioUnitScope_Global,
                     0,
                     &expectedInNumberFrames,
                     &propSize);

提前感谢您为我指明正确的方向!

【问题讨论】:

【参考方案1】:

请参阅此 Apple 技术说明:https://developer.apple.com/library/mac/technotes/tn2321/_index.html#//apple_ref/doc/uid/DTS40013499-CH1-THE_I_O_BUFFER_SIZE

请参阅本技术说明中有关 GetIOBufferFrameSizeRange()、GetCurrentIOBufferFrameSize() 和 SetCurrentIOBufferFrameSize() 的 OS X 示例代码。

请注意,有一个 API 属性会返回允许的范围,而属性设置器会返回错误。另请注意,各种 Mac 省电模式可能会在应用程序运行时改变缓冲区大小,因此实际缓冲区大小 inNumberFrames 可能不会保持不变,甚至在音频单元开始运行之前都不知道。

如果缓冲区大小异常(不是 2 的幂),则可能是特定 Apple 产品型号上的实际音频硬件具有固定或有限的音频采样率范围,因此操作系统软件被用于如果应用程序请求电路板上的实际编解码器芯片不支持的采样率,则重新采样并因此调整发送到音频单元回调的缓冲区的大小。

【讨论】:

非常感谢,@hotpaw2。我以前看过这个链接,但由于标题“在音频 I/O 期间节省电力 - kAudioHardwarePropertyPowerHint 属性”这个棘手的标题跑过它,而不是更仔细地关注这个 的内容总氮。非常感谢您指点我。我敢肯定,一旦我按照这个 TN 重写了代码,我还会有其他关于几个外部高端硬件设备的问题。我会接受这个问题的“最能帮助我找到解决方案”的答案。

以上是关于OSX:用于设置 IO 缓冲区长度的 CoreAudio API?的主要内容,如果未能解决你的问题,请参考以下文章

在 Chromecast 上将缓冲区长度设置为 HLS 流

sh 一个osx-for-hackers的分支,用于我个人的测试设置偏好

java NIO

用于创建大型 CSV 文件的 java IO 最佳实践

java IO,bufferedReader类

您如何找到音频延迟? (Windows/OSX)