2

DirectSound の DirectSoundBuffer を使用して、ネットワーク経由でストリーミングしている音声データを再生しています。音声/スピーチの性質は、必ずしも常にストリーミングされるとは限らず (開始と停止)、さまざまなパケット サイズになる可能性もあります (これにより、バッファーがどこで停止するかを予測することが難しくなります)。バッファ内のどこまで書き込んだかを追跡するStoppingPoint変数を保持しています (このバッファの循環的な性質も考慮されています)。に達したらStoppingPoint、バッファの再生を停止したいと思います。また、私StoppingPointも書き始めたいポイントを意味します。

My buffer
|==============================|--------------------------|
      ^                        ^             ^
      |                        |             |
  Voice Data            Stopping point   Old/Garbage
                                            data

また、通知を使用するにはバッファを停止する必要があるため、通知を使用できません。しかし、私の場合、バッファの再生中にさらに多くのデータが入ってくる可能性が非常に高いため、'StoppingPoint' 値が押し戻されます。

私が現在持っているのは、フレームごとに呼び出される関数です。この関数は、とりわけ、再生カーソルがどこにあるかをチェックしています。再生カーソルがそのStoppingPoint場所を通過すると、バッファが停止し、再生カーソルがそのStoppingPoint場所に戻ります。これは今のところ問題なく動作しているように見えますが、ご想像のとおり、再生カーソルがStoppingPoint. これは、ストリーミングされたデータの最後に到達するたびに、少し古い/ガベージ データが再生されることを意味します。

特定のオフセットで DirectSoundBuffer の再生を停止する方法があるかどうかに興味がありますか? 私が望むのは、バッファにデータを書き込んでから再生し、それStoppingPointをオーバーシュートすることなく、変数によって記述された場所で正確に停止させることです。

注: これは必要な高レベルのソリューションであるため、コードは含めていません。私の実装は信じられないほど簡単で、典型的であり、ほとんどの場合、機能します。のオーバーシュートを取り除くために、正しい方向に微調整する必要がありますStoppingPoint。もしかしたら使える機能があるのでは?または、これを達成するために一般的に使用される他のアルゴリズムはありますか?

4

1 に答える 1