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