我的问题涉及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);
现在我的具体问题:上面的代码不适合上面提到的audioUnit,因为没有使用AudioSession,从未初始化,因此产生错误。 除了“kAudioSessionProperty_PreferredHardwareIOBufferDuration”之外,是否还有其他可能的调整缓冲区持续时间? 在这种情况下,文档并不十分有用...... 在此先感谢Lukas。
答案 0 :(得分:8)
使用AudioSession
音频单元定义和初始化RemoteIO
没有问题,这是设置所需缓冲区长度的方法。我有一些代码正是这样做的,但是我需要几个小时才能回到家里并发布它。您可以查看Apple的AurioTouch code-sample,或者等到我稍后发布。
无论如何要记住两件事:
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);
您可以/应该在每次通话后检查result
以查找可能的错误。
您可以阅读AudioSessionInitialize
的文档以获取更多信息,但是为所有4个参数传递NULL
仍然有效。例如,如果您需要建立中断监听器回调,则应该更改它。