Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 与音频图形一起使用超级混响时,处理后的音频非常嘈杂_Macos_Core Audio_Objective C++_Audiounit_Superpowered - Fatal编程技术网

Macos 与音频图形一起使用超级混响时,处理后的音频非常嘈杂

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

我在OSX上使用带音频图的超级混响效果。 我通过在输出音频单元的渲染回调中调用
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);
}