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

SCSI/ASPI

开发平台:

WINDOWS

  1. /*
  2.  * mp3dlg.c - Copyright (C) 1999,2000 Jay A. Key
  3.  *
  4.  * The MP3 options dialog for the options property sheet.  Allows the 
  5.  * user to set the output bitrate, and enable CRC and ID3v1 tagging.
  6.  *
  7.  **********************************************************************
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22.  *
  23.  */
  24. #include <windows.h>
  25. #include <commctrl.h>
  26. #include "resources.h"
  27. #include "globals.h"
  28. void ConfigureMP3Dlg( HWND hWnd );
  29. BOOL ValidateMP3Dlg( HWND hWnd );
  30. int GetEncoder( HWND hWnd );
  31. BOOL LoadEncoderFunctions( ENCODER nEncoder );
  32. // save old settings for output dialog config
  33. static BOOL bCRCTmp;
  34. static BOOL bID3Tmp;
  35. static BOOL bPrivateTmp;
  36. static BOOL bOriginalTmp;
  37. static BOOL bCopyrightTmp;
  38. static WORD wTmpBitrate;
  39. static WORD wTmpMaxBitrate;
  40. static int  iTmpEncoder;
  41. static int iEncoders[5];
  42. static BOOL bTmpVBR;
  43. static BOOL bTmpVBRHeader;
  44. static MPEG_QUALITY nTmpQuality;
  45. static INT  nTmpVBRQuality;
  46. static BOOL bInInit = FALSE;
  47. static BOOL bListsInit = FALSE;
  48. #define NUMBITRATES 14
  49. static WORD bitrates[NUMBITRATES] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 };
  50. /*
  51.  * Called in response to PSN_KILLACTIVE.  Should validate all values in the
  52.  * dialog, and save them to the temp variables.
  53.  */
  54. BOOL ValidateMP3Dlg( HWND hWnd )
  55. {
  56.   hWnd = hWnd;
  57.   return TRUE;
  58. }
  59. /*
  60.  * Called in response to PSN_SETACTIVE.  Sets dialog items with the values
  61.  * from the temp variables.
  62.  */
  63. void ConfigureMP3Dlg( HWND hWnd )
  64. {
  65.   int i;
  66.   BOOL bCFound = FALSE;
  67.   BOOL bMFound = FALSE;
  68.   char buf[32];
  69.   bInInit = FALSE;
  70.   CheckDlgButton( hWnd, IDCKB_CRC, bCRCTmp?BST_CHECKED:BST_UNCHECKED );
  71.   CheckDlgButton( hWnd, IDCKB_ID3, bID3Tmp?BST_CHECKED:BST_UNCHECKED );
  72.   CheckDlgButton( hWnd, IDCKB_ORIGINAL, bOriginalTmp?BST_CHECKED:BST_UNCHECKED );
  73.   CheckDlgButton( hWnd, IDCKB_PRIVATE, bPrivateTmp?BST_CHECKED:BST_UNCHECKED );
  74.   CheckDlgButton( hWnd, IDCKB_COPYRIGHT, bCopyrightTmp?BST_CHECKED:BST_UNCHECKED );
  75.   CheckDlgButton( hWnd, IDCKB_VBR, bTmpVBR?BST_CHECKED:BST_UNCHECKED );
  76.   CheckDlgButton( hWnd, IDCKB_VBRHEADER, bTmpVBRHeader?BST_CHECKED:BST_UNCHECKED );
  77.   if ( !bListsInit )
  78.     {
  79.       SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_ADDSTRING, 0, (LPARAM)"Normal" );
  80.       SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_ADDSTRING, 0, (LPARAM)"Low" );
  81.       SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_ADDSTRING, 0, (LPARAM)"High" );
  82.       SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_ADDSTRING, 0, (LPARAM)"Voice" );
  83.       SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_SETCURSEL, (WPARAM)nTmpQuality, 0L );
  84.       for( i = 0; i < 10; i++ )
  85. {
  86.   wsprintf( buf, "%d", i );
  87.   SendDlgItemMessage( hWnd, IDCBX_VBRQUALITY, CB_ADDSTRING, 0, (LPARAM)buf );
  88. }
  89.       SendDlgItemMessage( hWnd, IDCBX_VBRQUALITY, CB_SETCURSEL, (WPARAM)nVBRQuality, 0L );
  90.       for( i = 0; i < NUMBITRATES; i++ )
  91. {
  92.   wsprintf( buf, "%d", bitrates[i] );
  93.   SendDlgItemMessage( hWnd, IDCBX_CBITRATE, CB_ADDSTRING, 0, (LPARAM)buf );
  94.   SendDlgItemMessage( hWnd, IDCBX_MBITRATE, CB_ADDSTRING, 0, (LPARAM)buf );
  95. }
  96.       i = 0;
  97.       bListsInit = TRUE;
  98.       if ( hBladeDll )
  99. {
  100.   iEncoders[i++] = BLADE_ENC_DLL;
  101.   SendDlgItemMessage( hWnd, IDCBX_ENCODER, CB_ADDSTRING, 0, (LPARAM)"BladeEnc DLL" );
  102. }
  103.       if ( hLameDll )
  104. {
  105.   iEncoders[i++] = LAME_ENC_DLL;   
  106.   SendDlgItemMessage( hWnd, IDCBX_ENCODER, CB_ADDSTRING, 0, (LPARAM)"Lame_Enc DLL" );
  107. }
  108.     }
  109.   switch( iEncoder )
  110.     {
  111.     case BLADE_ENC_DLL:
  112.       SendDlgItemMessage( hWnd, IDCBX_ENCODER, CB_SELECTSTRING, -1, (LPARAM)"BladeEnc DLL" );
  113.       break;
  114.     case LAME_ENC_DLL:
  115.       SendDlgItemMessage( hWnd, IDCBX_ENCODER, CB_SELECTSTRING, -1, (LPARAM)"Lame_Enc DLL" );
  116.       break;
  117.     case NOENCODER:
  118.     default:
  119.       break;
  120.     }
  121.   for( i = 0; (i < NUMBITRATES); i++ )
  122.     {
  123.       if ( wTmpBitrate == bitrates[i] )
  124. {
  125.   SendDlgItemMessage( hWnd, IDCBX_CBITRATE, CB_SETCURSEL, (WPARAM)i, 0L );
  126.   bCFound = TRUE;
  127. }
  128.       if ( wTmpMaxBitrate == bitrates[i] )
  129. {
  130.   SendDlgItemMessage( hWnd, IDCBX_MBITRATE, CB_SETCURSEL, (WPARAM)i, 0L );
  131.   bMFound = TRUE;
  132. }
  133.     }
  134.   // if we didn't match any of the valid bitrates (ie, someone used regedit
  135.   // to change the default value in the registry), set to 128 kbps.
  136.   if ( !bCFound && !bMFound )
  137.     {
  138.       wBitrate = wTmpBitrate = wMaxBitrate = wTmpBitrate = 128;
  139.       SendDlgItemMessage( hWnd, IDCBX_CBITRATE, CB_SETCURSEL, (WPARAM)8, 0L );
  140.       SendDlgItemMessage( hWnd, IDCBX_MBITRATE, CB_SETCURSEL, (WPARAM)8, 0L );
  141.     }
  142.   bInInit = TRUE;
  143. }
  144. BOOL CALLBACK MP3DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
  145.      LPARAM lParam )
  146. {
  147.   //  char buf[81];
  148.   NMHDR *l = (NMHDR *)lParam;
  149.   WORD wID;
  150.   WORD wNotify;
  151.   BOOL bChanged;
  152.   int i;
  153.   switch( uMsg )
  154.     {
  155.     case WM_INITDIALOG:
  156.       //hOutDlg = hWnd;
  157.       break;
  158.     case WM_COMMAND:
  159.       wID = LOWORD( wParam );
  160.       wNotify = HIWORD( wParam );
  161.       bChanged = TRUE;
  162.       switch( wID )
  163. {
  164. case IDCKB_ID3:
  165.   bID3Tmp = !bID3Tmp;
  166.   break;
  167. case IDCKB_CRC:
  168.   bCRCTmp = !bCRCTmp;
  169.   break;
  170. case IDCKB_ORIGINAL:
  171.   bOriginalTmp = !bOriginalTmp;
  172.   break;
  173. case IDCKB_PRIVATE:
  174.   bPrivateTmp = !bPrivateTmp;
  175.   break;
  176. case IDCKB_COPYRIGHT:
  177.   bCopyrightTmp = !bCopyrightTmp;
  178.   break;
  179. case IDCKB_VBR:
  180.   bTmpVBR = !bTmpVBR;
  181.   break;
  182. case IDCKB_VBRHEADER:
  183.   bTmpVBRHeader = !bTmpVBRHeader;
  184.   break;
  185. case IDCBX_CBITRATE:
  186.   if ( wNotify == CBN_SELCHANGE )
  187.     {
  188.       i = SendDlgItemMessage( hWnd, IDCBX_CBITRATE, CB_GETCURSEL, 0, 0L );
  189.       wTmpBitrate = bitrates[i];
  190.     }
  191.   else
  192.     bChanged = FALSE;
  193.   break;
  194. case IDCBX_MBITRATE:
  195.   if ( wNotify == CBN_SELCHANGE )
  196.     {
  197.       i = SendDlgItemMessage( hWnd, IDCBX_MBITRATE, CB_GETCURSEL, 0, 0L );
  198.       wTmpMaxBitrate = bitrates[i];
  199.     }
  200.   else
  201.     bChanged = FALSE;
  202.   break;
  203. case IDCBX_ENCODER:
  204.   if ( wNotify == CBN_SELCHANGE )
  205.     iTmpEncoder = GetEncoder( hWnd );
  206.   else
  207.     bChanged = FALSE;
  208.   break;
  209. case IDCBX_QUALITY:
  210.   if ( wNotify == CBN_SELCHANGE )
  211.     nTmpQuality = SendDlgItemMessage( hWnd, IDCBX_QUALITY, CB_GETCURSEL, 0, 0L );
  212.   else
  213.     bChanged = FALSE;
  214.   break;
  215.   
  216. case IDCBX_VBRQUALITY:
  217.   if ( wNotify == CBN_SELCHANGE )
  218.     nTmpVBRQuality = SendDlgItemMessage( hWnd, IDCBX_VBRQUALITY, CB_GETCURSEL, 0, 0L );
  219.   else
  220.     bChanged = FALSE;
  221.   break;
  222.   
  223. default:
  224.   break;
  225. }
  226.       if ( bInInit && bChanged )
  227. SendMessage( (HWND)GetWindowLong( hWnd, GWL_HWNDPARENT ),
  228.      PSM_CHANGED, (WPARAM)hWnd, 0L );
  229.       break;
  230.     case WM_NOTIFY:
  231.       switch( l->code )
  232. {
  233. case PSN_SETACTIVE:  // sent before page is shown
  234.   ConfigureMP3Dlg( hWnd );
  235.   break;
  236. case PSN_KILLACTIVE:  //losing focus
  237.   if ( ValidateMP3Dlg( hWnd ) )
  238.     // ok to lose focus
  239.     SetWindowLong( hWnd, DWL_MSGRESULT, FALSE );
  240.   else
  241.     {
  242.       // don't use allow loss of focus
  243.       SetWindowLong( hWnd, DWL_MSGRESULT, TRUE );
  244.       return TRUE;
  245.     }
  246.   break;
  247. case PSN_QUERYCANCEL:
  248.   break;
  249. case PSN_APPLY:
  250.   bCRC = bCRCTmp;
  251.   bID3 = bID3Tmp;
  252.   bOriginal = bOriginalTmp;
  253.   bCopyright = bCopyrightTmp;
  254.   bPrivate = bPrivateTmp;
  255.   wBitrate = wTmpBitrate;
  256.   wMaxBitrate = wTmpMaxBitrate;
  257.   iEncoder = iTmpEncoder;
  258.   LoadEncoderFunctions( iEncoder );
  259.   bVBR = bTmpVBR;
  260.   bVBRHeader = bTmpVBRHeader;
  261.   nQuality = nTmpQuality;
  262.   nVBRQuality = nTmpVBRQuality;
  263.   break;
  264. case PSN_HELP:
  265.   break;
  266. case PSN_RESET:
  267.   break;
  268. default:
  269.   break;
  270. }
  271.       break;
  272.     }
  273.   return FALSE;
  274. }
  275. /*
  276.  * Used to initialize the values in the dialog.  If bGet is TRUE, values are
  277.  * read and stored in tmp variables.  Otherwise, the values of the tmp vars
  278.  * are written to the dialogs values.
  279.  */
  280. void GetSetMP3DlgCurrentVals( BOOL bGet )
  281. {
  282.   if ( bGet )
  283.     {
  284.       bCRCTmp = bCRC;
  285.       bID3Tmp = bID3;
  286.       bOriginalTmp = bOriginal;
  287.       bCopyrightTmp = bCopyright;
  288.       bPrivateTmp = bPrivate;
  289.       wTmpBitrate = wBitrate;
  290.       wTmpMaxBitrate = wMaxBitrate;
  291.       iTmpEncoder = iEncoder;
  292.       bListsInit = FALSE;
  293.       bTmpVBR = bVBR;
  294.       bTmpVBRHeader = bVBRHeader;
  295.       nTmpQuality = nQuality;
  296.       nTmpVBRQuality = nVBRQuality;
  297.     }
  298.   else
  299.     {
  300.       bCRC = bCRCTmp;
  301.       bID3 = bID3Tmp;
  302.       bOriginal = bOriginalTmp;
  303.       bCopyright = bCopyrightTmp;
  304.       bPrivate = bPrivateTmp;
  305.       wBitrate = wTmpBitrate;
  306.       wMaxBitrate = wTmpMaxBitrate;
  307.       iEncoder = iTmpEncoder;
  308.       bVBR = bTmpVBR;
  309.       bVBRHeader = bTmpVBRHeader;
  310.       nQuality = nTmpQuality;
  311.       nVBRQuality = nTmpVBRQuality;
  312.     }
  313. }
  314. int GetEncoder( HWND hWnd )
  315. {
  316.   int i;
  317.   i = SendDlgItemMessage( hWnd, IDCBX_ENCODER, CB_GETCURSEL, 0, 0L );
  318.   if ( i < 0 || i >= 5 )
  319.     return iTmpEncoder;
  320.   return iEncoders[i];
  321. }