波形捕获:(1)列举"捕获设备"
假如你的应用措施只是纯真得通过用户首选设备用来捕获声音,那就没有必 要来列举可用的设备。当你通过挪用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被列举出来的。