VST.NET路由音频

时间:2014-04-19 16:38:50

标签: c# audio buffer naudio vst

我刚刚开始制作VST主机,为此我使用VST.NET库进行C#。现在,我试图在Line in,Plugins和Line Out之间创建路由。 我的计划是在主机中录制音频,并将录制的缓冲区(录制时不保存临时文件时生效)发送到第一个插件。第一个插件的输出(将是一个效果插件将转到下一个插件。在通过所有必要的插件路由后,它应该被路由到音频输出设备。

对于录音部分我已经看过NAudio并创建了像this这样的录音部分。现在我可以以字节数组的形式在我的isDataAvailable方法中获取音频缓冲区。问题是VST.NET使用ProcessReplacing方法(我认为)来处理插件的音频,这个方法需要一个VstAudioBuffer数组实例形式的缓冲区,而VstAudioBuffer的构造函数需要一个float *缓冲区。

现在我应该如何转换这些变量以将它们发送到插件?最后,我怎么能将它们转换回发送到WaveOut?

另一个问题:我可以调用plugin1.processreplacing将记录的数据发送到plugin1调用plugin2.processreplacing,参数inputBuffer是processreplacing的outputbuffer,调用plugin1将处理后的音频发送到plugin2吗?

我尝试修改链接中的示例并将其设为:

void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        if (waveProvider != null)
            waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
        int bytesRead = waveProvider.Read(naudioBuf,0,e.BytesRecorded);
        naudioBuf = e.Buffer;

        unsafe
        {
            fixed (byte* byteBuf = &naudioBuf[0])
            {
                float* floatBuf = (float*)byteBuf;
                for (int i = 0; i < e.BytesRecorded; i++)
                {
                    vstBufIn[0][i] = *(floatBuf + i);
                }
            }
        }

        cont.PluginCommandStub.MainsChanged(true);
        cont.PluginCommandStub.StartProcess();
        cont.PluginCommandStub.ProcessReplacing(vstBufIn, vstBufOut);
        cont.PluginCommandStub.StopProcess();
        cont.PluginCommandStub.MainsChanged(false);

        unsafe
        {
            float* tmpBufL = ((IDirectBufferAccess32)vstBufOut[0]).Buffer;
            byte[] buffer = BitConverter.GetBytes(*(tmpBufL));
            waveOutProv.AddSamples(buffer, 0, buffer.Length);
        }
    }

WaveIn和Out的设置如下所示:

        WaveIn waveIn = new WaveIn(this.Handle);
        waveIn = new WaveIn(this.Handle);
        waveIn.BufferMilliseconds = 25;
        waveIn.DataAvailable += waveIn_DataAvailable;

        waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
        waveOutProv = new BufferedWaveProvider(waveIn.WaveFormat);

        waveOut = new WaveOut();
        waveOut.DesiredLatency = 100;
        waveOut.Init(waveOutProv);

        waveIn.StartRecording();
        waveOut.Play();

        this.sampleRate = 44100;
        this.channels = 2;
        this.blockSize = 4410;

        cont.PluginCommandStub.SetBlockSize(blockSize);
        cont.PluginCommandStub.SetSampleRate((float)sampleRate);

        vstBufManIn = new VstAudioBufferManager(channels, blockSize * channels);
        vstBufManOut = new VstAudioBufferManager(channels, blockSize * channels);

        vstBufIn = vstBufManIn.ToArray();
        vstBufOut = vstBufManOut.ToArray();

        naudioBuf = new byte[blockSize * channels * 4];

我得到了一个输出,当麦克风中的输入响亮但它只是一个奇怪的咔嗒声&#34;时,它也会变大。我猜测我将vstBufOut转换为咬合阵列时出了问题,但我不太清楚是什么问题。

0 个答案:

没有答案