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