📄 main.cpp
字号:
}
if (CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, szServiceName, -1, TEXT("cmipci"), -1) == CSTR_EQUAL) {
return TRUE;
}
nIndex++;
}
SetupDiDestroyDeviceInfoList(pDev->Info);
pDev->Info = NULL;
return FALSE;
}
BOOL getDeviceInterfaceDetail(const GUID* category, CMIDEV* pDev)
{
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
DWORD dataSize = 0;
BOOL result;
PTSTR pnpStr = NULL;
HDEVINFO hDevInfoWithInterface;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
ULONG ulDeviceInterfaceDetailDataSize = 0;
// get the PnP string
SetupDiGetDeviceInstanceId(pDev->Info, &(pDev->InfoData), NULL, 0, &dataSize);
if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (!dataSize)) {
PrintLastError("SetupDiGetDeviceInstanceId()");
return FALSE;
}
pnpStr = (PTSTR)LocalAlloc(LPTR, dataSize * sizeof(TCHAR));
if (!pnpStr) {
PrintLastError("LocalAlloc()");
return FALSE;
}
result = SetupDiGetDeviceInstanceId(pDev->Info, &(pDev->InfoData), pnpStr, dataSize, NULL);
if (!result) {
PrintLastError("SetupDiGetDeviceInstanceId()");
LocalFree(pnpStr);
return FALSE;
}
hDevInfoWithInterface = SetupDiGetClassDevs(&KSCATEGORY_TOPOLOGY, pnpStr, NULL, DIGCF_DEVICEINTERFACE);
LocalFree(pnpStr);
if (hDevInfoWithInterface == INVALID_HANDLE_VALUE) {
PrintLastError("SetupDiGetClassDevs()");
return FALSE;
}
// get the device interface data
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
result = SetupDiEnumDeviceInterfaces(hDevInfoWithInterface, NULL, &KSCATEGORY_TOPOLOGY, 0, &DeviceInterfaceData);
if (!result) {
PrintLastError("SetupDiEnumDeviceInterfaces()");
SetupDiDestroyDeviceInfoList(hDevInfoWithInterface);
return FALSE;
}
// get the device interface detail data
dataSize = 0;
SetupDiGetDeviceInterfaceDetail(hDevInfoWithInterface, &DeviceInterfaceData, NULL, 0, &dataSize, NULL);
if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (!dataSize)) {
PrintLastError("SetupDiGetDeviceInterfaceDetail()");
SetupDiDestroyDeviceInfoList(hDevInfoWithInterface);
return FALSE;
}
pDev->InterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, dataSize);
if (!pDev->InterfaceDetailData) {
PrintLastError("LocalAlloc()");
SetupDiDestroyDeviceInfoList(hDevInfoWithInterface);
return FALSE;
}
pDev->InterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
result = SetupDiGetDeviceInterfaceDetail(hDevInfoWithInterface, &DeviceInterfaceData, pDev->InterfaceDetailData, dataSize, NULL, NULL);
SetupDiDestroyDeviceInfoList(hDevInfoWithInterface);
if (!result) {
PrintLastError("SetupDiGetDeviceInterfaceDetail()");
LocalFree(pDev->InterfaceDetailData);
pDev->InterfaceDetailData = NULL;
return FALSE;
}
return TRUE;
}
BOOL getDriverData(CMIDEV* pDev)
{
BOOL result;
HANDLE hDevice;
KSPROPERTY KSProp;
DWORD dataSize;
hDevice = CreateFile(pDev->InterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
PrintLastError("CreateFile()");
return FALSE;
}
KSProp.Set = KSPROPSETID_CMI;
KSProp.Flags = KSPROPERTY_TYPE_GET;
KSProp.Id = KSPROPERTY_CMI_GET;
result = DeviceIoControl(hDevice, IOCTL_KS_PROPERTY, &KSProp, sizeof(KSProp), &cmiData, sizeof(cmiData), &dataSize, NULL);
CloseHandle(hDevice);
if (!result) {
PrintLastError("DeviceIoControl()");
return FALSE;
}
return TRUE;
}
BOOL setDriverData(CMIDEV* pDev)
{
BOOL result;
HANDLE hDevice;
KSPROPERTY KSProp;
DWORD dataSize;
hDevice = CreateFile(pDev->InterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
PrintLastError("CreateFile()");
return FALSE;
}
KSProp.Set = KSPROPSETID_CMI;
KSProp.Flags = KSPROPERTY_TYPE_SET;
KSProp.Id = KSPROPERTY_CMI_SET;
result = DeviceIoControl(hDevice, IOCTL_KS_PROPERTY, &KSProp, sizeof(KSProp), &cmiData, sizeof(cmiData), &dataSize, NULL);
CloseHandle(hDevice);
if (!result) {
PrintLastError("DeviceIoControl()");
return FALSE;
}
return TRUE;
}
void cleanUp()
{
stopTestTone();
if (cmiTopologyDev.Info) {
SetupDiDestroyDeviceInfoList(cmiTopologyDev.Info);
cmiTopologyDev.Info = NULL;
}
if (cmiTopologyDev.InterfaceDetailData) {
LocalFree(cmiTopologyDev.InterfaceDetailData);
cmiTopologyDev.InterfaceDetailData = NULL;
}
if (hURLFont) {
DeleteObject(hURLFont); //hm?
hURLFont = NULL;
}
}
BOOL openDevice()
{
if (!getDeviceInfo(&KSCATEGORY_TOPOLOGY, &cmiTopologyDev)) {
PrintLastError("getDeviceInfo()");
return FALSE;
}
if (!getDeviceInterfaceDetail(&KSCATEGORY_TOPOLOGY, &cmiTopologyDev)) {
PrintLastError("getDeviceInterfaceDetail()");
return FALSE;
}
return TRUE;
}
void updateChannelBoxes(HWND hWnd)
{
switch (SendMessage(GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG), CB_GETCURSEL, 0, 0)) {
case 0: // stereo
ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE);
SetDlgItemText(hWnd, IDT_SWAPJACKS, "");
break;
case 1: // quad
ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE);
SetDlgItemText(hWnd, IDT_SWAPJACKS, "");
break;
case 2: // 5.1
ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE);
SetDlgItemText(hWnd, IDT_SWAPJACKS, "BL/BR and C/LFE jacks are swapped!");
break;
case 3: // 7.1
ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_SHOW);
ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_SHOW);
SetDlgItemText(hWnd, IDT_SWAPJACKS, "BL/BR and C/LFE jacks are swapped!");
break;
}
}
BOOL setDlgItems(HWND hWnd)
{
HWND hWndItem;
char buffer[127];
if (!getDriverData(&cmiTopologyDev)) {
PrintLastError("getDriverData()");
return FALSE;
}
// 'About' tab
SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_VERSION), cmiData.driverVersion);
wsprintf(buffer, "%d", cmiData.hardwareRevision);
SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_HWREV), buffer);
wsprintf(buffer, "%d", cmiData.maxChannels);
SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_MAXCHAN), buffer);
wsprintf(buffer, "%04X", cmiData.IOBase);
SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_BASEADR), buffer);
wsprintf(buffer, "%04X", cmiData.MPUBase);
SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_MPUADR), buffer);
// channel config combobox
hWndItem = GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG);
SendMessage(hWndItem, CB_RESETCONTENT, 0, 0);
if (cmiData.maxChannels >= 2) {
SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"Stereo (2.0)");
}
if (cmiData.maxChannels >= 4) {
SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"Quadrophonic (4.0)");
}
if (cmiData.maxChannels >= 6) {
SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"5.1 Surround");
}
if (cmiData.maxChannels >= 8) {
SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"7.1 Surround");
}
getCurrentChannelConfig();
SendMessage(hWndItem, CB_SETCURSEL, (currentChannelCount/2)-1, 0);
updateChannelBoxes(hWnd);
// checkboxes
SendMessage(GetDlgItem(hWndChild[0], IDC_EN_PCMDAC), BM_SETCHECK, (cmiData.enablePCMDAC ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_EXCH_FB), BM_SETCHECK, (cmiData.exchangeFrontBack ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO), BM_SETCHECK, (cmiData.enableSPDO ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO5V), BM_SETCHECK, (cmiData.enableSPDO5V ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDCOPYRHT), BM_SETCHECK, (cmiData.enableSPDOCopyright ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDI), BM_SETCHECK, (cmiData.enableSPDI ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_SEL_SPDIFI), BM_SETCHECK, (cmiData.select2ndSPDI ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_INV_SPDIFI), BM_SETCHECK, (cmiData.invertPhaseSPDI ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_POLVALID), BM_SETCHECK, (cmiData.invertValidBitSPDI ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[1], IDC_LOOP_SPDF), BM_SETCHECK, (cmiData.loopSPDI ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_441_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_480_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_882_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_960_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_441_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_480_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_882_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_960_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_441_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_480_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_882_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_960_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0);
// radioboxes
SendMessage(GetDlgItem(hWndChild[0], IDC_EN_BASS2LINE), BM_SETCHECK, (cmiData.enableBass2Line ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2LINE), BM_SETCHECK, (cmiData.enableCenter2Line ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_EN_REAR2LINE), BM_SETCHECK, (cmiData.enableRear2Line ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_NOROUTE_LINE), BM_SETCHECK, ((!cmiData.enableCenter2Line && !cmiData.enableBass2Line && !cmiData.enableRear2Line) ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2MIC), BM_SETCHECK, (cmiData.enableCenter2Mic ? BST_CHECKED : BST_UNCHECKED), 0);
SendMessage(GetDlgItem(hWndChild[0], IDC_NOROUTE_MIC), BM_SETCHECK, (!cmiData.enableCenter2Mic ? BST_CHECKED : BST_UNCHECKED), 0);
return TRUE;
}
BOOL applySettings()
{
cmiData.enablePCMDAC = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_PCMDAC), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.exchangeFrontBack = (SendMessage(GetDlgItem(hWndChild[0], IDC_EXCH_FB), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableBass2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_BASS2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableCenter2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableRear2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_REAR2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableCenter2Mic = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2MIC), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableSPDO = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableSPDO5V = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO5V), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableSPDOCopyright = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDCOPYRHT), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.enableSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDI), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.select2ndSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_SEL_SPDIFI), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.invertPhaseSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_INV_SPDIFI), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.invertValidBitSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_POLVALID), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.loopSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_LOOP_SPDF), BM_GETCHECK, 0, 0) == BST_CHECKED);
cmiData.formatMask = 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_MULTI_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_MULTI_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_MULTI_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_MULTI_PCM : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_DOLBY : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_DOLBY : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_DOLBY : 0;
cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_DOLBY : 0;
currentChannelCount = (int)(SendMessage(GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG), CB_GETCURSEL, 0, 0)+1)*2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -