Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmain.cpp
Go to the documentation of this file.
00001 /* 00002 Copyright (c) 2006-2007 dogbert <dogber1@gmail.com> 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without 00006 modification, are permitted provided that the following conditions 00007 are met: 00008 1. Redistributions of source code must retain the above copyright 00009 notice, this list of conditions and the following disclaimer. 00010 2. Redistributions in binary form must reproduce the above copyright 00011 notice, this list of conditions and the following disclaimer in the 00012 documentation and/or other materials provided with the distribution. 00013 3. The name of the author may not be used to endorse or promote products 00014 derived from this software without specific prior written permission. 00015 00016 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00017 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00018 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 00019 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 00020 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00021 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00022 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00023 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00024 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00025 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00026 */ 00027 00028 #include "main.h" 00029 00030 00031 void PrintLastError(LPCSTR function) 00032 { 00033 LPVOID lpMsgBuf; 00034 DWORD errorid = GetLastError(); 00035 00036 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorid, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); 00037 MessageBox(NULL, (LPCSTR)lpMsgBuf, function, MB_ICONEXCLAMATION | MB_OK); 00038 LocalFree(lpMsgBuf); 00039 } 00040 00041 BOOL generateTestSignal(double amplitude, int Channels, int SamplesPerSec, SHORT** buffer) 00042 { 00043 int i, o2, o3, o4, o5; 00044 bool Left,Right,BackLeft,BackRight,Center,Sub, CenterLeft, CenterRight; 00045 short value; 00046 double x = SPEAKER_FREQUENCY*2*3.141592654/SamplesPerSec; 00047 double y = BASS_FREQUENCY*2*3.141592654/SamplesPerSec; 00048 00049 Left = (SendMessage(GetDlgItem(hWndChild[0], IDC_LEFT), BM_GETCHECK, 0, 0) == BST_CHECKED); 00050 Right = (SendMessage(GetDlgItem(hWndChild[0], IDC_RIGHT), BM_GETCHECK, 0, 0) == BST_CHECKED); 00051 BackLeft = (SendMessage(GetDlgItem(hWndChild[0], IDC_BLEFT), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 2); 00052 BackRight = (SendMessage(GetDlgItem(hWndChild[0], IDC_BRIGHT), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 2); 00053 Center = (SendMessage(GetDlgItem(hWndChild[0], IDC_CENTER), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 4); 00054 Sub = (SendMessage(GetDlgItem(hWndChild[0], IDC_SUB), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 4); 00055 CenterLeft = (SendMessage(GetDlgItem(hWndChild[0], IDC_CLEFT), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 6); 00056 CenterRight = (SendMessage(GetDlgItem(hWndChild[0], IDC_CRIGHT), BM_GETCHECK, 0, 0) == BST_CHECKED) && (currentChannelCount > 6); 00057 00058 if (!(Left || Right || BackLeft || BackRight || Center || Sub || CenterLeft || CenterRight)) { 00059 return FALSE; 00060 } 00061 00062 if (currentChannelCount > 4) { 00063 o2 = 4; o3 = 5; 00064 o4 = 2; o5 = 3; 00065 } else { 00066 o2 = 2; o3 = 3; 00067 o4 = 4; o5 = 5; 00068 } 00069 00070 (*buffer) = (SHORT*)LocalAlloc(LPTR, SamplesPerSec*sizeof(SHORT)*Channels); 00071 ZeroMemory((*buffer), SamplesPerSec*sizeof(SHORT)*Channels); 00072 00073 for (i=0;i<SamplesPerSec;i++) { 00074 value = (SHORT)(cos(i*x)*amplitude*32767.0); 00075 if (Left) { 00076 (*buffer)[(i*Channels)+0] = value; 00077 } 00078 if (Right) { 00079 (*buffer)[(i*Channels)+1] = value; 00080 } 00081 if (BackLeft) { 00082 (*buffer)[(i*Channels)+o2] = value; 00083 } 00084 if (BackRight) { 00085 (*buffer)[(i*Channels)+o3] = value; 00086 } 00087 if (Center) { 00088 (*buffer)[(i*Channels)+o4] = value; 00089 } 00090 if (Sub) { 00091 (*buffer)[(i*Channels)+o5] = (SHORT)(cos(i*y)*amplitude*32767.0); 00092 } 00093 if (CenterLeft) { 00094 (*buffer)[(i*Channels)+6] = value; 00095 } 00096 if (CenterRight) { 00097 (*buffer)[(i*Channels)+7] = value; 00098 } 00099 } 00100 return TRUE; 00101 } 00102 00103 BOOL stopTestTone(void) 00104 { 00105 if (hWave == NULL) { 00106 return FALSE; 00107 } 00108 00109 if (waveOutReset(hWave) != MMSYSERR_NOERROR) { 00110 PrintLastError("waveOutReset()"); 00111 return FALSE; 00112 } 00113 if (waveOutClose(hWave) != MMSYSERR_NOERROR) { 00114 PrintLastError("waveOutClose()"); 00115 return FALSE; 00116 } 00117 hWave = NULL; 00118 LocalFree(pwh.lpData); 00119 return TRUE; 00120 } 00121 00122 UINT findWaveDeviceID() 00123 { 00124 WAVEOUTCAPS woc; 00125 UINT i, numDev; 00126 00127 numDev = waveOutGetNumDevs(); 00128 for (i=0;i<numDev;i++) { 00129 if (!waveOutGetDevCaps(i, &woc, sizeof(WAVEOUTCAPS))) { 00130 if ((CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, woc.szPname, -1, TEXT("CMI8738/8768 Wave"), -1) == CSTR_EQUAL) || 00131 (CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, woc.szPname, -1, TEXT("Speakers (CMI8738/8768 Audio De"), -1) == CSTR_EQUAL)) { 00132 return i; 00133 } 00134 } 00135 } 00136 return WAVE_MAPPER; 00137 } 00138 00139 BOOL playTestTone() 00140 { 00141 SHORT* buffer; 00142 #if 1 00143 WAVEFORMATEXTENSIBLE wfx; 00144 00145 ZeroMemory(&wfx, sizeof(WAVEFORMATEXTENSIBLE)); 00146 wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; 00147 wfx.Format.nChannels = (WORD)currentChannelCount; 00148 wfx.Format.nSamplesPerSec = SAMPLE_RATE; 00149 wfx.Format.wBitsPerSample = 16; 00150 wfx.Format.nBlockAlign = (wfx.Format.wBitsPerSample >> 3) * wfx.Format.nChannels; 00151 wfx.Format.nAvgBytesPerSec = SAMPLE_RATE * (wfx.Format.wBitsPerSample >> 3) * wfx.Format.nChannels; 00152 wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); 00153 wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample ; 00154 wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; 00155 #else 00156 WAVEFORMATEX wfx; 00157 wfx.wFormatTag = WAVE_FORMAT_PCM; 00158 wfx.wBitsPerSample = 16; 00159 wfx.nChannels = (WORD)currentChannelCount; 00160 wfx.nSamplesPerSec = SAMPLE_RATE; 00161 wfx.nAvgBytesPerSec = SAMPLE_RATE * (wfx.wBitsPerSample >> 3) * wfx.nChannels; 00162 wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels; 00163 wfx.cbSize = 0; 00164 #endif 00165 00166 if (waveOutOpen(&hWave, findWaveDeviceID(), (WAVEFORMATEX*)&(wfx), 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) { 00167 PrintLastError("waveOutOpen()"); 00168 return FALSE; 00169 } 00170 00171 if (!generateTestSignal(SPEAKER_AMPLITUDE, currentChannelCount, SAMPLE_RATE, &buffer)) { 00172 return FALSE; 00173 } 00174 00175 ZeroMemory(&pwh, sizeof(pwh)); 00176 pwh.lpData = (LPSTR)buffer; 00177 pwh.dwBufferLength = SAMPLE_RATE*sizeof(SHORT)*currentChannelCount; 00178 pwh.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; 00179 pwh.dwLoops = 0xFFFFFFFF; 00180 if (waveOutPrepareHeader(hWave, &pwh, sizeof(pwh)) != MMSYSERR_NOERROR) { 00181 LocalFree(buffer); 00182 PrintLastError("waveOutPrepareHeader()"); 00183 return FALSE; 00184 } 00185 00186 if (waveOutReset(hWave) != MMSYSERR_NOERROR) { 00187 LocalFree(buffer); 00188 PrintLastError("waveOutReset()"); 00189 return FALSE; 00190 } 00191 if (waveOutWrite(hWave, &pwh, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) { 00192 LocalFree(buffer); 00193 PrintLastError("waveOutWrite()"); 00194 return FALSE; 00195 } 00196 00197 return TRUE; 00198 } 00199 00200 00201 BOOL CALLBACK DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext) 00202 { 00203 LPGUID* pGUID = (LPGUID*)lpContext; 00204 00205 if (pGUID == NULL) { 00206 return FALSE; 00207 } 00208 if ((*pGUID) != NULL) { 00209 return TRUE; 00210 } 00211 00212 if (lpGUID != NULL) { 00213 // XP, 2k 00214 if ((CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, lpszDrvName, -1, TEXT("cmipci.sys"), -1) == CSTR_EQUAL) && 00215 (CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, lpszDesc, -1, TEXT("CMI8738/8768 Wave"), -1) == CSTR_EQUAL)) { 00216 (*pGUID) = (LPGUID)LocalAlloc(LPTR, sizeof(GUID)); 00217 memcpy((*pGUID), lpGUID, sizeof(GUID)); 00218 return TRUE; 00219 } 00220 // Vista 00221 if (CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, lpszDesc, -1, TEXT("Speakers (CMI8738/8768 Audio Device)"), -1) == CSTR_EQUAL) { 00222 (*pGUID) = (LPGUID)LocalAlloc(LPTR, sizeof(GUID)); 00223 memcpy((*pGUID), lpGUID, sizeof(GUID)); 00224 return TRUE; 00225 } 00226 } 00227 return TRUE; 00228 } 00229 00230 BOOL getCurrentChannelConfig() 00231 { 00232 IDirectSound8* ds; 00233 DWORD speakerConfig; 00234 LPGUID guid = NULL; 00235 00236 DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc, (VOID*)&guid); 00237 00238 if (DirectSoundCreate8(guid, &ds, NULL) != S_OK) { 00239 PrintLastError("DirectSoundCreate8()"); 00240 return FALSE; 00241 } 00242 00243 ds->Initialize(NULL); 00244 00245 if (ds->GetSpeakerConfig(&speakerConfig) != S_OK) { 00246 PrintLastError("GetSpeakerConfig()"); 00247 return FALSE; 00248 } 00249 00250 if (ds) { 00251 ds->Release(); 00252 } 00253 if (guid) { 00254 LocalFree(guid); 00255 } 00256 00257 switch (DSSPEAKER_CONFIG(speakerConfig)) { 00258 case DSSPEAKER_STEREO: currentChannelCount = 2; return TRUE; 00259 case DSSPEAKER_QUAD: currentChannelCount = 4; return TRUE; 00260 case DSSPEAKER_5POINT1: currentChannelCount = 6; return TRUE; 00261 case DSSPEAKER_7POINT1: currentChannelCount = 8; return TRUE; 00262 } 00263 00264 return FALSE; 00265 } 00266 00267 BOOL setCurrentChannelConfig() 00268 { 00269 IDirectSound8* ds; 00270 DWORD speakerConfig; 00271 LPGUID guid = NULL; 00272 00273 DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc, (VOID*)&guid); 00274 00275 if (DirectSoundCreate8(guid, &ds, NULL) != S_OK) { 00276 PrintLastError("DirectSoundCreate8()"); 00277 return FALSE; 00278 } 00279 00280 00281 ds->Initialize(NULL); 00282 00283 switch (currentChannelCount) { 00284 case 2: speakerConfig = DSSPEAKER_STEREO; break; 00285 case 4: speakerConfig = DSSPEAKER_QUAD; break; 00286 case 6: speakerConfig = DSSPEAKER_5POINT1; break; 00287 case 8: speakerConfig = DSSPEAKER_7POINT1; break; 00288 } 00289 00290 if (ds->SetSpeakerConfig(speakerConfig) != S_OK) { 00291 PrintLastError("SetSpeakerConfig()"); 00292 return FALSE; 00293 } 00294 00295 if (ds) { 00296 ds->Release(); 00297 } 00298 if (guid) { 00299 LocalFree(guid); 00300 } 00301 00302 00303 return FALSE; 00304 } 00305 00306 BOOL getDeviceInfo(const GUID* category, CMIDEV* pDev) 00307 { 00308 TCHAR szServiceName[128]; 00309 int nIndex = 0; 00310 00311 pDev->Info = SetupDiGetClassDevs(category, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 00312 if (pDev->Info == INVALID_HANDLE_VALUE) { 00313 PrintLastError("SetupDiGetClassDevs()"); 00314 return FALSE; 00315 } 00316 00317 pDev->InfoData.cbSize = sizeof(SP_DEVINFO_DATA); 00318 00319 while (SetupDiEnumDeviceInfo(pDev->Info, nIndex, &(pDev->InfoData))) { 00320 if (!SetupDiGetDeviceRegistryProperty(pDev->Info, &(pDev->InfoData), SPDRP_SERVICE, NULL, (PBYTE)szServiceName, sizeof(szServiceName), NULL)) { 00321 PrintLastError("SetupDiGetDeviceRegistryProperty()"); 00322 SetupDiDestroyDeviceInfoList(pDev->Info); 00323 pDev->Info = NULL; 00324 return FALSE; 00325 } 00326 00327 if (CompareString(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), NORM_IGNORECASE, szServiceName, -1, TEXT("cmipci"), -1) == CSTR_EQUAL) { 00328 return TRUE; 00329 } 00330 nIndex++; 00331 } 00332 00333 SetupDiDestroyDeviceInfoList(pDev->Info); 00334 pDev->Info = NULL; 00335 return FALSE; 00336 } 00337 00338 BOOL getDeviceInterfaceDetail(const GUID* category, CMIDEV* pDev) 00339 { 00340 SP_DEVICE_INTERFACE_DATA deviceInterfaceData; 00341 DWORD dataSize = 0; 00342 BOOL result; 00343 PTSTR pnpStr = NULL; 00344 HDEVINFO hDevInfoWithInterface; 00345 SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; 00346 ULONG ulDeviceInterfaceDetailDataSize = 0; 00347 00348 // get the PnP string 00349 SetupDiGetDeviceInstanceId(pDev->Info, &(pDev->InfoData), NULL, 0, &dataSize); 00350 if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (!dataSize)) { 00351 PrintLastError("SetupDiGetDeviceInstanceId()"); 00352 return FALSE; 00353 } 00354 pnpStr = (PTSTR)LocalAlloc(LPTR, dataSize * sizeof(TCHAR)); 00355 if (!pnpStr) { 00356 PrintLastError("LocalAlloc()"); 00357 return FALSE; 00358 } 00359 result = SetupDiGetDeviceInstanceId(pDev->Info, &(pDev->InfoData), pnpStr, dataSize, NULL); 00360 if (!result) { 00361 PrintLastError("SetupDiGetDeviceInstanceId()"); 00362 LocalFree(pnpStr); 00363 return FALSE; 00364 } 00365 hDevInfoWithInterface = SetupDiGetClassDevs(&KSCATEGORY_TOPOLOGY, pnpStr, NULL, DIGCF_DEVICEINTERFACE); 00366 LocalFree(pnpStr); 00367 if (hDevInfoWithInterface == INVALID_HANDLE_VALUE) { 00368 PrintLastError("SetupDiGetClassDevs()"); 00369 return FALSE; 00370 } 00371 00372 // get the device interface data 00373 DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData); 00374 result = SetupDiEnumDeviceInterfaces(hDevInfoWithInterface, NULL, &KSCATEGORY_TOPOLOGY, 0, &DeviceInterfaceData); 00375 if (!result) { 00376 PrintLastError("SetupDiEnumDeviceInterfaces()"); 00377 SetupDiDestroyDeviceInfoList(hDevInfoWithInterface); 00378 return FALSE; 00379 } 00380 00381 // get the device interface detail data 00382 dataSize = 0; 00383 SetupDiGetDeviceInterfaceDetail(hDevInfoWithInterface, &DeviceInterfaceData, NULL, 0, &dataSize, NULL); 00384 if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (!dataSize)) { 00385 PrintLastError("SetupDiGetDeviceInterfaceDetail()"); 00386 SetupDiDestroyDeviceInfoList(hDevInfoWithInterface); 00387 return FALSE; 00388 } 00389 pDev->InterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, dataSize); 00390 if (!pDev->InterfaceDetailData) { 00391 PrintLastError("LocalAlloc()"); 00392 SetupDiDestroyDeviceInfoList(hDevInfoWithInterface); 00393 return FALSE; 00394 } 00395 pDev->InterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 00396 result = SetupDiGetDeviceInterfaceDetail(hDevInfoWithInterface, &DeviceInterfaceData, pDev->InterfaceDetailData, dataSize, NULL, NULL); 00397 SetupDiDestroyDeviceInfoList(hDevInfoWithInterface); 00398 if (!result) { 00399 PrintLastError("SetupDiGetDeviceInterfaceDetail()"); 00400 LocalFree(pDev->InterfaceDetailData); 00401 pDev->InterfaceDetailData = NULL; 00402 return FALSE; 00403 } 00404 00405 return TRUE; 00406 00407 } 00408 00409 BOOL getDriverData(CMIDEV* pDev) 00410 { 00411 BOOL result; 00412 HANDLE hDevice; 00413 KSPROPERTY KSProp; 00414 DWORD dataSize; 00415 00416 hDevice = CreateFile(pDev->InterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 00417 if (hDevice == INVALID_HANDLE_VALUE) { 00418 PrintLastError("CreateFile()"); 00419 return FALSE; 00420 } 00421 KSProp.Set = KSPROPSETID_CMI; 00422 KSProp.Flags = KSPROPERTY_TYPE_GET; 00423 KSProp.Id = KSPROPERTY_CMI_GET; 00424 result = DeviceIoControl(hDevice, IOCTL_KS_PROPERTY, &KSProp, sizeof(KSProp), &cmiData, sizeof(cmiData), &dataSize, NULL); 00425 CloseHandle(hDevice); 00426 00427 if (!result) { 00428 PrintLastError("DeviceIoControl()"); 00429 return FALSE; 00430 } 00431 00432 return TRUE; 00433 } 00434 00435 BOOL setDriverData(CMIDEV* pDev) 00436 { 00437 BOOL result; 00438 HANDLE hDevice; 00439 KSPROPERTY KSProp; 00440 DWORD dataSize; 00441 00442 hDevice = CreateFile(pDev->InterfaceDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 00443 if (hDevice == INVALID_HANDLE_VALUE) { 00444 PrintLastError("CreateFile()"); 00445 return FALSE; 00446 } 00447 KSProp.Set = KSPROPSETID_CMI; 00448 KSProp.Flags = KSPROPERTY_TYPE_SET; 00449 KSProp.Id = KSPROPERTY_CMI_SET; 00450 result = DeviceIoControl(hDevice, IOCTL_KS_PROPERTY, &KSProp, sizeof(KSProp), &cmiData, sizeof(cmiData), &dataSize, NULL); 00451 CloseHandle(hDevice); 00452 00453 if (!result) { 00454 PrintLastError("DeviceIoControl()"); 00455 return FALSE; 00456 } 00457 00458 return TRUE; 00459 } 00460 00461 void cleanUp() 00462 { 00463 stopTestTone(); 00464 if (cmiTopologyDev.Info) { 00465 SetupDiDestroyDeviceInfoList(cmiTopologyDev.Info); 00466 cmiTopologyDev.Info = NULL; 00467 } 00468 if (cmiTopologyDev.InterfaceDetailData) { 00469 LocalFree(cmiTopologyDev.InterfaceDetailData); 00470 cmiTopologyDev.InterfaceDetailData = NULL; 00471 } 00472 if (hURLFont) { 00473 DeleteObject(hURLFont); //hm? 00474 hURLFont = NULL; 00475 } 00476 } 00477 00478 BOOL openDevice() 00479 { 00480 if (!getDeviceInfo(&KSCATEGORY_TOPOLOGY, &cmiTopologyDev)) { 00481 PrintLastError("getDeviceInfo()"); 00482 return FALSE; 00483 } 00484 00485 if (!getDeviceInterfaceDetail(&KSCATEGORY_TOPOLOGY, &cmiTopologyDev)) { 00486 PrintLastError("getDeviceInterfaceDetail()"); 00487 return FALSE; 00488 } 00489 00490 return TRUE; 00491 } 00492 00493 void updateChannelBoxes(HWND hWnd) 00494 { 00495 switch (SendMessage(GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG), CB_GETCURSEL, 0, 0)) { 00496 case 0: // stereo 00497 ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_HIDE); 00498 ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_HIDE); 00499 ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_HIDE); 00500 ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_HIDE); 00501 ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE); 00502 ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE); 00503 SetDlgItemText(hWnd, IDT_SWAPJACKS, ""); 00504 break; 00505 case 1: // quad 00506 ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW); 00507 ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW); 00508 ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_HIDE); 00509 ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_HIDE); 00510 ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE); 00511 ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE); 00512 SetDlgItemText(hWnd, IDT_SWAPJACKS, ""); 00513 break; 00514 case 2: // 5.1 00515 ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW); 00516 ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW); 00517 ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_SHOW); 00518 ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_SHOW); 00519 ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_HIDE); 00520 ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_HIDE); 00521 SetDlgItemText(hWnd, IDT_SWAPJACKS, "BL/BR and C/LFE jacks are swapped!"); 00522 break; 00523 case 3: // 7.1 00524 ShowWindow(GetDlgItem(hWndChild[0], IDC_BLEFT), SW_SHOW); 00525 ShowWindow(GetDlgItem(hWndChild[0], IDC_BRIGHT), SW_SHOW); 00526 ShowWindow(GetDlgItem(hWndChild[0], IDC_CENTER), SW_SHOW); 00527 ShowWindow(GetDlgItem(hWndChild[0], IDC_SUB), SW_SHOW); 00528 ShowWindow(GetDlgItem(hWndChild[0], IDC_CLEFT), SW_SHOW); 00529 ShowWindow(GetDlgItem(hWndChild[0], IDC_CRIGHT), SW_SHOW); 00530 SetDlgItemText(hWnd, IDT_SWAPJACKS, "BL/BR and C/LFE jacks are swapped!"); 00531 break; 00532 } 00533 } 00534 00535 00536 BOOL setDlgItems(HWND hWnd) 00537 { 00538 HWND hWndItem; 00539 char buffer[127]; 00540 00541 if (!getDriverData(&cmiTopologyDev)) { 00542 PrintLastError("getDriverData()"); 00543 return FALSE; 00544 } 00545 00546 // 'About' tab 00547 SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_VERSION), cmiData.driverVersion); 00548 wsprintf(buffer, "%d", cmiData.hardwareRevision); 00549 SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_HWREV), buffer); 00550 wsprintf(buffer, "%d", cmiData.maxChannels); 00551 SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_MAXCHAN), buffer); 00552 wsprintf(buffer, "%04X", cmiData.IOBase); 00553 SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_BASEADR), buffer); 00554 wsprintf(buffer, "%04X", cmiData.MPUBase); 00555 SetWindowText(GetDlgItem(hWndChild[NUM_TABS-1], IDC_MPUADR), buffer); 00556 00557 // channel config combobox 00558 hWndItem = GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG); 00559 SendMessage(hWndItem, CB_RESETCONTENT, 0, 0); 00560 if (cmiData.maxChannels >= 2) { 00561 SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"Stereo (2.0)"); 00562 } 00563 if (cmiData.maxChannels >= 4) { 00564 SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"Quadrophonic (4.0)"); 00565 } 00566 if (cmiData.maxChannels >= 6) { 00567 SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"5.1 Surround"); 00568 } 00569 if (cmiData.maxChannels >= 8) { 00570 SendMessage(hWndItem, CB_ADDSTRING, 0, (LPARAM)"7.1 Surround"); 00571 } 00572 getCurrentChannelConfig(); 00573 SendMessage(hWndItem, CB_SETCURSEL, (currentChannelCount/2)-1, 0); 00574 updateChannelBoxes(hWnd); 00575 00576 // checkboxes 00577 SendMessage(GetDlgItem(hWndChild[0], IDC_EN_PCMDAC), BM_SETCHECK, (cmiData.enablePCMDAC ? BST_CHECKED : BST_UNCHECKED), 0); 00578 SendMessage(GetDlgItem(hWndChild[0], IDC_EXCH_FB), BM_SETCHECK, (cmiData.exchangeFrontBack ? BST_CHECKED : BST_UNCHECKED), 0); 00579 00580 SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO), BM_SETCHECK, (cmiData.enableSPDO ? BST_CHECKED : BST_UNCHECKED), 0); 00581 SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO5V), BM_SETCHECK, (cmiData.enableSPDO5V ? BST_CHECKED : BST_UNCHECKED), 0); 00582 SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDCOPYRHT), BM_SETCHECK, (cmiData.enableSPDOCopyright ? BST_CHECKED : BST_UNCHECKED), 0); 00583 SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDI), BM_SETCHECK, (cmiData.enableSPDI ? BST_CHECKED : BST_UNCHECKED), 0); 00584 SendMessage(GetDlgItem(hWndChild[1], IDC_SEL_SPDIFI), BM_SETCHECK, (cmiData.select2ndSPDI ? BST_CHECKED : BST_UNCHECKED), 0); 00585 SendMessage(GetDlgItem(hWndChild[1], IDC_INV_SPDIFI), BM_SETCHECK, (cmiData.invertPhaseSPDI ? BST_CHECKED : BST_UNCHECKED), 0); 00586 SendMessage(GetDlgItem(hWndChild[1], IDC_POLVALID), BM_SETCHECK, (cmiData.invertValidBitSPDI ? BST_CHECKED : BST_UNCHECKED), 0); 00587 SendMessage(GetDlgItem(hWndChild[1], IDC_LOOP_SPDF), BM_SETCHECK, (cmiData.loopSPDI ? BST_CHECKED : BST_UNCHECKED), 0); 00588 00589 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_441_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00590 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_480_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00591 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_882_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00592 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_PCM), BM_SETCHECK, ((cmiData.formatMask & FMT_960_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00593 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_441_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00594 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_480_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00595 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_882_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00596 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_MULTI_PCM),BM_SETCHECK, ((cmiData.formatMask & FMT_960_MULTI_PCM) ? BST_CHECKED : BST_UNCHECKED), 0); 00597 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_441_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0); 00598 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_480_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0); 00599 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_882_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0); 00600 SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_DOLBY), BM_SETCHECK, ((cmiData.formatMask & FMT_960_DOLBY) ? BST_CHECKED : BST_UNCHECKED), 0); 00601 00602 // radioboxes 00603 SendMessage(GetDlgItem(hWndChild[0], IDC_EN_BASS2LINE), BM_SETCHECK, (cmiData.enableBass2Line ? BST_CHECKED : BST_UNCHECKED), 0); 00604 SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2LINE), BM_SETCHECK, (cmiData.enableCenter2Line ? BST_CHECKED : BST_UNCHECKED), 0); 00605 SendMessage(GetDlgItem(hWndChild[0], IDC_EN_REAR2LINE), BM_SETCHECK, (cmiData.enableRear2Line ? BST_CHECKED : BST_UNCHECKED), 0); 00606 SendMessage(GetDlgItem(hWndChild[0], IDC_NOROUTE_LINE), BM_SETCHECK, ((!cmiData.enableCenter2Line && !cmiData.enableBass2Line && !cmiData.enableRear2Line) ? BST_CHECKED : BST_UNCHECKED), 0); 00607 00608 SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2MIC), BM_SETCHECK, (cmiData.enableCenter2Mic ? BST_CHECKED : BST_UNCHECKED), 0); 00609 SendMessage(GetDlgItem(hWndChild[0], IDC_NOROUTE_MIC), BM_SETCHECK, (!cmiData.enableCenter2Mic ? BST_CHECKED : BST_UNCHECKED), 0); 00610 00611 00612 return TRUE; 00613 } 00614 00615 BOOL applySettings() 00616 { 00617 cmiData.enablePCMDAC = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_PCMDAC), BM_GETCHECK, 0, 0) == BST_CHECKED); 00618 cmiData.exchangeFrontBack = (SendMessage(GetDlgItem(hWndChild[0], IDC_EXCH_FB), BM_GETCHECK, 0, 0) == BST_CHECKED); 00619 cmiData.enableBass2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_BASS2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED); 00620 cmiData.enableCenter2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED); 00621 cmiData.enableRear2Line = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_REAR2LINE), BM_GETCHECK, 0, 0) == BST_CHECKED); 00622 cmiData.enableCenter2Mic = (SendMessage(GetDlgItem(hWndChild[0], IDC_EN_CENTER2MIC), BM_GETCHECK, 0, 0) == BST_CHECKED); 00623 00624 cmiData.enableSPDO = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO), BM_GETCHECK, 0, 0) == BST_CHECKED); 00625 cmiData.enableSPDO5V = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDO5V), BM_GETCHECK, 0, 0) == BST_CHECKED); 00626 cmiData.enableSPDOCopyright = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDCOPYRHT), BM_GETCHECK, 0, 0) == BST_CHECKED); 00627 cmiData.enableSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_EN_SPDI), BM_GETCHECK, 0, 0) == BST_CHECKED); 00628 cmiData.select2ndSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_SEL_SPDIFI), BM_GETCHECK, 0, 0) == BST_CHECKED); 00629 cmiData.invertPhaseSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_INV_SPDIFI), BM_GETCHECK, 0, 0) == BST_CHECKED); 00630 cmiData.invertValidBitSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_POLVALID), BM_GETCHECK, 0, 0) == BST_CHECKED); 00631 cmiData.loopSPDI = (SendMessage(GetDlgItem(hWndChild[1], IDC_LOOP_SPDF), BM_GETCHECK, 0, 0) == BST_CHECKED); 00632 00633 cmiData.formatMask = 0; 00634 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_PCM : 0; 00635 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_PCM : 0; 00636 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_PCM : 0; 00637 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_PCM : 0; 00638 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_MULTI_PCM : 0; 00639 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_MULTI_PCM : 0; 00640 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_MULTI_PCM : 0; 00641 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_MULTI_PCM), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_MULTI_PCM : 0; 00642 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_441_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_441_DOLBY : 0; 00643 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_480_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_480_DOLBY : 0; 00644 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_882_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_882_DOLBY : 0; 00645 cmiData.formatMask |= (SendMessage(GetDlgItem(hWndChild[2], IDC_FMT_960_DOLBY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? FMT_960_DOLBY : 0; 00646 00647 currentChannelCount = (int)(SendMessage(GetDlgItem(hWndChild[0], IDCB_CHANNELCONFIG), CB_GETCURSEL, 0, 0)+1)*2; 00648 00649 return (setDriverData(&cmiTopologyDev) && setCurrentChannelConfig()); 00650 } 00651 00652 BOOL initDialog(HWND hWnd) 00653 { 00654 HICON hIcon; 00655 TC_ITEM tci; 00656 int i; 00657 00658 hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_APP_ICON)); 00659 SendMessage(hWnd, WM_SETICON, (LPARAM) ICON_BIG, (WPARAM) hIcon); 00660 hURLFont = 0; 00661 00662 hWndTab = GetDlgItem(hWnd,IDC_TAB); 00663 00664 ZeroMemory(&tci, sizeof(TC_ITEM)); 00665 tci.mask = TCIF_TEXT; 00666 for (i=0;i<NUM_TABS;i++) { 00667 tci.pszText = tabsName[i]; 00668 if (TabCtrl_InsertItem(hWndTab, i, &tci) == -1) { 00669 PrintLastError("TabCtrl_InsertItem()"); 00670 return FALSE; 00671 } 00672 hWndChild[i] = CreateDialogParam(hInst, MAKEINTRESOURCE(tabsResource[i]), hWndTab, (DLGPROC)TabDlgProc, 0); 00673 } 00674 00675 hURLFont = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | FF_SWISS, "MS Shell Dlg"); 00676 SendMessage(GetDlgItem(hWndChild[NUM_TABS-1], IDC_URL2), WM_SETFONT, (WPARAM)hURLFont, TRUE); 00677 00678 currentTab = 0; 00679 ShowWindow(hWndChild[0], SW_SHOWDEFAULT); 00680 00681 if (!openDevice()) { 00682 PrintLastError("openDevice()"); 00683 return FALSE; 00684 } 00685 return setDlgItems(hWnd); 00686 } 00687 00688 BOOL changeTab(LPNMHDR lpnmhdr) 00689 { 00690 if (lpnmhdr->code != TCN_SELCHANGE) { 00691 return FALSE; 00692 } 00693 ShowWindow(hWndChild[currentTab], SW_HIDE); 00694 currentTab = SendMessage(hWndTab, TCM_GETCURSEL, 0, 0); 00695 ShowWindow(hWndChild[currentTab], SW_SHOWDEFAULT); 00696 return TRUE; 00697 } 00698 00699 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 00700 { 00701 switch(msg) { 00702 case WM_INITDIALOG: 00703 if (!initDialog(hWnd)) { 00704 PostQuitMessage(0); 00705 } 00706 return TRUE; 00707 case WM_CLOSE: 00708 DestroyWindow(hWnd); 00709 return TRUE; 00710 case WM_NOTIFY: 00711 return changeTab((LPNMHDR)lParam); 00712 case WM_DESTROY: 00713 cleanUp(); 00714 PostQuitMessage(0); 00715 return TRUE; 00716 case WM_COMMAND: 00717 if (LOWORD(wParam) == IDB_CLOSE) { 00718 PostQuitMessage(0); 00719 return TRUE; 00720 } 00721 if (LOWORD(wParam) == IDB_APPLY) { 00722 applySettings(); 00723 setDlgItems(hWnd); 00724 return TRUE; 00725 } 00726 break; 00727 } 00728 return 0; 00729 } 00730 00731 void openURL(int control) 00732 { 00733 char buffer[127]; 00734 GetWindowText(GetDlgItem(hWndChild[3], control), buffer, sizeof(buffer)); 00735 ShellExecute(hWndMain, "open", buffer, NULL, NULL, SW_SHOWNORMAL); 00736 } 00737 00738 LRESULT CALLBACK TabDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 00739 { 00740 switch(msg) { 00741 case WM_COMMAND: 00742 switch (LOWORD(wParam)) { 00743 case IDB_STARTSTOP: 00744 if (stopTestTone()) { 00745 SetDlgItemText(hWndChild[0], IDB_STARTSTOP, "&Start"); 00746 return TRUE; 00747 } 00748 if (playTestTone()) { 00749 SetDlgItemText(hWndChild[0], IDB_STARTSTOP, "&Stop"); 00750 return TRUE; 00751 } 00752 break; 00753 case IDC_URL1: 00754 case IDC_URL2: 00755 openURL(LOWORD(wParam)); 00756 break; 00757 } 00758 case WM_CTLCOLORSTATIC: 00759 if ( (GetDlgItem(hWndChild[3], IDC_URL1) == (HANDLE)lParam) || (GetDlgItem(hWndChild[3], IDC_URL2) == (HANDLE)lParam) ) { 00760 SetTextColor((HDC)wParam, 0xFF0000); 00761 SetBkMode((HDC)wParam, TRANSPARENT); 00762 return (LRESULT)GetSysColorBrush(COLOR_BTNFACE); 00763 } 00764 } 00765 00766 return 0; 00767 } 00768 00769 void printUsage() 00770 { 00771 unsigned char usage[] = "/h - print this help message\r\n" \ 00772 "/enable71Mode - change channel configuration to 7.1\r\n" \ 00773 "/enable51Mode - change channel configuration to 5.1\r\n" \ 00774 "/enable40Mode - change channel configuration to 4.0 (Quad)\r\n" \ 00775 "/enable20Mode - change channel configuration to 2.0 (Stereo)\r\n" \ 00776 "/enableSPDIFo - enable SPDIF-out\r\n" \ 00777 "/disableSPDIFo - disable SPDIF-out\r\n"\ 00778 "/enableSPDIFi - enable SPDIF-in recording\r\n" \ 00779 "/disableSPDIFi - disable SPDIF-in recording\r\n"; 00780 00781 MessageBox(NULL, (LPCSTR)usage, TEXT("Usage Help"), MB_ICONINFORMATION | MB_OK); 00782 return; 00783 } 00784 00785 void deleteDriverFiles() { 00786 TCHAR SysDir[MAX_PATH]; 00787 unsigned int len; 00788 if (GetSystemDirectory(SysDir, sizeof(SysDir))==0) { 00789 PrintLastError("GetSystemDirectory()"); 00790 return; 00791 } 00792 len = strlen(SysDir); 00793 00794 strcat(SysDir, "\\cmicpl.cpl"); 00795 if (!DeleteFile(SysDir)) { 00796 MoveFileEx(SysDir, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); 00797 } 00798 SysDir[len] = 0; 00799 00800 strcat(SysDir, "\\cmicontrol.exe"); 00801 if (!DeleteFile(SysDir)) { 00802 MoveFileEx(SysDir, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); 00803 } 00804 } 00805 00806 00807 void performUninstall() { 00808 deleteDriverFiles(); 00809 RegDeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\CMIDriver"); 00810 MessageBox(NULL, "The CMI driver applications were successfully removed from your computer!", "CMIDriver", MB_ICONINFORMATION); 00811 ExitProcess(0); 00812 } 00813 00814 bool checkToken(char* token) { 00815 if ((strcmp(token, "?")==0) || (strcmp(token, "H")==0)) { 00816 printUsage(); 00817 return TRUE; 00818 } else 00819 if (strcmp(token, "ENABLE71MODE")==0) { 00820 currentChannelCount = 8; 00821 } else 00822 if (strcmp(token, "ENABLE51MODE")==0) { 00823 currentChannelCount = 6; 00824 } else 00825 if ((strcmp(token, "ENABLE40MODE")==0) || (strcmp(token, "ENABLEQUADMODE")==0) || (strcmp(token, "QUAD")==0) ) { 00826 currentChannelCount = 4; 00827 } else 00828 if ((strcmp(token, "ENABLE20MODE")==0) || (strcmp(token, "ENABLESTEREOMODE")==0) || (strcmp(token, "STEREO")==0) ) { 00829 currentChannelCount = 2; 00830 } else 00831 if (strcmp(token, "ENABLESPDIFO")==0) { 00832 cmiData.enableSPDO = TRUE; 00833 } else 00834 if (strcmp(token, "DISABLESPDIFO")==0) { 00835 cmiData.enableSPDO = FALSE; 00836 } else 00837 if (strcmp(token, "ENABLESPDIFI")==0) { 00838 cmiData.enableSPDI = TRUE; 00839 } else 00840 if (strcmp(token, "DISABLESPDIFI")==0) { 00841 cmiData.enableSPDI = FALSE; 00842 } else 00843 if (strcmp(token, "UNINSTALL")==0) { 00844 performUninstall(); 00845 } 00846 return FALSE; 00847 } 00848 00849 int parseArguments(LPSTR szCmdLine) { 00850 BOOL inToken = false; 00851 int i = 0, j; 00852 char token[MAX_TOKEN_SIZE]; 00853 00854 if (!openDevice()) { 00855 return FALSE; 00856 } 00857 00858 if (!getDriverData(&cmiTopologyDev)) { 00859 PrintLastError("getDriverData()"); 00860 return FALSE; 00861 } 00862 if (!getCurrentChannelConfig()) { 00863 PrintLastError("getCurrentChannelConfig()"); 00864 return FALSE; 00865 } 00866 00867 while (szCmdLine[i]) { 00868 if (inToken) { 00869 if (szCmdLine[i] == ' ') { 00870 inToken = false; 00871 token[j] = 0; 00872 if (checkToken(token)) { 00873 return TRUE; 00874 } 00875 } else { 00876 token[j] = (char)toupper(szCmdLine[i]); 00877 if (j < MAX_TOKEN_SIZE-1) { 00878 j++; 00879 } 00880 } 00881 } else { 00882 if ((szCmdLine[i] == '-') || (szCmdLine[i] == '/')) { 00883 j = 0; 00884 inToken = true; 00885 } 00886 } 00887 00888 i++; 00889 } 00890 token[j] = 0; 00891 checkToken(token); 00892 return (setDriverData(&cmiTopologyDev) && setCurrentChannelConfig()); 00893 } 00894 00895 void InitURLControl() 00896 { 00897 WNDCLASSEX wce; 00898 00899 ZeroMemory(&wce, sizeof(wce)); 00900 wce.cbSize = sizeof(WNDCLASSEX); 00901 if (GetClassInfoEx(hInst, "Static", &wce)==0) { 00902 PrintLastError("GetClassInfoEx()"); 00903 return; 00904 } 00905 00906 wce.hCursor = LoadCursor(NULL, IDC_HAND); 00907 wce.hInstance = hInst; 00908 wce.lpszClassName = "URLLink"; 00909 if (RegisterClassEx(&wce) == 0) { 00910 PrintLastError("RegisterClassEx()"); 00911 } 00912 00913 } 00914 00915 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 00916 { 00917 WNDCLASSEX wce; 00918 MSG msg; 00919 00920 ZeroMemory(&cmiData, sizeof(CMIDATA)); 00921 ZeroMemory(&cmiTopologyDev, sizeof(CMIDEV)); 00922 hWave = NULL; 00923 00924 if (szCmdLine) { 00925 if (strlen(szCmdLine) > 0) { 00926 int result = parseArguments(szCmdLine); 00927 cleanUp(); 00928 return result; 00929 } 00930 } 00931 00932 if (hWndMain = FindWindow("cmiControlPanel", NULL)) { 00933 SetForegroundWindow(hWndMain); 00934 return FALSE; 00935 } 00936 00937 hInst = hInstance; 00938 InitCommonControls(); 00939 CoInitialize(NULL); 00940 00941 ZeroMemory(&wce, sizeof(WNDCLASSEX)); 00942 wce.cbSize = sizeof(WNDCLASSEX); 00943 wce.lpfnWndProc = DefDlgProc; 00944 wce.style = 0; 00945 wce.cbWndExtra = DLGWINDOWEXTRA; 00946 wce.hInstance = hInstance; 00947 wce.hCursor = LoadCursor(NULL, IDC_ARROW); 00948 wce.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); 00949 wce.lpszClassName = "cmiControlPanel"; 00950 wce.lpszMenuName = NULL; 00951 wce.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); 00952 wce.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); 00953 if(!RegisterClassEx(&wce)) { 00954 PrintLastError("RegisterClassEx()"); 00955 return -1; 00956 } 00957 InitURLControl(); 00958 00959 hWndMain = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)WndProc, NULL); 00960 if (!hWndMain) { 00961 PrintLastError("CreateDialogParam()"); 00962 return -1; 00963 } 00964 00965 while (GetMessage(&msg, (HWND) NULL, 0, 0)) { 00966 TranslateMessage(&msg); 00967 DispatchMessage(&msg); 00968 } 00969 return 0; 00970 } Generated on Sat May 26 2012 04:27:13 for ReactOS by
1.7.6.1
|