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

2 回目の試行は最初の試行よりも正確です。各入力バッファーを個別にコピーする必要があります。ただし、copy メソッドの最後のパラメーターは、バッファー内のサンプル数ではなく、バイト数にする必要があります。これは通常、ASIO のビット深度に応じて、サンプルあたり 3 または 4 バイトになります。

于 2014-05-17T21:39:11.700 に答える