📄 xtractor.c
字号:
MessageBox( NULL, "Unable to allocate default CD device", "X-Tractor",
MB_APPLMODAL | MB_ICONSTOP | MB_OK );
else
{
BYTE i;
// locate the drive in the list of available drives
for( i = 0; i < cdlist.num; i++ )
{
if ( (cdh.ha == cdlist.cd[i].ha) &&
(cdh.tgt == cdlist.cd[i].tgt) &&
(cdh.lun == cdlist.cd[i].lun) )
cdlistIdx = i;
}
}
}
else
{
hCD = findAvailableCD( );
}
if ( !readRegSZ( hKey, "wavOutputDir", szWavOutputDir, MAX_PATH + 1 ) )
GetCurrentDirectory( MAX_PATH + 1, szWavOutputDir );
if ( !readRegSZ( hKey, "mp3OutputDir", szMP3OutputDir, MAX_PATH + 1 ) )
GetCurrentDirectory( MAX_PATH + 1, szMP3OutputDir );
asSetID3Info( ID3_TITLE, "", 0 );
asSetID3Info( ID3_ARTIST, "", 0 );
asSetID3Info( ID3_ALBUM, "", 0 );
asSetID3Info( ID3_YEAR, "", 0 );
asSetID3Info( ID3_GENRE, NULL, 0 );
if ( hKey )
RegCloseKey( hKey );
}
HCDROM findAvailableCD( void )
{
GETCDHAND cdh;
BYTE i;
if ( hCD )
{
CloseCDHandle( hCD );
hCD = NULL;
}
ZeroMemory( &cdh, sizeof(cdh) );
for( i = 0; i < cdlist.num && !hCD; i++ )
{
cdh.size = sizeof(GETCDHAND);
cdh.ver = 1;
cdh.ha = cdlist.cd[i].ha;
cdh.tgt = cdlist.cd[i].tgt;
cdh.lun = cdlist.cd[i].lun;
cdh.readType = bReadType;
cdh.numOverlap = numOverlap;
cdh.numJitter = jitterCheck;
hCD = GetCDHandle( &cdh );
if ( hCD )
cdlistIdx = i;
}
return hCD;
}
/*
* Reads a DWORD from the registry given an already open key
* The value read is stored into pdw, and the function returns
* 0 if it fails
*/
int readRegDWORD( HKEY hKey, LPCTSTR lpszValue, DWORD *pdw )
{
DWORD dwSize = 4L;
DWORD dwType;
LONG retVal;
retVal = RegQueryValueEx( hKey, lpszValue, NULL, &dwType, (LPBYTE)pdw,
&dwSize );
if ( retVal != ERROR_SUCCESS )
{
return 0;
}
return -1;
}
/*
* Reads an ASCIIZ string from the registry given an already open key
* The value read is stored into lpszData, and the function returns
* 0 if it fails
*/
int readRegSZ( HKEY hKey, LPCTSTR lpszValue, LPSTR lpszData, DWORD dwDataLen )
{
DWORD dwType;
LONG retVal;
retVal = RegQueryValueEx( hKey, lpszValue, NULL, &dwType, (LPBYTE)lpszData,
&dwDataLen );
if ( (retVal != ERROR_SUCCESS) || (dwType != REG_SZ) )
{
return 0;
}
return -1;
}
/*
* Sets the registry to disable autoplay under Win95. Probably won't
* work under NT due to security settings
*/
void disableAutoPlay( void )
{
HKEY hKey;
unsigned long ulDisable = (unsigned long)0xFF;
DWORD dwDataSize = sizeof( ulDisable );
DWORD dwDataType;
LONG lErr = 0;
if ( ( lErr = RegOpenKeyEx( HKEY_CURRENT_USER, regAutoPlay, 0,
KEY_ALL_ACCESS, &hKey ) ) == ERROR_SUCCESS )
{
if ( RegQueryValueEx( hKey, "NoDriveTypeAutoRun", 0, NULL,
(unsigned char *)&ulOldAutorun,
&dwDataSize ) == ERROR_SUCCESS )
{
RegSetValueEx( hKey, "NoDriveTypeAutoRun", 0, REG_BINARY,
(unsigned char *)&ulDisable, 4 );
}
else
ulOldAutorun = (unsigned long)0x95;
RegFlushKey( hKey );
RegCloseKey( hKey );
}
if ( ( lErr = RegOpenKeyEx( HKEY_CLASSES_ROOT, regAutoAudioCD, 0,
KEY_ALL_ACCESS, &hKey ) ) == ERROR_SUCCESS )
{
dwDataSize = 256;
if ( RegQueryValueEx( hKey, "", NULL, &dwDataType,
szOldAutoPlay,
&dwDataSize ) == ERROR_SUCCESS )
{
RegSetValueEx( hKey, "", 0, REG_SZ, (unsigned char *)"", 1 );
}
RegFlushKey( hKey );
RegCloseKey( hKey );
}
}
void restoreAutoPlay( void )
{
HKEY hKey;
if ( RegOpenKeyEx( HKEY_CURRENT_USER, regAutoPlay, 0,
KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS )
{
RegSetValueEx( hKey, "NoDriveTypeAutoRun", 0, REG_BINARY,
(unsigned char *)&ulOldAutorun, 4 );
RegFlushKey( hKey );
RegCloseKey( hKey );
}
if ( RegOpenKeyEx( HKEY_CLASSES_ROOT, regAutoAudioCD, 0,
KEY_ALL_ACCESS, &hKey ) == ERROR_SUCCESS )
{
RegSetValueEx( hKey, "", 0, REG_SZ,
(unsigned char *)&szOldAutoPlay,
lstrlen(szOldAutoPlay)+1 );
RegFlushKey( hKey );
RegCloseKey( hKey );
}
}
BOOL DirExists( char *dir )
{
char curDir[MAX_PATH+1];
// BOOL bSet;
if ( !GetCurrentDirectory( MAX_PATH + 1, curDir ) )
return FALSE;
if ( !SetCurrentDirectory( dir ) )
return FALSE;
SetCurrentDirectory( curDir );
return TRUE;
}
void MSB2DWORD( DWORD *d, BYTE *b )
{
DWORD retVal;
retVal = (DWORD)b[0];
retVal = (retVal<<8) + (DWORD)b[1];
retVal = (retVal<<8) + (DWORD)b[2];
retVal = (retVal<<8) + (DWORD)b[3];
*d = retVal;
}
void GetEditItemText( int iCtlId, HWND hCtl )
{
char buf[31];
ZeroMemory( buf, 31 );
SendMessage( hCtl, WM_GETTEXT, 31, (LPARAM)buf );
switch( iCtlId )
{
case IDE_ARTIST:
asSetID3Info( ID3_ARTIST, buf, 0 );
break;
case IDE_ALBUM:
asSetID3Info( ID3_ALBUM, buf, 0 );
break;
}
}
void SetEditItemText( int iCtlId, char *s )
{
switch( iCtlId )
{
case IDE_ARTIST:
SendMessage( hEditArtist, WM_SETTEXT, 0, (LPARAM)s );
break;
case IDE_ALBUM:
SendMessage( hEditAlbum, WM_SETTEXT, 0, (LPARAM)s );
break;
}
}
void CheckEnableID3MenuItem( HWND hWnd )
{
HMENU hPopup;
hPopup = GetSubMenu( GetMenu(hWnd), 3 ); // get handle to Tools menu
if ( bID3 )
CheckMenuItem( hPopup, IDM_ENABLEID3, MF_BYCOMMAND | MF_CHECKED );
else
CheckMenuItem( hPopup, IDM_ENABLEID3, MF_BYCOMMAND | MF_UNCHECKED );
}
void CheckEnableCDDBMenuItem( HWND hWnd )
{
HMENU hPopup;
hPopup = GetSubMenu( GetMenu(hWnd), 3 ); // get handle to Tools menu
if ( bCDDB )
CheckMenuItem( hPopup, IDM_ENABLECDDB, MF_BYCOMMAND | MF_CHECKED );
else
CheckMenuItem( hPopup, IDM_ENABLECDDB, MF_BYCOMMAND | MF_UNCHECKED );
}
void CheckEnableHiColorMenuItem( HWND hWnd )
{
HMENU hPopup;
hPopup = GetSubMenu( GetMenu(hWnd), 2 ); //options menu
if ( bHiColor )
CheckMenuItem( hPopup, IDM_HICOLOR, MF_BYCOMMAND | MF_CHECKED );
else
CheckMenuItem( hPopup, IDM_HICOLOR, MF_BYCOMMAND | MF_UNCHECKED );
}
void ShowHelpFile( HWND hWnd, int topic )
{
char buf[MAX_PATH+1];
topic = topic;
GetCurrentDirectory( MAX_PATH+1, buf );
lstrcat( buf, "\\help" );
ShellExecute( hWnd, "open", "index.html", NULL, buf, SW_SHOWNORMAL );
}
void setRipTrackStatus( LPENCODETHREAD e )
{
char buf[61];
char buf2[81];
char *p = buf;
double d;
int a,b;
time( &e->tnow );
d = difftime( e->tnow, e->tstart );
switch( e->status )
{
case EST_SUCCESS:
lstrcpy( buf, "OK, " );
DiffTimeToString( d, buf+4 );
p += lstrlen( buf );
d = ((double)(e->trackLen/75)) / d;
a = d;
b = ((d-(double)a) * 100.0);
wsprintf( p, ", %s: %d.%02dx", bMP3?"rip/encode":"rip", a, b );
wsprintf( buf2, "lstrlen(buf) == %d", lstrlen(buf) );
OutputDebugString( buf2 );
break;
case EST_ERROR:
wsprintf( buf, "Error: 0x%04X", GetAspiLibAspiError() );
break;
case EST_ABORTED:
lstrcpy( buf, "Rip Aborted" );
break;
default:
lstrcpy( buf, "" );
break;
}
SendMessage( hTrackWnd, WM_SETTRACKSTATUS, (WPARAM)e->idx,
(LPARAM)buf );
}
void DiffTimeToString( double d, char *buf )
{
unsigned long hrs, min, sec;
hrs = (unsigned long)(d / 3600.0);
min = (unsigned long)((d - (double)((hrs) * 3600))/60.0);
sec = ((unsigned long)d) - (hrs)*3600 - (min)*60;
wsprintf( buf, "%02d:%02d", hrs * 60 + min, sec );
}
static void GetLineFromBuf( char *tgt, char **src, int len )
{
char *p;
if ( !src || !*src || !tgt )
return;
p = *src;
ZeroMemory( tgt, len );
len--;
while( *p && len )
{
if ( *p == '\n' )
break;
*tgt++ = *p;
p++;
len--;
}
// advance *src to end of last read string
if ( *p == '\n' )
p++;
*src = p;
len = lstrlen( tgt );
if ( tgt[len-2] == '\r' )
tgt[len-2] = '\0';
if ( (tgt[len-1] == '\r') || (tgt[len-1] == '\n') )
tgt[len-1] = '\0';
}
#if 0
LRESULT CALLBACK Edit0Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
WNDPROC lpfnWndProc;
lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );
logMessage( 0, uMsg, wParam, lParam );
return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}
LRESULT CALLBACK Edit1Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
WNDPROC lpfnWndProc;
lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );
logMessage( 1, uMsg, wParam, lParam );
return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}
LRESULT CALLBACK Edit2Proc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
WNDPROC lpfnWndProc;
lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );
logMessage( 2, uMsg, wParam, lParam );
return lpfnWndProc( hWnd, uMsg, wParam, lParam );
}
void logMessage( int which, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
char buf[128];
char *p;
p = buf;
wsprintf( buf, "%d: ", which );
p += lstrlen( p );
switch( uMsg )
{
case WM_SETCURSOR:
case WM_MOUSEMOVE:
case WM_NCHITTEST:
case WM_NCMOUSEMOVE:
case WM_PAINT:
case WM_NCPAINT:
return;
case WM_MOUSEACTIVATE:
wsprintf( p, "WM_MOUSEACTIVATE 0x%08X 0x%08X", wParam, lParam );
break;
case WM_GETDLGCODE:
wsprintf( p, "WM_GETDLGCODE 0x%08X 0x%08X", wParam, lParam );
break;
case WM_LBUTTONDOWN:
wsprintf( p, "WM_LBUTTONDOWN 0x%08X 0x%08X", wParam, lParam );
break;
case WM_LBUTTONUP:
wsprintf( p, "WM_LBUTTONUP 0x%08X 0x%08X", wParam, lParam );
break;
case WM_KILLFOCUS:
wsprintf( p, "WM_KILLFOCUS 0x%08X 0x%08X", wParam, lParam );
break;
case WM_SETFOCUS:
wsprintf( p, "WM_SETFOCUS 0x%08X 0x%08X", wParam, lParam );
break;
case WM_CAPTURECHANGED:
wsprintf( p, "WM_CAPTURECHANGED 0x%08X 0x%08X", wParam, lParam );
break;
default:
wsprintf( p, "unknown 0x%04X (%d)", uMsg, uMsg );
break;
}
OutputDebugString( buf );
}
#endif
void dbprintf( char *fmt, ... )
{
char buf[512];
va_list arg;
va_start( arg, fmt );
vsprintf( buf, fmt, arg );
OutputDebugString( buf );
va_end( arg );
}
/*
* Attempt to determine the version of comctl32.dll available.
*/
#if (!_CONFIG_DLLVERINFO)
typedef struct
{
DWORD cbSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformID;
} DLLVERSIONINFO;
typedef HRESULT CALLBACK (*DLLGETVERSIONPROC)(DLLVERSIONINFO *);
#endif
DWORD GetDllVersion( LPCTSTR lpszDllName )
{
HINSTANCE hDll;
DWORD retVal = 0;
hDll = LoadLibrary( lpszDllName );
if ( hDll )
{
DLLGETVERSIONPROC pDllGetVer;
pDllGetVer = (DLLGETVERSIONPROC)GetProcAddress( hDll, "DllGetVersion" );
if ( pDllGetVer )
{
DLLVERSIONINFO dvi;
HRESULT hr;
ZeroMemory( &dvi, sizeof(dvi) );
dvi.cbSize = sizeof(dvi);
hr = (*pDllGetVer)(&dvi);
if ( SUCCEEDED(hr) )
{
retVal = MAKELONG( dvi.dwMajorVersion, dvi.dwMinorVersion );
}
FreeLibrary( hDll );
}
}
return retVal;
}
/*
* Returns TRUE if color depth >= 16 bpp
*/
BOOL DisplayIsHiColor( void )
{
HDC hDC;
int iBPP;
hDC = GetDC( NULL );
iBPP = GetDeviceCaps( hDC, BITSPIXEL );
ReleaseDC( NULL, hDC );
return (iBPP >= 16);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -