directsound

是DirectXAudio的較底層部件

DirectSound是DirectXAudio的一個較底層的部件,提供了豐富的介面函數,實現.wav格式的波形聲音數據的播放控制。

簡介


與一般的WindowsAPI提供的聲音播放函數不同,DirectSound可實現多個聲音的混合播放。DirectSound可充分使用音效卡的內存資源,同時也提供了3D聲效演演算法,模擬出真實的3D立體聲。
DirectSound的開發比較簡單,本章將詳細介紹DirectSound各個介面函數基礎。

創建對象


要取得次緩衝區,首先需要創建一個IDirectSound8介面對象。為此,調用DirectXAPI函數提供的DirectSoundCreate8進行創建。該函數用到DSound.h和Dsound.lib文件,如下是它的使用原型。
HRESULT DirectSoundCreate8(
LPCGUID lpcGuidDevice, //音效卡設備全局標誌,一般是NULL,表示默認的音效卡
LPDIRECTSOUND8 * ppDS8, //返回的IDirectSound8介面對象指針
LPUNKNOWN pUnkOuter //必須為NULL,因為集合不被支持
)
直觀地說,IDirectSound8對象代表音效卡設備。下面是利用DirectSoundCreate8函數創建IDirectSound8對象的示例代碼。

協調級別


總述
IDirectSound音效卡設備創建出來以後,需要調用DirectXAPI函數SetCooperativeLevel,進一步設置設備的協調級別,以決定音效卡設備以哪種方式與Windows其他程序分享。HRESULTSetCooperativeLevel
(
HWNDhwnd,//窗口句柄
DWORDdwLevel//協調級別
);
參數hwnd為當前應用程序的窗口句柄。dwLevel參數為協調級別,具有如下的幾個取值。
?
DSSCL_EXCLUSIVE
對於DirectX8.0以上版本,此標誌與DSSCL_PRIORITY具有相同的作用。對於以前的版本,此標誌設置音效卡設備為當前程序獨佔。
DSSCL_PRIORITY
具有優先設置DirectSound設備的許可權。例如,可調用IDirectSoundBuffer8介面SetFormat函數這隻主次緩衝區的播放形式。在此標誌下,DirectSound必然是獨佔的,否則不可能重新設置播放格式,因為其他使用該設備的程序是不知道新格式的。
DSSCL_NORMAL
正常的協調層級標誌,其他程序可共享音效卡設備進行播放。此標誌下,主緩衝區的播放格式不允許修改,而且會默認地在音效卡內存中申請到一個8bit和22KHz的單聲道主緩衝區。
DSSCL_WRITEPRIMARY
可寫主緩衝區,此時次緩衝區就不可能進行播放處理,即不能將次緩衝區的數據送進混聲器,再輸出到主緩衝區上。這是最完全控制聲音播放的方式,意味著音效卡的混音器被棄置,需要自行處理聲音混合。

主緩衝區


設備級別設置為DSSCL_NORMAL,將自動分配一塊音效卡內存作為主緩衝區,並使用雙聲道、8bit和22kHz方式進行聲音播放。因此,主緩衝區一般是現成的,可略去在音效卡內存中再進行主緩衝區的創建分配。
如果需要設置主緩衝區的新播放格式,則可調用IDirectSound8介面的CreateSoundBuffer函數,從音效卡內存中分配出緩衝區。當然,此時不能再使用DSSCL_NORMAL方式的設備協調級別,因為該協調級別不允許進行主緩衝區的格式修改。

次緩衝區


次緩衝區用來裝入實際的聲音數據,因此,必須根據實際的聲音文件大小,創建一個相應大小的次緩衝區。