当 Superpowered Reverb 与 Audio Graph 一起使用时,处理后的音频非常嘈杂
Processed audio very noisy when Superpowered Reverb used with Audio Graph
我在 OS X 上使用 Audio Graph 的 Superpowered Reverb 效果器。
我通过在输出音频单元的渲染回调中调用 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);
}
事实证明,在音频图中,即使在同一频道上,回调也会调用多次,我进行了以下更改(使用整数来跟踪当前频道),现在效果非常好。 (下面再次简化代码)
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);
}
我在 OS X 上使用 Audio Graph 的 Superpowered Reverb 效果器。
我通过在输出音频单元的渲染回调中调用 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);
}
事实证明,在音频图中,即使在同一频道上,回调也会调用多次,我进行了以下更改(使用整数来跟踪当前频道),现在效果非常好。 (下面再次简化代码)
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);
}