• 沒有找到結果。

第三章 實驗平臺

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

相關文件