2017-07-19 63 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); 
}