4

我的问题涉及 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。

4

1 回答 1

8

AudioSession使用Audio-Unit定义和初始化 an 没有问题,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);

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

于 2011-02-01T14:37:47.373 回答