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.
AudioSession使用RemoteIO音频单元定义和初始化没有问题,这就是设置所需缓冲区长度的方法.我有一些代码正是这样做的,但是我需要几个小时才能回到家里并发布它.您可以查看Apple的AurioTouch代码示例,或者等到我稍后发布.
无论如何要记住两件事:
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个参数仍然有效.例如,如果需要建立中断侦听器回调,则应更改它.