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

SCSI/ASPI

开发平台:

WINDOWS

  1. /*
  2.  * ripseg.c - Copyright (C) 2000 Jay A. Key
  3.  *
  4.  * Code to handle ripping absolute segments.
  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 "trackwnd.h"
  26. #include "resources.h"
  27. #include "globals.h"
  28. #include "rangeslider.h"
  29. typedef struct {
  30.   TOC toc;
  31.   LPADDTRACK addTrack;
  32. } RSDWINDOW, FAR *LPRSDWINDOW;
  33. BOOL RipTrackSegmentDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  34. BOOL CALLBACK RipSegmentDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  35. void InitializeSliders( HWND hWnd );
  36. void MSB2DWORD( DWORD *d, BYTE *b );
  37. char *scrollString( int nCode );
  38. int InitRangeSliderClass( void );
  39. BOOL ripsegHandleSliderNotify( HWND hWnd, LPARAM lParam );
  40. char *ripsegGenAddressString( HWND hWnd, DWORD addr, char *buf, int len );
  41. char *ripsegGenLenString( HWND hWnd, DWORD addr, char *buf, int len );
  42. BOOL ripsegSaveValues( HWND hWnd );
  43. void ripsegSetAddressText( HWND hWnd, DWORD addr, BOOL bStart );
  44. static BOOL bInitClass = FALSE;
  45. static int segno = 0;
  46. BOOL RipTrackSegment( HWND hParent, HWND hTrckWnd )
  47. {
  48.   ADDTRACK addTrack;
  49.   if ( !bInitClass && !InitRangeSliderClass( ) )
  50.     return FALSE;
  51.   bInitClass = TRUE;
  52.   if ( DialogBoxParam( ghInstance, "RipSegmentDialog", hParent, (DLGPROC)RipSegmentDlgProc, (LPARAM)&addTrack ) )
  53.     {
  54.       DialogBoxParam( ghInstance, "RipTrackDialog", hParent, (DLGPROC)RipTrackSegmentDlgProc, (LPARAM)&addTrack );
  55.     }
  56.   return TRUE;
  57. }
  58. BOOL CALLBACK RipSegmentDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  59. {
  60.   NMHDR *l;
  61.   LPRSDWINDOW lpw;
  62.   switch( uMsg )
  63.     {
  64.     case WM_INITDIALOG:
  65.       lpw = (LPRSDWINDOW)GlobalAlloc( GPTR, sizeof(RSDWINDOW) );
  66.       lpw->addTrack = (LPADDTRACK)lParam;
  67.       SetWindowLong( hWnd, GWL_USERDATA, (LONG)lpw );
  68.       // set values for ID_STARTSLIDER and ID_ENDSLIDER
  69.       InitializeSliders( hWnd );
  70.       break;
  71.     case WM_DESTROY:
  72.       l = (NMHDR *)GetWindowLong( hWnd, GWL_USERDATA );
  73.       if ( l )
  74. GlobalFree( (HGLOBAL)l );
  75.       break;
  76.     case WM_COMMAND:
  77.       switch( LOWORD(wParam) )
  78. {
  79. case IDE_START:
  80.   if ( HIWORD(wParam) == EN_KILLFOCUS )
  81.     {
  82.       DWORD d;
  83.       d = GetDlgItemInt( hWnd, IDE_START, NULL, FALSE );
  84.       SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETSTART, TRUE, d );
  85.       ripsegSetAddressText( hWnd, d, TRUE );
  86.     }
  87.   break;
  88. case IDE_FINISH:
  89.   if ( HIWORD(wParam) == EN_KILLFOCUS )
  90.     {
  91.       DWORD d;
  92.       d = GetDlgItemInt( hWnd, IDE_FINISH, NULL, FALSE );
  93.       SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETFINISH, TRUE, d );
  94.       ripsegSetAddressText( hWnd, d, FALSE );
  95.     }
  96.   break;
  97. case IDCANCEL:
  98. case IDBN_RIPSEGCANCEL:
  99.   EndDialog( hWnd, 0 );
  100.   break;
  101. case IDBN_RIPSEGOK:
  102.   if ( ripsegSaveValues( hWnd ) )
  103.     EndDialog( hWnd, 1 );
  104.   break;
  105. }
  106.       break;
  107.     case WM_NOTIFY:
  108.       l = (NMHDR *)lParam;
  109.       if ( l->idFrom == ID_SLIDER )
  110. return ripsegHandleSliderNotify( hWnd, lParam );
  111.     default:
  112.       return FALSE;
  113.     }
  114.   return TRUE;
  115. }
  116. /*
  117.  * Sets the initial range and positions of the sliders based on the CD which
  118.  * is in the drive
  119.  */
  120. void InitializeSliders( HWND hWnd )
  121. {
  122.   LPTOC toc;
  123.   LPRSDWINDOW lpw;
  124.   BOOL bMSF;
  125.   DWORD dwAddr, dwLen;
  126.   BYTE i;
  127.   char buf[128];
  128.   lpw = (LPRSDWINDOW)GetWindowLong( hWnd, GWL_USERDATA );
  129.   toc = &lpw->toc;
  130.   bMSF = QueryCDParms( hCD, CDP_MSF, NULL );
  131.   ModifyCDParms( hCD, CDP_MSF, (DWORD)FALSE );
  132.   ReadTOC( hCD, toc );
  133.   ModifyCDParms( hCD, CDP_MSF, (DWORD)bMSF );
  134.   if ( toc->firstTrack == toc->lastTrack )
  135.     return;
  136.   MSB2DWORD( &dwAddr, toc->tracks[0].addr );
  137.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETMIN, 0, dwAddr );
  138.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETTIC, 0, dwAddr );
  139.   MSB2DWORD( &dwAddr, toc->tracks[toc->lastTrack - toc->firstTrack+1].addr );
  140.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETMAX, 0, dwAddr );
  141.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETTIC, 0, dwAddr );
  142.   for( i = toc->firstTrack + 1; i < toc->lastTrack; i++ )
  143.     {
  144.       MSB2DWORD( &dwAddr, toc->tracks[i-toc->firstTrack].addr );
  145.       SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETTIC, FALSE,
  146.   dwAddr );
  147.     }
  148.   dwLen = dwAddr = SendDlgItemMessage( hWnd, ID_SLIDER, RSB_GETMIN, 0, 0L );
  149.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETSTART, 0, dwAddr );
  150.   dwAddr = SendDlgItemMessage( hWnd, ID_SLIDER, RSB_GETMAX, 0, 0L );
  151.   SendDlgItemMessage( hWnd, ID_SLIDER, RSB_SETFINISH, 0, dwAddr );
  152.   dwLen = dwAddr - dwLen;
  153.   ripsegGenLenString( hWnd, dwLen, buf, 128 );
  154.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  155.   dwAddr = SendDlgItemMessage( hWnd, ID_SLIDER, RSB_GETSTART, 0, 0L );
  156.   ripsegSetAddressText( hWnd, dwAddr, TRUE );
  157.   SetDlgItemInt( hWnd, IDE_START, dwAddr, FALSE );
  158.   dwAddr = SendDlgItemMessage( hWnd, ID_SLIDER, RSB_GETFINISH, 0, 0L );
  159.   ripsegSetAddressText( hWnd, dwAddr, FALSE );
  160.   SetDlgItemInt( hWnd, IDE_FINISH, dwAddr, FALSE );
  161.   wsprintf( buf, "Custom Segment %d", ++segno );
  162.   SetDlgItemText( hWnd, IDE_SEGMENTFNAME, buf );
  163.   SetFocus( GetDlgItem( hWnd, ID_SLIDER ) );
  164. }
  165. void ripsegSetAddressText( HWND hWnd, DWORD addr, BOOL bStart )
  166. {
  167.   char buf[128];
  168.   DWORD dwStart, dwFinish;
  169.   ripsegGenAddressString( hWnd, addr, buf, 128 );
  170.   if ( bStart )
  171.     SetDlgItemText( hWnd, IDT_STARTTEXT, buf );
  172.   else
  173.     SetDlgItemText( hWnd, IDT_FINISHTEXT, buf );
  174.   dwStart = GetDlgItemInt( hWnd, IDE_START, NULL, FALSE );
  175.   dwFinish = GetDlgItemInt( hWnd, IDE_FINISH, NULL, FALSE );
  176.   ripsegGenLenString( hWnd, dwFinish - dwStart, buf, 128 );
  177.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  178. }
  179. BOOL ripsegHandleSliderNotify( HWND hWnd, LPARAM lParam )
  180. {
  181.   LPRSBNOTIFY l = (LPRSBNOTIFY)lParam;
  182.   char buf[128];
  183.   switch( l->hdr.code )
  184.     {
  185.     case RSBN_STARTCHANGING:
  186.       // sent whenever the top slider is moving, but before updated
  187.       if ( l->newStart < l->finish )
  188. {
  189.   ripsegGenAddressString( hWnd, l->newStart, buf, 128 );
  190.   SetDlgItemText( hWnd, IDT_STARTTEXT, buf );
  191.   ripsegGenLenString( hWnd, l->finish - l->newStart, buf, 128 );
  192.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  193.   SetWindowLong( hWnd, DWL_MSGRESULT, TRUE ); // allow the change
  194. }
  195.       else
  196. {
  197.   ripsegGenAddressString( hWnd, l->start, buf, 128 );
  198.   SetDlgItemText( hWnd, IDT_STARTTEXT, buf );
  199.   ripsegGenLenString( hWnd, l->finish - l->start, buf, 128 );
  200.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  201.   SetWindowLong( hWnd, DWL_MSGRESULT, FALSE ); // disallow the change
  202. }
  203.       break;
  204.     case RSBN_STARTCHANGED:
  205.       // sent after the top slider has moved and been updated
  206.       ripsegGenAddressString( hWnd, l->start, buf, 128 );
  207.       SetDlgItemText( hWnd, IDT_STARTTEXT, buf );
  208.       SetDlgItemInt( hWnd, IDE_START, l->start, FALSE );
  209.       ripsegGenLenString( hWnd, l->finish - l->start, buf, 128 );
  210.       SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  211.       break;
  212.     case RSBN_FINISHCHANGING:
  213.       // sent whenever the bottom slider is moving, but before updated
  214.       if ( l->newFinish > l->start )
  215. {
  216.   ripsegGenAddressString( hWnd, l->newFinish, buf, 128 );
  217.   SetDlgItemText( hWnd, IDT_FINISHTEXT, buf );
  218.   ripsegGenLenString( hWnd, l->newFinish - l->start, buf, 128 );
  219.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  220.   SetWindowLong( hWnd, DWL_MSGRESULT, TRUE ); // allow the change
  221. }
  222.       else
  223. {
  224.   ripsegGenAddressString( hWnd, l->finish, buf, 128 );
  225.   SetDlgItemText( hWnd, IDT_FINISHTEXT, buf );
  226.   ripsegGenLenString( hWnd, l->finish - l->start, buf, 128 );
  227.   SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  228.   SetWindowLong( hWnd, DWL_MSGRESULT, FALSE ); // disallow the change
  229. }
  230.       break;
  231.     case RSBN_FINISHCHANGED:
  232.       // sent after the bottom slider has moved and been updated
  233.       ripsegGenAddressString( hWnd, l->finish, buf, 128 );
  234.       SetDlgItemText( hWnd, IDT_FINISHTEXT, buf );
  235.       SetDlgItemInt( hWnd, IDE_FINISH, l->finish, FALSE );
  236.       ripsegGenLenString( hWnd, l->finish - l->start, buf, 128 );
  237.       SetDlgItemText( hWnd, IDT_TRACKLEN, buf );
  238.       break;
  239.     default:
  240.       return FALSE;
  241.     }
  242.   return TRUE;
  243. }
  244. char *ripsegGenAddressString( HWND hWnd, DWORD addr, char *buf, int len )
  245. {
  246.   BYTE i, num;
  247.   LPTOC t;
  248.   LPRSDWINDOW lpw;
  249.   DWORD ofs, addr1, addr2;
  250.   DWORD m, s, f;
  251.   char tmp[128];
  252.   if ( !buf )
  253.     return NULL;
  254.   ZeroMemory( buf, len );
  255.   lpw = (LPRSDWINDOW)GetWindowLong( hWnd, GWL_USERDATA );
  256.   t = &lpw->toc;
  257.   num = t->lastTrack - t->firstTrack + 1;
  258.   for( i = 0; i < num; i++ )
  259.     {
  260.       MSB2DWORD( &addr1, t->tracks[i].addr );;
  261.       MSB2DWORD( &addr2, t->tracks[i+1].addr );;
  262.       if ( (addr >= addr1) && (addr < addr2) )
  263. {
  264.   ofs = addr - addr1;
  265.   f = ofs % 75;
  266.   ofs /= 75;
  267.   s = ofs % 60;
  268.   m = ofs / 60;
  269.   wsprintf( tmp, "Track %d: %02d:%02d:%02d (%d)",
  270.     i+1, m, s, f, addr );
  271.   lstrcpyn( buf, tmp, len-1 );
  272.   return buf;
  273. }
  274.     }
  275.   return buf;
  276. }
  277. char *ripsegGenLenString( HWND hWnd, DWORD addr, char *buf, int len )
  278. {
  279.   DWORD m, s, f, dwLen;
  280.   char tmp[128];
  281.   if ( !buf )
  282.     return NULL;
  283.   ZeroMemory( buf, len );
  284.   dwLen = addr;
  285.   if ( (int)addr < 0 )
  286.     addr = 0;
  287.   f = addr % 75;
  288.   addr /= 75;
  289.   s = addr % 60;
  290.   m = addr / 60;
  291.   wsprintf( tmp, "%d frames (%02d:%02d:%02d)", dwLen, m, s, f );
  292.   lstrcpyn( buf, tmp, len-1 );
  293.   return buf;
  294. }
  295. BOOL ripsegSaveValues( HWND hWnd )
  296. {
  297.   DWORD dwStart, dwEnd;
  298.   char buf[MAX_PATH+1];
  299.   LPRSDWINDOW lpw;
  300.   BOOL bOK;
  301.   lpw = (LPRSDWINDOW)GetWindowLong( hWnd, GWL_USERDATA );
  302.   dwStart = GetDlgItemInt( hWnd, IDE_START, &bOK, FALSE );
  303.   dwEnd = GetDlgItemInt( hWnd, IDE_FINISH, &bOK, FALSE );
  304.   GetDlgItemText( hWnd, IDE_SEGMENTFNAME, buf, MAX_PATH );
  305.   if ( dwStart >= dwEnd )
  306.     {
  307.       MessageBox( hWnd, "The start frame must be less than the end frame.  Please correct and try again.", "Huh?!?", MB_APPLMODAL | MB_ICONERROR | MB_OK );      return FALSE;
  308.     }
  309.   if ( buf[0] == '' )
  310.     {
  311.       MessageBox( hWnd, "Please enter the output filename for the segment to be ripped.", "Huh?!?", MB_APPLMODAL | MB_ICONERROR | MB_OK );      return FALSE;
  312.       return FALSE;
  313.     }
  314.   lpw->addTrack->start = dwStart;
  315.   lpw->addTrack->len = dwEnd - dwStart;
  316.   lpw->addTrack->bComplete = FALSE;
  317.   if ( !lstrlen( buf ) )
  318.     wsprintf( buf, "Custom Segment %d", ++segno );
  319.   lstrcpy( lpw->addTrack->name, buf );
  320.   return TRUE;
  321. }