簡介
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方式的設備協調級別,因為該協調級別不允許進行主緩衝區的格式修改。
次緩衝區
次緩衝區用來裝入實際的聲音數據,因此,必須根據實際的聲音檔案大小,創建一個相應大小的次緩衝區。