波形捕捉:(1)枚举"捕捉设备"2011-06-02 cnblogs stg609译如果你的应用程序只是单纯得通过用户首选设备用来捕捉声音,那就没有必 要来枚举可用的设备。当你通过调用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被枚举出来的。