1

我正在尝试编写自己的 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:我知道如何录制和播放....存在,但我无法从这个线程中得到完整的答案,只是想用 Marshall.Copy 尝试一下......

4

1 回答 1

0

您的第二次尝试比第一次更正确:必须单独复制每个输入缓冲区。然而,复制方法的最后一个参数应该是字节数,而不是缓冲区中的样本数。这通常是每个样本 3 或 4 个字节,具体取决于您的 ASIO 位深度。

于 2014-05-17T21:39:11.700 回答