2013-05-10 77 views
2

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

回答

0

我想出了一個解決方案,但我仍然對任何反饋或替代解決方案感興趣。我不確定我做的方式是否可行,但似乎正在產生預期的結果。雖然,我的解決方案感到有點費解......

1)每當我寫的數據,我現在在寫任何緩衝的Write CursorStoppingPoint - 以較晚者爲準。這是爲了避免停止,然後再寫入Play Cursor和Write Cursor之間的「不可觸摸的」空間,其數據已經專用於播放。

DWORD writeCursorOffset = 0; 
buffer->GetCurrentPosition(NULL, &writeCursorOffset); 

//if write cursor has passed stopping point, then we need to write from there. 
//So update m_StoppingPoint to reflect the new writing position. 
m_StoppingPoint = m_StoppingPoint > writeCursorOffset ? m_StoppingPoint : writeCursorOffset; 

2)我添加了一些沉默每一個寫入之後,但我離開StoppingPoint在實際的聲音數據的結束點。例如。

|==============================|*********|---------------------| 
    ^      ^ ^   ^
    |       |  |    | 
Voice data     Stopping Silence Old/Garbage 
          Point     Data 

3)如果緩衝區的Play Cursor通過StoppingPoint,然後,我會停止播放緩衝。即使Play Cursor在這裏超調,它所播放的只是沉默。

//error checking removed for demonstration purposes 
buffer->Stop(); 

4)停止I將更新StoppingPoint等於沉默的結束之後立即。這將確保當更多的語音數據進入時,緩衝區不會首先播放任何靜音。

//don't forget that modulo at the end - circular buffer! 
m_StoppingPoint = (m_StoppingPoint + SILENCE_BUFFER_SIZE) % BufferSize; 

|==============================|*********|-------------------| 
             ^
             | 
            Move Stopping 
             Point here 

再說一遍,如果我在這裏做了任何明顯的壞事,請告訴我!