cddlg.c
上传用户:xmgzy123
上传日期:2007-01-07
资源大小:373k
文件大小:11k
源码类别:

SCSI/ASPI

开发平台:

WINDOWS

  1. /*
  2.  * cddlg.c - Copyright (C) 1999,2000 Jay A. Key
  3.  *
  4.  * CD configuration dialog for options property sheet.
  5.  *
  6.  **********************************************************************
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21.  *
  22.  */
  23. #include <windows.h>
  24. #include <commctrl.h>
  25. #include "resources.h"
  26. #include "globals.h"
  27. HCDROM openCDHandle( int idx );
  28. BYTE getReadType( void );
  29. // save old settings for CD configuration
  30. static DWORD tmpReadMode;           // jitter correction mode
  31. static DWORD tmpMaxRip;             // number of frames to read at once
  32. static DWORD tmpJitterCheck;        // # of frames to match for jitter corr.
  33. static DWORD tmpNumOverlap;         // # of frames to overlap for jitter corr.
  34. static int   tmpCdlistIdx;          // index of selected CD unit (in cdlist)
  35. static BOOL tmpAutoTOC;             // automatically scan TOC of CD-ROM
  36. static BOOL tmpAutoCheck;           // automatically check all tracks
  37. static BOOL tmpReadType;            // read algorithm to use
  38. static BOOL bCDInit;                // set to TRUE while initializing
  39. static BOOL bCDListInit = FALSE;    // have we already filled the combo-boxes?
  40. static HWND hCDDlg = NULL;          // cd-options dialog handle
  41. /*
  42.  * This array defines the mapping between items in the drive type combobox
  43.  * and the read function to use for GetCDHandle().  There are seven items in 
  44.  * the combobox.  For example, selecting item 5 in the combobox will map to
  45.  * read type 6 (CDR_READ_D4).
  46.  *
  47.  * It is necessary because CDR_READ6 is not implemented in the current version,
  48.  * and defaults to CDR_READ10.  Future versions may deprecate the CDR_READ6
  49.  * mode entirely.
  50.  *
  51.  *   Index  Value  Type          Text
  52.  *       0      0  CDR_ANY       Autodetect
  53.  *       1      1  CDR_ATAPI1    ATAPI (1)
  54.  *       2      2  CDR_ATAPI2    ATAPI (2)
  55.  *       3      4  CDR_READ10    SCSI - Generic
  56.  *       4      5  CDR_READ_D8   SCSI - Plextor
  57.  *       5      6  CDR_READ_D4   SCSI - NEC
  58.  *       6      7  CDR_READ_D_1  SCSI - NEC(2)
  59.  *       7      8  CDR_READ10_2  SCSI - Generic(2)
  60.  */
  61. #define NUMDRVTYPES 9
  62. // maps drive type to index in combobox
  63. // drvtypeidx[drivetype] = comboboxindex
  64. static int drvtypeidx[NUMDRVTYPES] = { 0, 1, 2, 3, 3, 4, 5, 6, 7 };
  65. /*
  66.  * Performs any necessary validation.  Reads the values from the dialog into
  67.  * local variables, and validates them.  If they pass, the values are stored
  68.  * in the static temp variables.
  69.  */
  70. BOOL ValidateCDDlg( HWND hWnd )
  71. {
  72.   if ( tmpReadMode != CDRM_NOJITTER )
  73.     {
  74.       if ( (tmpNumOverlap < tmpJitterCheck + 2)
  75.    || (tmpNumOverlap >= tmpMaxRip) )
  76. {
  77.   MessageBox( hWnd, "Invalid Jitter Correction Settings!",
  78.       "X-Tractor",
  79.       MB_APPLMODAL | MB_ICONERROR | MB_OK );
  80.   return FALSE;
  81. }
  82.     }
  83.   return TRUE;
  84. }
  85. void ConfigureCDDlg( HWND hWnd )
  86. {
  87.   BYTE i;
  88.   hCDDlg = hWnd;
  89.   bCDInit = FALSE;
  90.   switch( tmpReadMode )
  91.     {
  92.     case CDRM_NOJITTER:
  93.       SendDlgItemMessage( hWnd, IDE_NUMOVER, WM_ENABLE, (WPARAM)FALSE, 0L );
  94.       SendDlgItemMessage( hWnd, IDE_NUMCHECK, WM_ENABLE, (WPARAM)FALSE, 0L );
  95.       CheckRadioButton( hWnd, IDRBN_ALWAYS, IDRBN_NEVER, IDRBN_NEVER );
  96.       break;
  97.     case CDRM_JITTER:
  98.       CheckRadioButton( hWnd, IDRBN_ALWAYS, IDRBN_NEVER, IDRBN_ALWAYS );
  99.       break;
  100.     default:
  101.     case CDRM_JITTERONERR:
  102.       tmpReadMode = CDRM_JITTERONERR;
  103.       CheckRadioButton( hWnd, IDRBN_ALWAYS, IDRBN_NEVER, IDRBN_ONERR );
  104.       break;
  105.     }
  106.   CheckDlgButton( hWnd, IDCKB_AUTOTOC, bAutoTOC?BST_CHECKED:BST_UNCHECKED );
  107.   CheckDlgButton( hWnd, IDCKB_AUTOCHECK, bAutoCheck?BST_CHECKED:BST_UNCHECKED );
  108.   SetDlgItemInt( hWnd, IDE_NUMREAD, tmpMaxRip, FALSE );
  109.   SetDlgItemInt( hWnd, IDE_NUMCHECK, tmpJitterCheck, FALSE );
  110.   SetDlgItemInt( hWnd, IDE_NUMOVER, tmpNumOverlap, FALSE );
  111.   if ( tmpCdlistIdx == -1 )
  112.     tmpCdlistIdx = 0;
  113.   SendDlgItemMessage( hWnd, IDCBX_CDLIST, CB_SETCURSEL, (WPARAM)tmpCdlistIdx,
  114.       0L );
  115.   if ( !bCDListInit )
  116.     {
  117.       for( i = 0; i < cdlist.num; i++ )
  118. SendDlgItemMessage( hWnd, IDCBX_CDLIST, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)cdlist.cd[i].id );
  119.       bCDListInit = TRUE;
  120.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"Autodetect" );
  121.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"ATAPI (1)" );
  122.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"ATAPI (2)" );
  123.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"SCSI - Generic" );
  124.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"SCSI - Plextor" );
  125.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"SCSI - NEC" );
  126.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"SCSI - NEC(2)" );
  127.       SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)"SCSI - Generic(2)" );
  128.     }
  129.   if ( cdlistIdx != -1 )
  130.     SendDlgItemMessage( hWnd, IDCBX_CDLIST, CB_SETCURSEL, (WPARAM)cdlistIdx,
  131. 0L );
  132.   else
  133.     SendDlgItemMessage( hWnd, IDCBX_CDLIST, CB_SETCURSEL, 0, 0L );
  134.   if ( tmpReadType > 8 )
  135.     tmpReadType = 0;
  136.   SendDlgItemMessage( hWnd, IDCBX_DRVTYPE, CB_SETCURSEL,
  137.       (WPARAM)drvtypeidx[tmpReadType], 0L );
  138.   bCDInit = TRUE;
  139. }
  140. BOOL CALLBACK CDDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  141.      LPARAM lParam )
  142. {
  143.   //char buf[81];
  144.   NMHDR *l = (NMHDR *)lParam;
  145.   WORD wID;
  146.   WORD wNotify;
  147.   BOOL bChanged;
  148.   switch( uMsg )
  149.     {
  150.     case WM_COMMAND:
  151.       wID = LOWORD( wParam );
  152.       wNotify = HIWORD( wParam );
  153.       bChanged = TRUE;
  154.       switch( wID )
  155. {
  156. case IDE_NUMREAD:
  157.   if ( wNotify == EN_CHANGE )
  158.     tmpMaxRip = GetDlgItemInt( hWnd, IDE_NUMREAD, NULL, FALSE );
  159.   else
  160.     bChanged = FALSE;
  161.   break;
  162. case IDE_NUMCHECK:
  163.   if ( wNotify == EN_CHANGE )
  164.     tmpJitterCheck = GetDlgItemInt( hWnd, IDE_NUMCHECK, NULL, FALSE );
  165.   else
  166.     bChanged = FALSE;
  167.   break;
  168. case IDE_NUMOVER:
  169.   if ( wNotify == EN_CHANGE )
  170.     tmpNumOverlap = GetDlgItemInt( hWnd, IDE_NUMOVER, NULL, FALSE );
  171.   else
  172.     bChanged = FALSE;
  173.   break;
  174. case IDRBN_NEVER:
  175.   tmpReadMode = CDRM_NOJITTER;
  176.   SendDlgItemMessage( hWnd, IDE_NUMOVER, WM_ENABLE, (WPARAM)FALSE, 0L );
  177.   SendDlgItemMessage( hWnd, IDE_NUMCHECK, WM_ENABLE, (WPARAM)FALSE, 0L );
  178.   break;
  179. case IDRBN_ONERR:
  180.   tmpReadMode = CDRM_JITTERONERR;
  181.   SendDlgItemMessage( hWnd, IDE_NUMOVER, WM_ENABLE, (WPARAM)TRUE, 0L );
  182.   SendDlgItemMessage( hWnd, IDE_NUMCHECK, WM_ENABLE, (WPARAM)TRUE, 0L );
  183.   break;
  184. case IDRBN_ALWAYS:
  185.   tmpReadMode = CDRM_JITTER;
  186.   SendDlgItemMessage( hWnd, IDE_NUMOVER, WM_ENABLE, (WPARAM)TRUE, 0L );
  187.   SendDlgItemMessage( hWnd, IDE_NUMCHECK, WM_ENABLE, (WPARAM)TRUE, 0L );
  188.   break;
  189. case IDBN_RESET:
  190.   tmpMaxRip = 26;
  191.   tmpNumOverlap = 3;
  192.   tmpJitterCheck = 1;
  193.   tmpReadMode = CDRM_JITTER;
  194.   ConfigureCDDlg( hWnd );
  195.   break;
  196. case IDCKB_AUTOTOC:
  197.   tmpAutoTOC = !tmpAutoTOC;
  198.   break;
  199. case IDCKB_AUTOCHECK:
  200.   tmpAutoCheck = !tmpAutoCheck;
  201.   break;
  202. case IDCBX_DRVTYPE:
  203.   if ( wNotify == CBN_SELCHANGE )
  204.     tmpReadType = getReadType();
  205.   else
  206.     bChanged = FALSE;
  207.   break;
  208. case IDCBX_CDLIST:
  209.   if ( wNotify == CBN_SELCHANGE )
  210.     tmpCdlistIdx = SendDlgItemMessage( hWnd, IDCBX_CDLIST,
  211.        CB_GETCURSEL, 0, 0L );
  212.   else
  213.     bChanged = FALSE;
  214.   break;
  215. default:
  216.   bChanged = FALSE;
  217.   break;
  218. }
  219.       if ( bCDInit && bChanged )
  220. SendMessage( (HWND)GetWindowLong( hWnd, GWL_HWNDPARENT ),
  221.      PSM_CHANGED, (WPARAM)hWnd, 0L );
  222.       break;
  223.     case WM_NOTIFY:
  224.       switch( l->code )
  225. {
  226. case PSN_SETACTIVE:  // sent before page is shown
  227.   ConfigureCDDlg( hWnd );
  228.   break;
  229. case PSN_KILLACTIVE:  //losing focus (including clicking on Apply)
  230. #if 1
  231.   if ( ValidateCDDlg( hWnd ) )
  232.     // ok to lose focus
  233.     SetWindowLong( hWnd, DWL_MSGRESULT, FALSE );
  234.   else
  235.     {
  236.       SetWindowLong( hWnd, DWL_MSGRESULT, TRUE );
  237.       return TRUE;
  238.     }
  239. #endif
  240.   break;
  241. case PSN_QUERYCANCEL:
  242.   break;
  243. case PSN_APPLY:
  244.   bReadType    = tmpReadType;
  245.   if ( hCD )
  246.     CloseCDHandle( hCD );
  247.   hCD = NULL;
  248.   readMode     = tmpReadMode;
  249.   numOverlap   = tmpNumOverlap;
  250.   jitterCheck  = tmpJitterCheck;
  251.   maxRip       = tmpMaxRip;
  252.   bAutoTOC     = tmpAutoTOC;
  253.           bAutoCheck   = tmpAutoCheck;
  254.   cdlistIdx    = tmpCdlistIdx;
  255.   break;
  256. case PSN_HELP:
  257.   break;
  258. case PSN_RESET:
  259.   break;
  260. default:
  261.   break;
  262. }
  263.       break;
  264.     }
  265.   return FALSE;
  266. }
  267. /*
  268.  * Used to initialize the values in the dialog.  If bGet is TRUE, values are
  269.  * read and stored in tmp variables.  Otherwise, the values of the tmp vars
  270.  * are written to the application's global variables.
  271.  */
  272. void GetSetCDDlgCurrentVals( BOOL bGet )
  273. {
  274.   if ( bGet )
  275.     {
  276.       tmpReadMode = readMode;
  277.       tmpNumOverlap = numOverlap;
  278.       tmpJitterCheck = jitterCheck;
  279.       tmpMaxRip = maxRip;
  280.       tmpCdlistIdx = cdlistIdx;
  281.       bCDListInit = FALSE;
  282.       tmpAutoTOC = bAutoTOC;
  283.       tmpAutoCheck = bAutoCheck;
  284.       tmpReadType = bReadType;
  285.     }
  286.   else
  287.     {
  288.       readMode = tmpReadMode;
  289.       numOverlap = tmpNumOverlap;
  290.       jitterCheck = tmpJitterCheck;
  291.       maxRip = tmpMaxRip;
  292.       // if either a new cd unit is selected, or a new read algorithm
  293.       // is selected, we have to close the current CD handle and open a
  294.       // new one.
  295.       if ( hCD &&
  296.    ( (cdlistIdx != tmpCdlistIdx) || (tmpReadType != bReadType) ) )
  297. {
  298.   CloseCDHandle( hCD );
  299.   hCD = NULL;
  300. }
  301.       bReadType = tmpReadType;
  302.       cdlistIdx = tmpCdlistIdx;
  303.       if ( !hCD )
  304. hCD = openCDHandle( cdlistIdx );
  305.       bAutoTOC = tmpAutoTOC;
  306.       bAutoCheck = tmpAutoCheck;
  307.     }
  308. }
  309. HCDROM openCDHandle( int idx )
  310. {
  311.   GETCDHAND cdh;
  312.   ZeroMemory( &cdh, sizeof(cdh) );
  313.   cdh.size        = sizeof(GETCDHAND);
  314.   cdh.ver         = 1;
  315.   cdh.ha          = cdlist.cd[idx].ha;
  316.   cdh.tgt         = cdlist.cd[idx].tgt;
  317.   cdh.lun         = cdlist.cd[idx].lun;
  318.   cdh.readType    = bReadType;
  319.   cdh.numOverlap  = numOverlap;
  320.   cdh.numJitter   = jitterCheck;
  321.   return GetCDHandle( &cdh );
  322. }
  323. BYTE getReadType( void )
  324. {
  325.   BYTE bTmp, i;
  326.   bTmp = SendDlgItemMessage( hCDDlg, IDCBX_DRVTYPE, CB_GETCURSEL, 0, 0L );
  327.   for( i = 0; i < NUMDRVTYPES; i++ )
  328.     if ( drvtypeidx[i] == bTmp )
  329.       return i;
  330.   return 0;
  331. }