第三章 實驗平臺
3.5 D RIVER & S OFTWARE
3.5.5 DirectSound
目前視窗多媒體程式,大多運用DirectX 來設計,主要原因是因為透過 DirectX 的使用,程式可以直接與電腦本身的硬體溝通,以提升程式效能。
DirectSound 是 DirectX 中,提供 Wave 類型的音效處理介面,音效處理的觀 念如下:
1、 裝置物件(Device Object):DirectSound 裝置物件是在程式中呼叫 DirectX API 的函數來建立,它是一個代表程式所使用的音效輸出入 裝置的物件,在物件裝置之後才能進一步設定裝置的協調層級,建立 主緩衝區與次緩衝區。
2、 協調層級(Cooperative Level):Windows 是一個多工作業系統,在同一 時間可能會多程式用到相同的硬體資源,因此當音效裝置物件建立之 後,還要設定程式對於裝置的使用權限,也就是協調層級。
3、 主緩衝區(Primary Buffer):主緩衝區是用來儲存要播放聲音資料的記 憶體區域。當裝置物件建立時,主緩衝區便會自動產生。
4、 次緩衝區(Secondary Buffer):次緩衝區是儲存聲音資料記憶體區域,
可以有很多個,其中的聲音資料可被放置到主緩衝區來播放。依播放 格式設定次緩衝區的主要參數,如取樣頻率、每筆資料大小、一秒鐘 的資料量。
聲音 次緩衝區
複製
聲音 主緩衝區
播放
喇叭
圖24. DirectX-DirectSound 架構圖
載入資料到次緩衝區:
要將聲音載入到次緩衝區中,必須進行三個動作:鎖定次緩衝區、載入資料 到次緩衝區、解除鎖定次緩區。在此過程中鎖定次緩衝區的用意,是為了防止資 料尚未複製到次緩衝區之前的任何不當的存取動作。
靜態緩衝區與串流緩衝區:
靜態緩衝區與串流緩衝區均屬於次緩衝區,靜態緩衝區播放的聲音是短促 的、預定的聲音;如要播放連續不間斷的、非預定的聲音,則需設定串流緩衝區。
在實驗平臺的聲音輸入中,聲音輸出長度未定,輸入時間未定,因此將次緩衝區 宣告為串流緩衝區。靜態緩衝區與串流緩衝區設定不同之處在於dwFlags 旗標,
靜態緩衝區的 dwFlags 旗標設定為 DSBCAPS_STATIC;串流緩衝區的 dwFlags 旗標設定為DSBCAPS_GETCURRENTPOSTION2。
此外也也希望當程式切換到其他程式時,仍可繼續播放聲音,因此 dwFlags 旗標也須開啟DSBCAPS_GLOBALFOCUS。
緩衝區的播放設定要啟動 Loop 的功能。串流緩衝區複製資料到主緩衝區時 是用Ring Buffer 的方式,當資料複製已經達到串流緩衝區的底部時,會馬上由串 流緩衝區的起始點,重新複製新的資料給主緩衝區。
當播放命令啟動後,聲音資料不斷的由次緩衝區複製到主緩衝區,需要同步 進行資料的傳遞與緩衝區中現行播放位置的通知,如此載入資料到次緩衝區後,
即可馬上被複製到主緩衝區,將聲音播放出來,而不會有無法預測的 Delay。要 得知緩衝區中現在播放位置,有兩種方法可以用:定期詢問播放位置(Polling)以 及通知(Notification)。前者是主動的不斷的詢問目前位置,後者則是當播放位置 達到我們感興趣的位置,以訊號事件通知。
每次載入次緩衝區的資料固定為256Bytes 的倍數,宣告的次緩衝區大小宣告 成256 的倍數為 4096Bytes,資料輸入主機的速度與播放速率相同,均為 16KHz。
所以只要確定第一次寫入時的播放位置位於何處,之後將資料不斷的寫入,使用 次緩衝區的方式如同使用Ring Buffer, 當寫入的累計資料長度大於次緩衝區的大 小,將指標移到次緩衝區的起始處,把剩下的超過的資料長度再寫入,如此不斷 的重覆寫入資料即可。
雜訊源
. . . .
5cm
麥克風 37cm
5cm 37cm
語音訊號
反射面
60cm
60 度
圖25. 實驗環境說明-干擾源個數:1