2011-02-01 82 views
4

我的问题涉及AudioUnits。为了设计用于iPhone一个voicechanging应用程序(与目标C XCODE)我使用RemoteIO audioUnit样品从这个网站:调整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”之外,是否还有其他任何可调整缓冲区持续时间的可能性? 在这种情况下文档不是很有用... 在此先感谢,卢卡斯。

+0

我在我的回复中添加了相关代码。 – 2011-02-01 17:22:53

回答

7

使用RemoteIO音频单元定义和初始化AudioSession没有问题,这就是设置所需缓冲区长度的方法。我有一些代码正在做这件事,但它会花我几个小时,直到我回家并可以发布它。你可以看看苹果的AurioTouch code-sample,或等到我稍后发布。

反正记住两两件事:

  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个参数仍然有效。例如,如果您需要建立中断侦听器回调,则应该更改它。

+0

感谢您的有用答案!我会立即测试并发布我的经验。但是我很难相信缓冲区长度只会在设备上发生变化......如果一个连续的函数需要一个很长的缓冲区作为输入呢?这是否意味着它不会在模拟器中正常工作,但在iPhone上正常工作? – Lukas 2011-02-01 20:21:47