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

OSX: CoreAudio API for setting IO Buffer length?

这是对上一个问题的跟进:

我正在尝试找出可能设置 inNumberFrames 或 [=25= 的 AudioUnit API OSX(不是插入!)。 虽然我知道有一个关于如何在 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);

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

查看此 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 属性 return 是一个允许的范围,属性 setter 上有一个错误 return .另请注意,各种 Mac 省电模式可能会在应用 运行 时更改缓冲区大小,因此实际缓冲区大小 inNumberFrames 可能不会保持不变,甚至在音频单元启动之前都是已知的 运行.

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