ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

main.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.