Objective C变量值未被保留

时间:2012-10-27 01:56:16

标签: objective-c ios c audio core-audio

我正在为客户做一些音频编程,我遇到了一个我不明白的问题。

我有一个渲染回调,由CoreAudio重复调用。在这个回调中我有以下内容:

// Get the audio sample data
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;

Float32 data;

// Loop over the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) {

    // Convert from SInt16 to Float32 just to prove it's possible
    data = (Float32) outA[frame] / (Float32) 32768;

    // Convert back to SInt16 to show that everything works as expected
    outA[frame] = (SInt16) round(next * 32768);

}

这符合预期,表明没有任何意外的舍入错误。

我要做的下一件事是增加一点延迟。我在类中添加了一个全局变量:

即。在@implementation行

下面
Float32 last = 0;

然后我使用这个变量来获得一帧延迟:

// Get the audio sample data
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;

Float32 data;
Float32 next;

// Loop over the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++) {

    // Convert from SInt16 to Float32 just to prove it's possible
    data = (Float32) outA[frame] / (Float32) 32768;

    next = last;
    last = data;


    // Convert back to SInt16 to show that everything works as expected
    outA[frame] = (SInt16) round(next * 32768);

}

这一次,信号上出现了奇怪的音频失真。

我只是看不出我做错了什么!任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

您所做的事情似乎会对音频产生无意的phaser影响。

这是因为你只是延迟了一个音频通道,结果就是你让左通道在右通道后面延迟了一帧。这将导致一些奇数频率取消/放大,适合您对“奇怪的音频失真”的描述。

尝试将效果应用于两个频道:

AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;
AudioSampleType *outB = (AudioSampleType *)ioData->mBuffers[1].mData;
// apply the same effect to outB as you did to outA

这假设您正在使用立体声音频(即ioData->mNumberBuffers == 2

作为一种风格问题,(IMO)在渲染回调中使用像last变量这样的全局变量是个坏主意。使用inRefCon传递适当的上下文(如果需要,可以作为单个变量或作为结构)。不过,这可能与您遇到的问题无关。