我使用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
的過沖。也許有一個我可以使用的功能?或者其他一些常用的算法來實現這一點?