Share via


回應範例的運作方式

[與此頁面相關聯的功能Windows 媒體播放機 SDK是舊版功能。 它已被 MediaPlayer 取代MediaPlayer已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用MediaPlayer,而不是Windows 媒體播放機 SDK。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

程式碼會藉由配置足以包含延遲時間值所指定時間範圍內可轉譯的音訊資料量,來建立回應效果。 下列公式會計算緩衝區的大小,以位元組為單位:

緩衝區大小 = 延遲時間 * 取樣率 / 1000 * 區塊對齊

延遲時間以毫秒為單位。 取樣率和區塊對齊值會以一個顯示于一個顯示于其內。 取樣率以每秒樣本為單位;除以 1000 會產生每毫秒的樣本。 區塊對齊等於單聲道 (1 的通道數目乘積,2 表示身歷聲) ,而每個樣本的位數 (8 或 16 個) 除以每個位元組) 8 個 (位。

除了指向延遲緩衝區前端的指標變數之外,程式碼還會建立可移動的指標,以與 DoProcessOutput 函式中的處理迴圈同步處理緩衝區中的資料。 當可移動指標到達延遲緩衝區的結尾時,它會回到緩衝區的前端。 以此方式使用的緩衝區稱為迴圈緩衝區。

一旦延遲緩衝區存在,且Windows 媒體播放機已配置輸入緩衝區來提供音訊資料和輸出緩衝區來接收已處理的音訊資料,回應處理會繼續如下:

  1. 輸入迴圈,以允許在輸入緩衝區中處理每個音訊範例。
  2. 從輸入緩衝區擷取範例。 然後,將輸入緩衝區指標向前移至下一個範例,以準備下一個迴圈反復專案。
  3. 從延遲緩衝區擷取範例。
  4. 將範例從輸入緩衝區複製到從中擷取最後一個延遲樣本的相同位置。
  5. 將延遲緩衝區指標向前移動至下一個範例。 如果指標移動超過緩衝區的結尾,請將它移至緩衝區的前端。
  6. 結合來自輸入緩衝區的範例與延遲緩衝區中的範例。
  7. 將結果複製到輸出緩衝區。 然後,將輸出緩衝區指標向前移至下一個單元,以準備下一個迴圈反復專案。
  8. 重複執行,直到處理所有樣本為止。

當步驟 2 中擷取的輸入範例複製到步驟 4 中的延遲緩衝區時,它會保留在該處,直到可移動的指標逐步執行延遲緩衝區中的每個範例,最後回到相同的位置。 因為延遲緩衝區的大小是設計來對應到延遲時間,所以複製到延遲緩衝區的樣本與再次擷取的樣本之間的經過時間等於指定的延遲 (加上實際處理所導入的任何延遲) 。

當資料流程啟動時,在延遲時間經過之前,不會產生任何延遲資料。 因此,延遲緩衝區一開始必須包含無聲。 如果延遲緩衝區包含亂數據,使用者將會聽到白色雜訊,直到外掛程式產生足夠的延遲資料以覆寫整個延遲緩衝區為止。

Echo 範例概觀