我希望这个问题不要太模糊。我正在尝试从这个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;
}
答案 0 :(得分:2)
在iOS设备上尝试在音频回调中执行UI或Open GL内容是一个坏主意。您需要使用队列或fifos等来解耦回调和UI执行。
尝试在实时音频的内部循环中进行Objective C消息传递在设备性能方面也可能是一个非常糟糕的主意。坚持普通的C / C ++在性能关键的内部循环中效果更好。
此外,为音频数据添加常量可能只会导致听不见的DC偏移。