Macos 与音频图形一起使用超级混响时,处理后的音频非常嘈杂
我在OSX上使用带音频图的超级混响效果。 我通过在输出音频单元的渲染回调中调用Macos 与音频图形一起使用超级混响时,处理后的音频非常嘈杂,macos,core-audio,objective-c++,audiounit,superpowered,Macos,Core Audio,Objective C++,Audiounit,Superpowered,我在OSX上使用带音频图的超级混响效果。 我通过在输出音频单元的渲染回调中调用reverb->process(在kAudioUnitSubType\u SystemOutput和kAudioUnitSubType\u DefaultOutput上测试) 混响效果有效,但产生的音频非常嘈杂。我尝试过不同的方法(调整采样器,使用额外的和归零的缓冲区等),但似乎没有帮助。有没有办法解决这个问题?Thx 简化代码: SuperpoweredReverb* reverb; OSStatus callba
reverb->process
(在kAudioUnitSubType\u SystemOutput
和kAudioUnitSubType\u DefaultOutput
上测试)
混响效果有效,但产生的音频非常嘈杂。我尝试过不同的方法(调整采样器,使用额外的和归零的缓冲区等),但似乎没有帮助。有没有办法解决这个问题?Thx
简化代码:
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*混响;
OSStatus回调(无效*不完整存储,
AudioUnitRenderActionFlags*\uu可为空的标志,
常量音频时间戳*inTimeStamp,
UInt32总线号,
UInt32 FrameScont,
音频缓冲列表*ioData)
{
对于(int i=0;imNumberBuffers;++i)
{
if(ioData->mBuffers[i].mData)
混响->过程(静态广播(ioData->mBuffers[i].mData),
静态(ioData->mBuffers[i].mData),
帧扫描);
}
返回noErr;
}
无效设置混响(无符号整数采样器,音频单元)
{
混响=新的超功率混响(采样器);
混响->启用(真);
混响->设置混音(0.5);
AudioUnitAddRenderNotify(单元、回调、空PTR);
}
结果表明,在音频图中,即使在同一频道上,回调也会多次调用,我做了以下更改(使用整数跟踪当前频道),现在它工作得非常好。(以下是简化代码)
SuperpoweredReverb*混响;
int spliter=0;
OSStatus回调(无效*不完整存储,
AudioUnitRenderActionFlags*\uu可为空的标志,
常量音频时间戳*inTimeStamp,
UInt32总线号,
UInt32 FrameScont,
音频缓冲列表*ioData)
{
spliter++;
对于(int i=0;imNumberBuffers;++i)
{
if(ioData->mBuffers[i].mData){
if(!(拆分器%ioData->mBuffers[i].mNumberChannels))
混响->过程(静态广播(ioData->mBuffers[i].mData),
静态(ioData->mBuffers[i].mData),
帧扫描);
}
}
返回noErr;
}
无效设置混响(无符号整数采样器,音频单元)
{
reverbUnit=新的超级能量Everb(采样器);
重新定义->启用(真);
混响->设湿(0.7);
AudioUnitAddRenderNotify(单元、回调、空PTR);
}
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);
}