Обработанный звук очень шумный при использовании Superpowered Reverb с Audio Graph

Я использую эффект Superpowered Reverb с Audio Graph в 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);
}

person Yuji    schedule 19.07.2017    source источник


Ответы (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);
}
person Yuji    schedule 20.07.2017