2017-07-19 68 views
2

我在OS X上使用与音频超能力图表混响效果 我做的是通过在输出音频单元的渲染回调调用reverb->process(上kAudioUnitSubType_SystemOutput测试使用和kAudioUnitSubType_DefaultOutput)。加工声音很嘈杂,当混响超能力与音频图形

混响效果奏效,但结果音频非常嘈杂。我尝试过不同的东西(调整采样率,使用额外的和归零的缓冲区等),但似乎没有帮助。有什么方法可以解决这个问题吗?谢谢。

简化的代码:

SuperpoweredReverb* reverb; 

OSStatus callback(void * inComponentStorage, 
        AudioUnitRenderActionFlags * __nullable flags, 
        const AudioTimeStamp * inTimeStamp, 
        UInt32 busNumber, 
        UInt32 framesCount, 
        AudioBufferList * ioData) 
{ 
    for (int i = 0; i < ioData->mNumberBuffers; ++i) 
    { 
     if (ioData->mBuffers[i].mData) 
      reverb->process(static_cast<float*>(ioData->mBuffers[i].mData), 
          static_cast<float*>(ioData->mBuffers[i].mData), 
          framesCount); 
    } 

    return noErr; 
} 

void setupReverb(unsigned int sampleRate, AudioUnit unit) 
{ 
    reverb = new SuperpoweredReverb(sampleRate); 
    reverb->enable(true); 
    reverb->setMix(0.5); 
    AudioUnitAddRenderNotify(unit, callback, nullptr); 
} 

回答

1

原来,在音频图表,回调将调用多次甚至在相同的信道,我提出了以下的变化(使用整数来跟踪当前信道)并将其现在工作得非常好。 (下面再次简化代码)

SuperpoweredReverb* reverbUnit; 
int spliter = 0; 

OSStatus callback(void * inComponentStorage, 
        AudioUnitRenderActionFlags * __nullable flags, 
        const AudioTimeStamp * inTimeStamp, 
        UInt32 busNumber, 
        UInt32 framesCount, 
        AudioBufferList * ioData) 
{ 
    spliter++; 
    for (int i = 0; i < ioData->mNumberBuffers; ++i) 
    { 
     if (ioData->mBuffers[i].mData) { 
      if (!(spliter % ioData->mBuffers[i].mNumberChannels)) 
       reverbUnit->process(static_cast<float*>(ioData->mBuffers[i].mData), 
            static_cast<float*>(ioData->mBuffers[i].mData), 
            framesCount); 
     } 
    } 

    return noErr; 
} 

void setupReverb(unsigned int sampleRate, AudioUnit unit) 
{ 
    reverbUnit = new SuperpoweredReverb(sampleRate); 
    reverbUnit->enable(true); 
    reverbUnit->setWet(0.7); 
    AudioUnitAddRenderNotify(unit, callback, nullptr); 
}