2017-07-19 7 views
2

J'utilise effet superpowered Reverb avec Graph Audio sur Mac OS X. je fais qu'en appelant reverb->process dans le rappel rendu d'une unité audio de sortie (testé sur kAudioUnitSubType_SystemOutput et kAudioUnitSubType_DefaultOutput).audio traités très bruyant lorsque superpowered Reverb utilisé avec Audio Graph

L'effet de réverbération a fonctionné mais le son résultant est très bruyant. J'ai essayé différentes choses (ajuster le samplerate, utiliser des tampons supplémentaires et mis à zéro, etc.) mais cela ne semble pas aider. Y a-t-il des moyens de résoudre cela? THX.

Code simplifié:

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); 
} 

Répondre

1

Active que dans le graphique audio, le rappel appellera plusieurs fois même sur le même canal, j'ai fait les modifications suivantes (en utilisant un entier pour suivre le canal en cours) et travailler awesomely bien maintenant. (ci-dessous est encore le code simplifié)

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); 
}