我正在使用 DirectSound 的 DirectSoundBuffer 播放通过网络传输的语音数据。语音/语音的本质是它不一定不断地流式传输(它开始和停止),它也可以以不同的数据包大小出现(这使得很难预测缓冲区应该停止的位置)。我保留一个StoppingPoint
变量来跟踪我在缓冲区中写入的位置(它还考虑了该缓冲区的循环性质)。如果StoppingPoint
达到,我想停止播放我的缓冲区。另外,我StoppingPoint
还要指出我也想从哪里开始写作。
My buffer
|==============================|--------------------------|
^ ^ ^
| | |
Voice Data Stopping point Old/Garbage
data
另外,我不能使用通知,因为为了使用通知,必须停止缓冲区。但就我而言,当缓冲区播放时,很可能会有更多数据进入,从而推回我的“StoppingPoint”值。
我现在拥有的是一个每帧都调用的函数。除其他外,此功能正在检查播放光标的位置。如果播放光标经过该StoppingPoint
位置,它会停止缓冲区,并将播放光标移回该StoppingPoint
位置。到目前为止,这似乎工作正常,但正如您所料,Play 光标经常超过StoppingPoint
. 这意味着每次到达流数据的末尾时都会播放一些旧/垃圾数据。
我只是好奇是否有办法在特定偏移处停止播放 DirectSoundBuffer?我想要的是将数据写入缓冲区,然后播放,然后让它精确地停在我的StoppingPoint
变量描述的位置而不会超出它。
注意:我没有包含任何代码,因为这更像是我需要的高级解决方案。我的实现非常简单、典型,并且在大多数情况下它确实有效。我只需要朝正确的方向轻推即可消除我的StoppingPoint
. 也许有一个我可以使用的功能?或者其他一些常用来实现这一点的算法?