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 软件被用来重新采样,从而根据硬件调整发送到音频单元回调的缓冲区的大小,如果应用程序请求电路板上实际编解码器芯片不支持的采样率。
这是对上一个问题的跟进:
我正在尝试找出可能设置 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 软件被用来重新采样,从而根据硬件调整发送到音频单元回调的缓冲区的大小,如果应用程序请求电路板上实际编解码器芯片不支持的采样率。