2

入力デバイスからオーディオ ストリームを読み取り、NAudio を使用して出力デバイスに送信するプログラムを実装しています。そのために、入力ストリームWaveInとそのDataAvailableイベントを使用してデータを取得します。データを書き込むために、 を使用しようとしていますWaveOut。これは、 の実装を使用する必要があることも意味しますIWaveProvider。私のニーズに合わせてそれを実装することは、キューを使用して非常に簡単に思えます。ただし、キューが空でRead()メソッドが呼び出されるとどうなるでしょうか。ドキュメントでこれについて何も見つかりませんでした。私が持っていると思うオプション:

  1. 一部のデータが利用可能になるまで、メソッドはブロックする必要があります。
  2. メソッドはすぐに 0 を返します。これは、現在利用できるデータがないことを示します。
  3. バッファーをゼロで埋めます。

オプション 1 または 2 を使用することを考えていましたが、オプション 3 を使用するBufferedWaveProvider(および内部WaveInProviderで使用する ) を見つけました。BufferedWaveProvider

問題は、その権利を推測したか、オプション 3 を使用する必要があるかということです。オプション 1 または 2 を使用するとどうなりますか? それはうまくいきますか?

4

1 に答える 1

3

Read メソッドは、サウンドカードが再生するためにより多くのデータを必要とするときに呼び出されます。ブロッキングは通常、適切なオプションではありません。これは、ドライバー自体からスレッドを使用している場合 (ASIO または関数コールバックを使用する WaveOut など) や、GUI スレッドを使用している場合 (WaveOut と Windows メッセージ コールバックを使用する場合) があるためです。

Read メソッドから 0 を返すことは「これが音声データの終わりです」という意味なので、0 を返すと再生が停止します。

したがって、オプション 3 は、ブロックしてはならないスレッドをブロックせず、再生を続行できるようにするための最良の選択です。

たとえば、Read メソッドのコンシューマーが WaveFileWriter である場合、オプション 1 で問題ありません (オプション 2 は、WAV ファイルへの書き込みをいつ停止するかを決定する方法によって異なります)。

于 2011-07-20T14:13:23.887 に答える