我刚刚开始制作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转换为咬合阵列时出了问题,但我不太清楚是什么问题。