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

use*_*414 4 macos core-audio audiounit

这是上一个问题的后续问题: OSX CoreAudio:提前获取 inNumberFrames - 初始化时?

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

对于 OSX 中输入选择的采样率,是否有一种方法至少可以获取(并适应)系统提供的inNumberFrames音频缓冲区长度?例如,对于 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)
Run Code Online (Sandbox Code Playgroud)

从系统中读取预期的 inNumberFrames:

UInt32 expectedInNumberFrames = 0;
UInt32 propSize = sizeof(UInt32);
AudioUnitGetProperty(gInputUnitComponentInstance,
                     kAudioDevicePropertyBufferFrameSize,
                     kAudioUnitScope_Global,
                     0,
                     &expectedInNumberFrames,
                     &propSize);
Run Code Online (Sandbox Code Playgroud)

预先感谢您为我指明了正确的方向!

hot*_*aw2 5

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

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

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

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