在C ++中操作音频数据以用于DSP目的

时间:2010-12-09 15:21:33

标签: objective-c audio signal-processing core-audio

我希望这个问题不要太模糊。我正在尝试从这个Xcode项目中的音频缓冲区获取信息,并使用它来做一些DSP。

framebuffer指向一个值数组,我希望将其传递给函数,循环并最终插入原始缓冲区。该方法将起到声音过滤器或效果的作用。

也许为了让我的问题尽可能清楚,我们能得到一个子程序的例子,它会为缓冲区中的每个样本增加0.25吗?

到目前为止,这是代码:

static OSStatus playbackCallback(void *inRefCon, 
                                 AudioUnitRenderActionFlags *ioActionFlags, 
                             const AudioTimeStamp *inTimeStamp, 
                             UInt32 inBusNumber, 
                             UInt32 inNumberFrames, 
                             AudioBufferList *ioData) {   

EAGLView *remoteIOplayer = (EAGLView *)inRefCon;
for (int i = 0 ; i < ioData->mNumberBuffers; i++){
    //get the buffer to be filled

    AudioBuffer buffer = ioData->mBuffers[i];
    short *frameBuffer = (short*)buffer.mData;


        for (int j = 0; j < inNumberFrames; j++){
            // get NextPacket returns a 32 bit value, one frame.
                frameBuffer[j] = [[remoteIOplayer inMemoryAudioFile] getNextPacket];    
        }

        EAGLView* thisView = [[EAGLView alloc] init];

        [thisView DoStuffWithTheRecordedAudio:ioData];
        [thisView release];
        }

return noErr;
}

1 个答案:

答案 0 :(得分:2)

在iOS设备上尝试在音频回调中执行UI或Open GL内容是一个坏主意。您需要使用队列或fifos等来解耦回调和UI执行。

尝试在实时音频的内部循环中进行Objective C消息传递在设备性能方面也可能是一个非常糟糕的主意。坚持普通的C / C ++在性能关键的内部循环中效果更好。

此外,为音频数据添加常量可能只会导致听不见的DC偏移。