配置缓冲区列表以存储非交错音频数据?

时间:2012-05-09 06:07:53

标签: buffer core-audio audiounit audio-processing extaudiofile

我有一个回调,我试图从音频图中的远程I / O单元捕获音频。在我的回调中,我在AudioBufferList函数中有一个AudioUnitRender,我需要存储来自两个通道的非交错数据。

以下是上下文的代码段:

//audiounit render function inside of a callback    
OSStatus status;
        status = AudioUnitRender(THIS.ioUnit,    
                                 ioActionFlags,
                                 inTimeStamp,
                                 0,
                                 inNumberFrames,
                                 &bufferList);

//want to initialize and configure bufferList to store non-interleaved data from both channels
...

//write audio data to disk 
    OSStatus result;
        if (*ioActionFlags == kAudioUnitRenderAction_PostRender) {
            result =  ExtAudioFileWriteAsync(THIS.extAudioFileRef, inNumberFrames, &bufferList);
            if(result) printf("ExtAudioFileWriteAsync  %ld \n", result);}
        return noErr; 

有谁知道怎么做?

感谢。

2 个答案:

答案 0 :(得分:2)

你应该创建一个float**数组并在你的渲染回调中懒洋洋地初始化它,使其具有与传递时相同的缓冲区大小(根据需要进行实际绘制)。从那里你可以简单地复制到你需要的频道并在另一个频道中使用这些数据(我猜你正在制作一些需要在频道之间进行交互的效果)。

不幸的是,这必然是一个全局变量,但由于iOS中对AudioUnits的限制,你可能只需要忍受它。

答案 1 :(得分:0)

您的缓冲区列表应使用

进行初始化
myBufferList.mNumberBuffers = 2;

有关工作示例,请查看Apple的MixerHost示例。