FMOD,用于录音的自定义DSP,如何?

时间:2017-07-05 19:46:05

标签: c# fmod

所以我对FMOD很新。我正在使用视频编码器进行游戏,基本上我将帧缓冲区和音频缓冲区发送到我的原生dll,它通过ffmpeg对其进行编码。现在,我正在尝试获取每个“音频帧”的音频缓冲区以及执行此操作的方式,因为我理解它是通过创建自定义DSP,将其附加到头部(或之前)并复制缓冲区。 / p>

所以这是我的代码(它是c#):

自定义DSP:

FMOD.ChannelGroup master;
lowlevelSystem.getMasterChannelGroup(out master);
master.getDSP(0, out mixerHead);
mixerHead.setMeteringEnabled(false, true);

// Trying to get a custom DSP in to FMOD to record audio for video
FMOD.RESULT res = FMOD.RESULT.OK;
uint dspHandle;
FMOD.DSP_DESCRIPTION dspDesc = FMOD_AudioRecodingDSP.CreateDSPDesc(out DSPObject);
res = lowlevelSystem.registerDSP(ref dspDesc, out dspHandle);
res = lowlevelSystem.createDSP(ref dspDesc, out AudioRecordingDSP);

// Try 1
//res = master.addDSP(0, AudioRecordingDSP);
//

// Try 2
FMOD.DSP limiterDSP;
res = master.getDSP(1, out limiterDSP);

FMOD.DSPConnection conType;
res = AudioRecordingDSP.addInput(limiterDSP, out conType, FMOD.DSPCONNECTION_TYPE.SIDECHAIN);

res = AudioRecordingDSP.setActive(true);
res = AudioRecordingDSP.setBypass(false);

我的“添加DSP”代码:

Today’s Cleaner Markup Topic: Client IDs

你可以选择我的“尝试1”和“尝试2”...当我使用“尝试1”时,我会在启动时调用我的DSP几次,然后停止调用它。 (这对我来说是最令人困惑的事情) 使用“试用2”,我的DSP永远不会被称为......

我尝试过所有不同的连接类型(STANDARD,SIDE_CHAIN,SEND ......)

那我错过了什么?我理解它是否正确?

提前致谢!!

1 个答案:

答案 0 :(得分:0)

所以我发现了问题。 DSP被定义为托管内存中的对象(在C#中):

public class FMOD_AudioRecodingDSP
{
    public static DSP_DESCRIPTION CreateDSPDesc(out FMOD_AudioRecodingDSP dspObj)
    {
        dspObj = new FMOD_AudioRecodingDSP();
        var desc = new DSP_DESCRIPTION();

        return desc;
    }
}

但是对FMOD的调用是本机调用,我没有保留对我的FMOD_AudioRecodingDSP对象实例的引用。因此GC最终删除了该实例。解决方案是使类静态,并将函数指针传递给静态函数。