调整AudioUnit Buffer的长度

Luk*_*kas 4 iphone buffer duration audiounit

我的问题涉及AudioUnits.为了设计iPhone的语音交换应用程序(使用Objective-C xCode),我使用本网站的RemoteIO audioUnit示例:

http://atastypixel.com/blog/using-remoteio-audio-unit/

audioUnit缓冲区的长度设置为256个样本.对于我的项目,我需要更多(约22050).引用的页面说明audioUnit缓冲区的长度可以像这样调整:

float aBufferLength = 0.005; // In seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
                        sizeof(aBufferLength), &aBufferLength);
Run Code Online (Sandbox Code Playgroud)

现在我的具体问题:上面的代码不适合上面提到的audioUnit,因为没有使用AudioSession,从未初始化,因此产生错误.除了"kAudioSessionProperty_PreferredHardwareIOBufferDuration"之外,还有其他可能的调整缓冲区持续时间吗?在这种情况下,文档并不十分有用......提前感谢Lukas.

Ita*_*atz 8

AudioSession使用RemoteIO音频单元定义和初始化没有问题,这就是设置所需缓冲区长度的方法.我有一些代码正是这样做的,但是我需要几个小时才能回到家里并发布它.您可以查看Apple的AurioTouch代码示例,或者等到我稍后发布.

无论如何要记住两件事:

  1. 缓冲区长度仅在设备上发生变化,因此如果您更改它并且在模拟器上看不到任何差异,请不要感到惊讶.
  2. 您无法获得任何缓冲区长度 - 这就是调用该属性的原因PreferredHardwareIOBufferDuration.缓冲区大小始终为2的幂.

考虑到这一点,您是否考虑分配自己的缓冲区并累积它直到您有所需的样本数量?

编辑

用于初始化音频会话的代码(应该在音频单元初始化之前进行):

OSStatus result;
result = AudioSessionInitialize(NULL, NULL, NULL, NULL);

UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory);

// set preferred buffer size
Float32 preferredBufferSize = .04; // in seconds
result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize);

// get actuall buffer size
Float32 audioBufferSize;
UInt32 size = sizeof (audioBufferSize);
result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize);

result = AudioSessionSetActive(true);
Run Code Online (Sandbox Code Playgroud)

您可以/应该result在每次通话后进行检查,以查找可能的错误.您可以阅读文档以AudioSessionInitialize获取更多信息,但传递NULL所有4个参数仍然有效.例如,如果需要建立中断侦听器回调,则应更改它.