DirectSound設(shè)備對象表示一個(gè)播放設(shè)備,它被用來管理設(shè)備和創(chuàng)建聲音緩沖區(qū)。
多個(gè)應(yīng)用程序能夠?yàn)橄嗤穆曇粼O(shè)備創(chuàng)建對象。當(dāng)輸入集中于應(yīng)用程序間的變化時(shí),音頻輸出自動(dòng)從一個(gè)應(yīng)用程序流轉(zhuǎn)換到其他應(yīng)用程序流。因此,當(dāng)輸入集中于變化時(shí),應(yīng)用程序不必反復(fù)地播放和暫停它們的緩沖區(qū)。
如果你的程序只是簡單地通過用戶首選設(shè)備來播放聲音,那么沒有必要去枚舉可用的設(shè)備。當(dāng)你通過調(diào)用 DirectSoundCreate8 函數(shù)創(chuàng)建設(shè)備對象時(shí),你能夠指定默認(rèn)設(shè)備。
枚舉設(shè)備在以下情形是必需的:
1.你的應(yīng)用程序需要的性能不是所有設(shè)備都能夠提供的。
2.你的應(yīng)用程序需要兩個(gè)或更多的設(shè)備。
3.你希望用戶能夠選擇設(shè)備。
枚舉設(shè)備有三個(gè)目的:
1.它指出可用的硬件設(shè)備。
2.它為每個(gè)設(shè)備提供了一個(gè) GUID。
3.它使你能夠在設(shè)備被枚舉的時(shí)候?yàn)樗鼊?chuàng)建一個(gè)臨時(shí)設(shè)備對象,這樣你能夠獲取設(shè)備的性能。
為枚舉設(shè)備,你必須首先創(chuàng)建一個(gè)回調(diào)函數(shù),它將在枚舉每個(gè)系統(tǒng)設(shè)備時(shí)被調(diào)用。你能夠在這個(gè)函數(shù)中進(jìn)行任何操作,并且你可以給它任意的函數(shù)名,但是你必須根據(jù) DSEnumCallback 的原型聲明它。如果要繼續(xù)進(jìn)行枚舉,那么回調(diào)函數(shù)必須返回 TRUE,否則返回FALSE-比如,在找到一個(gè)滿足你需求的設(shè)備后。
下面這個(gè)回調(diào)函數(shù)將每個(gè)枚舉到的設(shè)備名添加到一個(gè)復(fù)選框中,并將它的GUID 作為選項(xiàng)內(nèi)容。前三個(gè)參數(shù)值由設(shè)備驅(qū)動(dòng)器提供。第四個(gè)參數(shù)由 DirectSoundEnumerate 函數(shù)傳入;這個(gè)參數(shù)能被用于傳入任意32位的值,在這里則是復(fù)選框的窗口句柄。在Windowsx.h中定義的宏被用于向復(fù)選框中添加字符串和數(shù)據(jù)。
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);
}
枚舉在包含復(fù)選框的對話框被初始化時(shí)啟動(dòng)。假設(shè)hCombo 是復(fù)選框的句柄,hDlg 是對話框的句柄。
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,
(VOID*)&hCombo)))
...{
EndDialog(hDlg, TRUE);
return(TRUE);
}
這個(gè)例子中,復(fù)選框句柄的地址被傳入 DirectSoundEnumerate,隨后被傳入回調(diào)函數(shù)。這個(gè)參數(shù)可以是你希望在回調(diào)函數(shù)中訪問的任意32位值。
注意:第一個(gè)被枚舉到的設(shè)備通常稱為主要聲音設(shè)備,這時(shí)回調(diào)函數(shù)的參數(shù)lpGUID 為NULL。這個(gè)設(shè)備代表了用戶在控制面板中設(shè)置的首選播放設(shè)備。它被單獨(dú)枚舉出來是為了使應(yīng)用程序能夠方便地添加“主要聲音設(shè)備”到列表中,該列表用于為用戶提供設(shè)備選擇。主要設(shè)備也是通過特有的名字和GUID被枚舉的。
多個(gè)應(yīng)用程序能夠?yàn)橄嗤穆曇粼O(shè)備創(chuàng)建對象。當(dāng)輸入集中于應(yīng)用程序間的變化時(shí),音頻輸出自動(dòng)從一個(gè)應(yīng)用程序流轉(zhuǎn)換到其他應(yīng)用程序流。因此,當(dāng)輸入集中于變化時(shí),應(yīng)用程序不必反復(fù)地播放和暫停它們的緩沖區(qū)。
如果你的程序只是簡單地通過用戶首選設(shè)備來播放聲音,那么沒有必要去枚舉可用的設(shè)備。當(dāng)你通過調(diào)用 DirectSoundCreate8 函數(shù)創(chuàng)建設(shè)備對象時(shí),你能夠指定默認(rèn)設(shè)備。
枚舉設(shè)備在以下情形是必需的:
1.你的應(yīng)用程序需要的性能不是所有設(shè)備都能夠提供的。
2.你的應(yīng)用程序需要兩個(gè)或更多的設(shè)備。
3.你希望用戶能夠選擇設(shè)備。
枚舉設(shè)備有三個(gè)目的:
1.它指出可用的硬件設(shè)備。
2.它為每個(gè)設(shè)備提供了一個(gè) GUID。
3.它使你能夠在設(shè)備被枚舉的時(shí)候?yàn)樗鼊?chuàng)建一個(gè)臨時(shí)設(shè)備對象,這樣你能夠獲取設(shè)備的性能。
為枚舉設(shè)備,你必須首先創(chuàng)建一個(gè)回調(diào)函數(shù),它將在枚舉每個(gè)系統(tǒng)設(shè)備時(shí)被調(diào)用。你能夠在這個(gè)函數(shù)中進(jìn)行任何操作,并且你可以給它任意的函數(shù)名,但是你必須根據(jù) DSEnumCallback 的原型聲明它。如果要繼續(xù)進(jìn)行枚舉,那么回調(diào)函數(shù)必須返回 TRUE,否則返回FALSE-比如,在找到一個(gè)滿足你需求的設(shè)備后。
下面這個(gè)回調(diào)函數(shù)將每個(gè)枚舉到的設(shè)備名添加到一個(gè)復(fù)選框中,并將它的GUID 作為選項(xiàng)內(nèi)容。前三個(gè)參數(shù)值由設(shè)備驅(qū)動(dòng)器提供。第四個(gè)參數(shù)由 DirectSoundEnumerate 函數(shù)傳入;這個(gè)參數(shù)能被用于傳入任意32位的值,在這里則是復(fù)選框的窗口句柄。在Windowsx.h中定義的宏被用于向復(fù)選框中添加字符串和數(shù)據(jù)。
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);
}
枚舉在包含復(fù)選框的對話框被初始化時(shí)啟動(dòng)。假設(shè)hCombo 是復(fù)選框的句柄,hDlg 是對話框的句柄。
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,
(VOID*)&hCombo)))
...{
EndDialog(hDlg, TRUE);
return(TRUE);
}
這個(gè)例子中,復(fù)選框句柄的地址被傳入 DirectSoundEnumerate,隨后被傳入回調(diào)函數(shù)。這個(gè)參數(shù)可以是你希望在回調(diào)函數(shù)中訪問的任意32位值。
注意:第一個(gè)被枚舉到的設(shè)備通常稱為主要聲音設(shè)備,這時(shí)回調(diào)函數(shù)的參數(shù)lpGUID 為NULL。這個(gè)設(shè)備代表了用戶在控制面板中設(shè)置的首選播放設(shè)備。它被單獨(dú)枚舉出來是為了使應(yīng)用程序能夠方便地添加“主要聲音設(shè)備”到列表中,該列表用于為用戶提供設(shè)備選擇。主要設(shè)備也是通過特有的名字和GUID被枚舉的。

