如果你的應用程序只是單純得通過用戶首選設備用來捕捉聲音,那就沒有必 要來枚舉可用的設備。當你通過調用DirectSoundCaptureCreate8 或 DirectSoundFullDuplexCreate8方法來創建一個設備對象時,你可以聲明一個默 認設備。更多信息,請查看Creating the Capture Device Object。
枚舉操作在以下情況下是必須的:
1.你的應用程序所需的性能並不是所有設備都能滿提供。
2.你的應用程序需要2種或以上的設備。
3.你希望提供用戶選擇設備的功能。
枚舉為了實現三個目的:
1.指明哪些硬件是可用的。
2.為每一個設備提供了一個GUID(全局統一標識符)。
3.允許你為每一個枚舉出來的設備創建一個臨時設備對象,這樣你就可以獲 取設備的性能。
想要枚舉設備,你必須首先設置一個回調函數(在系統中這個函數將會在枚 舉每個設備時被調用一次)。你可以在這個函數內執行任何操作,你也可以給這 個函數隨意命名,但是你必須根據 DSEnumCallback 的原型聲明它。如果想要繼 續枚舉設備,那麼這個回調函數必須返回TRUE,否則返回FALSE。比如,在找到 一個滿足你要求性能的設備後。
一個回調函數的例子:
下面這個回調函數將每個枚舉出來的設備名添加到復選框中,並且將它的 GUID存儲為數據項。前三個參數由設備提供,第四個參數由 DirectSoundEnumerate函數傳入;這個參數能被用來傳遞任何32位的值,在本例 中則是這個復選框的窗口句柄。在Windows.h中定義的宏被用來向復選框中添加 字符串和數據。
Code
BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext ) { HWND hCombo = (HWND)lpContext; LPGUID lpTemp = NULL; if (lpGUID != NULL) // NULL only for "Primary Sound Driver". { if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL) { return(TRUE); } memcpy(lpTemp, lpGUID, sizeof(GUID)); } ComboBox_AddString(hCombo, lpszDesc); ComboBox_SetItemData(hCombo, ComboBox_FindString(hCombo, 0, lpszDesc), lpTemp ); free(lpTemp); return(TRUE); }
枚舉在包含復選框的對話框被初始化的時候啟動。假設 hCombo 是這個復選 框的句柄而 hDlg 是這個對話的句柄。
Code
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK) DSEnumProc,
(VOID*)&hCombo)))
{
EndDialog(hDlg,TRUE);
return(TRUE);
}
在這個例子中,復選框的句柄地址被傳遞到 DirectSoundEnumerate 中,而 DirectSoundEnumerate 則傳遞它到回調函數中。這個參數可以是任何你想在回 調函數中訪問的32位值。
第一個被枚舉出來的設備通常被稱為主聲音設備,此時這個回調函數的 lpGUID 參數為 NULL。這個設備代表了用戶在控制面板中設置的首選播放設備。 當用戶選擇設備時,它被單獨枚舉出來以便應用程序能夠輕松的將主聲音設備添 加到列表上。主設備也是通過它正確的名字和GUID被枚舉出來的。