调整AudioUnit Buffer的长度

时间:2011-02-01 13:46:28

标签: 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);

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

1 个答案:

答案 0 :(得分:8)

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

无论如何要记住两件事:

  1. 缓冲区长度仅在设备上发生变化,因此如果更改它并且在模拟器上看不出任何差异,请不要感到惊讶。
  2. 您无法获得任何缓冲区长度 - 这就是该属性被称为PreferredHardwareIOBufferDuration的原因。缓冲区大小始终为2的幂。
  3. 考虑到这一点,您是否考虑分配自己的缓冲区并累积它直到您拥有所需数量的样本?

    修改

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

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