void CelloApp::buildDevicesPanel() { vector<ofSoundDevice> devices = PMAudioAnalyzer::getInstance().getInputDevices(); guiDevices.setup(STR_DEV_TITLE, DEVICE_SETTINGS_FILENAME); guiDevices.setPosition(GUI_MARGIN, GUI_MARGIN); for (int i=0; i<devices.size(); ++i) { if (devices[i].inputChannels < 2) continue; XBDeviceParams devParams(devices[i].deviceID, devices[i].name, devices[i].inputChannels); guiDevices.add(devParams.getParams()); deviceParams.push_back(devParams); } ofFile file(DEVICE_SETTINGS_FILENAME); if (file.exists()) file.remove(); guiDevices.loadFromFile(DEVICE_SETTINGS_FILENAME); guiDevices.add(lblStatus.setup(STR_DEV_STATUS, STR_DEV_STATUS_OFF)); lblStatus.setBackgroundColor(ofColor::darkRed); guiDevices.add(btnStartAnalysis.setup(STR_DEV_START)); btnStartAnalysis.addListener(this, &CelloApp::startButtonPressed); lblStatus.setDefaultWidth(GUI_DEV_WIDTH); guiDevices.setSize(GUI_DEV_WIDTH, GUI_DEV_WIDTH); guiDevices.setWidthElements(GUI_DEV_WIDTH); }
static int EnumDevices( PCNC_ENUM_FILTER pFilter, DWORD flags, PCNC_DEV_ROUTINE pDevRoutine, PEnumParams pEnumParams) { HDEVINFO hDevInfo; hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES|flags); if (hDevInfo == INVALID_HANDLE_VALUE) { ShowLastError(MB_OK|MB_ICONSTOP, "SetupDiGetClassDevs()"); return IDCANCEL; } SP_DEVINFO_DATA devInfoData; devInfoData.cbSize = sizeof(devInfoData); int res = IDCONTINUE; for (int i = 0 ; SetupDiEnumDeviceInfo(hDevInfo, i, &devInfoData) ; i++) { char hardwareId[40]; if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_HARDWAREID, NULL, (PBYTE)hardwareId, sizeof(hardwareId), NULL)) { memset(hardwareId, 0, sizeof(hardwareId)); SNPRINTF(hardwareId, sizeof(hardwareId)/sizeof(hardwareId[0]), "UNKNOWN HARDWAREID" "\0"); } if (!pFilter(hardwareId)) continue; const char *pHardwareId = hardwareId; if (pEnumParams->pDevProperties && pEnumParams->pDevProperties->DevId()) { while (lstrcmpi(pHardwareId, pEnumParams->pDevProperties->DevId()) != 0) { pHardwareId = pHardwareId + lstrlen(pHardwareId) + 1; if (!*pHardwareId) { pHardwareId = NULL; break; } } if (!pHardwareId) continue; } DevParams devParams(pEnumParams); if (!devParams.devProperties.DevId(pHardwareId)) { res = IDCANCEL; break; } char location[40]; if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_LOCATION_INFORMATION, NULL, (PBYTE)location, sizeof(location), NULL)) { if (!devParams.devProperties.Location(location)) { res = IDCANCEL; break; } } if (pEnumParams->pDevProperties && pEnumParams->pDevProperties->Location() && (!devParams.devProperties.Location() || lstrcmpi(devParams.devProperties.Location(), pEnumParams->pDevProperties->Location()))) { continue; } char name[40]; if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, NULL, (PBYTE)name, sizeof(name), NULL)) { if (!devParams.devProperties.PhObjName(name)) { res = IDCANCEL; break; } } if (pEnumParams->pDevProperties && pEnumParams->pDevProperties->PhObjName() && (!devParams.devProperties.PhObjName() || lstrcmpi(devParams.devProperties.PhObjName(), pEnumParams->pDevProperties->PhObjName()))) { continue; } res = pDevRoutine(hDevInfo, &devInfoData, &devParams); if (res != IDCONTINUE) break; } DWORD err = GetLastError(); SetupDiDestroyDeviceInfoList(hDevInfo); SetLastError(err); return res; }