我正在尝试编写自己的VST主机,为此我需要录制和播放Asio驱动程序的音频(在我的情况下是音频接口)。这就是为什么我试图使用NAudio的AsioOut。
出于测试目的,我目前只是尝试录制输入,复制并播放输出。
我的代码如下所示:
var asioout = new AsioOut();
BufferedWaveProvider wavprov = new BufferedWaveProvider(new WaveFormat(44100, 2));
asioout.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(asio_DataAvailable);
asioout.InitRecordAndPlayback(wavprov, 2, 25);
asioout.Play();
...
void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
{
Array.Copy(e.InputBuffers, e.OutputBuffers, e.InputBuffers.Length);
e.WrittenToOutputBuffers = true;
}
这样我就听不到任何输出。我也是这样试过的:
void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
{
byte[] buf = new byte[e.SamplesPerBuffer];
for (int i = 0; i < e.InputBuffers.Length; i++)
{
//Marshal.Copy(e.InputBuffers[i], e.OutputBuffers, 0, e.InputBuffers.Length);
//also tried to upper one but this way i also couldn't hear anything
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer);
}
e.WrittenToOutputBuffers = true;
}
通过这种方式,我可以听到输入音量的声音,但它非常笨拙。
我在这里做错了什么?
PS:我知道how to record and playback....存在,但我无法从这个帖子中得到完整的答案,只是想用Marshall.Copy来尝试....
答案 0 :(得分:0)
您的第二次尝试比第一次更正确:必须单独复制每个输入缓冲区。但是,复制方法的最后一个参数应该是字节数,而不是缓冲区中的样本数。每个样本通常为3或4个字节,具体取决于您的ASIO位深度。