⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read10.c

📁 读取音乐光盘磁道为磁盘文件的DLL源码
💻 C
字号:
/*
 * read10.c - Copyright (C) 1999 Jay A. Key
 *
 * Functions for the CDR_READ10 class of read/init/deinit functions
 *
 **********************************************************************
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 **********************************************************************
 *
 * $Id: read10.c,v 1.2 2000/02/25 10:47:37 akey Exp $
 * $Date: 2000/02/25 10:47:37 $
 * $Locker:  $
 * $Log: read10.c,v $
 * Revision 1.2  2000/02/25 10:47:37  akey
 * sync'ed with akrip32.dll v0.94
 *
 * Revision 1.3  2000/02/14 09:56:25  akey
 * cleaned up #ifdef _DEBUG code considerably
 *
 * Revision 1.2  2000/01/03 12:29:43  akey
 * v0.91 release -- added CDDB and bug fixes
 *
 *
 */

#define _AKRIP32_

#include <windows.h>
#include <stdio.h>
#include "myaspi32.h"
#include "scsidefs.h"
#include "aspilib.h"
#include "akrip32.h"

extern CDHANDLEREC *cdHandles;
extern HANDLE *cdMutexes;
extern CRITICAL_SECTION getHandle;
extern int alErrCode;
extern BYTE alAspiErr;
extern int *nextHandle;

extern DWORD (*pfnSendASPI32Command)(LPSRB);

DWORD deinitREAD10( HCDROM hCD );


/***************************************************************************
 * initREAD10
 ***************************************************************************/
DWORD initREAD10_2( HCDROM hCD )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;
  int i;
  BYTE init1[] = { 0, 0, 0, 0x08, 0, 0, 0, 0, 0, 0, 0x09, 0x30, 0x23, 6, 0, 0, 0, 0, 0, 0x80 };
  BYTE init2[] =
    { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 };

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }

#if 0
  dwStatus = pauseResumeCD( hCD, TRUE );
  if ( dwStatus != SS_COMP )
    {
      return dwStatus;
    }


  dwStatus = startStopUnit( hCD, TRUE, TRUE );
  if ( dwStatus != SS_COMP )
    {
      return dwStatus;
    }
#endif

  for( i = 0; i < 2; i++ )
    {
      heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );

      memset( &s, 0, sizeof( s ) );
      s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
      s.SRB_HaID       = cdHandles[idx].ha;
      s.SRB_Target     = cdHandles[idx].tgt;
      s.SRB_Lun        = cdHandles[idx].lun;
      //      s.SRB_Flags      = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT;
      s.SRB_Flags      = SRB_EVENT_NOTIFY;
      s.SRB_BufLen     = 0x14;
      s.SRB_BufPointer = (i==0)?init1:init2;
      s.SRB_SenseLen   = SENSE_LEN;
      s.SRB_CDBLen     = 6;
      s.SRB_PostProc   = (LPVOID)heventSRB;
      s.CDBByte[0]     = 0x15;         /* mode select (6) */
      s.CDBByte[1]     = 0x10;         /* no save */
      s.CDBByte[4]     = 0x14;         /* buffer length */

      ResetEvent( heventSRB );
      dwStatus = pfnSendASPI32Command( (LPSRB)&s );
      if ( dwStatus == SS_PENDING )
	{
	  WaitForSingleObject( heventSRB, DEFWAITLEN );
	}
      CloseHandle( heventSRB );

      if ( s.SRB_Status != SS_COMP )
	{
#ifdef _DEBUG
	  dbprintf( "akrip32: init10: #%d failed -> 0x%04X", i, s.SRB_Status );
#endif
	  alErrCode = ALERR_ASPI;
	  alAspiErr = s.SRB_Status;
	  return SS_ERR;
	}
    }

  cdHandles[idx].pfnDeinit = deinitREAD10;

  return s.SRB_Status;
}


/***************************************************************************
 * initREAD10
 * -- try a shorter version of the mode select ...
 ***************************************************************************/
DWORD initREAD10( HCDROM hCD )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;
  //  int i;
  BYTE init1[] = { 0, 0, 0, 0x08, 0, 0, 0, 0, 0, 0, 0x09, 0x30 };

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }

#if 0
  dwStatus = pauseResumeCD( hCD, TRUE );
  if ( dwStatus != SS_COMP )
    {
      return dwStatus;
    }


  dwStatus = startStopUnit( hCD, TRUE, TRUE );
  if ( dwStatus != SS_COMP )
    {
      return dwStatus;
    }
#endif

  heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );

  memset( &s, 0, sizeof( s ) );
  s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  s.SRB_HaID       = cdHandles[idx].ha;
  s.SRB_Target     = cdHandles[idx].tgt;
  s.SRB_Lun        = cdHandles[idx].lun;
  s.SRB_Flags      = SRB_EVENT_NOTIFY;
  s.SRB_BufLen     = 0x0C;
  s.SRB_BufPointer = init1;
  s.SRB_SenseLen   = SENSE_LEN;
  s.SRB_CDBLen     = 6;
  s.SRB_PostProc   = (LPVOID)heventSRB;
  s.CDBByte[0]     = 0x15;         /* mode select (6) */
  s.CDBByte[4]     = 0x0C;         /* buffer length */

  ResetEvent( heventSRB );
  dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  if ( dwStatus == SS_PENDING )
    {
      WaitForSingleObject( heventSRB, DEFWAITLEN );
    }
  CloseHandle( heventSRB );

  if ( s.SRB_Status != SS_COMP )
    {
#ifdef _DEBUG
      dbprintf( "akrip32: init10 failed -> 0x%04X", s.SRB_Status );
#endif
      alErrCode = ALERR_ASPI;
      alAspiErr = s.SRB_Status;
      return SS_ERR;
    }

  cdHandles[idx].pfnDeinit = deinitREAD10;

  return s.SRB_Status;
}


/***************************************************************************
 * deinitREAD10
 ***************************************************************************/
DWORD deinitREAD10( HCDROM hCD )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;
  BYTE init1[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 };

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }

  cdHandles[idx].bInit = FALSE;

  heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );

  memset( &s, 0, sizeof( s ) );
  s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  s.SRB_HaID       = cdHandles[idx].ha;
  s.SRB_Target     = cdHandles[idx].tgt;
  s.SRB_Lun        = cdHandles[idx].lun;
  s.SRB_Flags      = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT;
  s.SRB_BufLen     = 0x0C;
  s.SRB_BufPointer = init1;
  s.SRB_SenseLen   = SENSE_LEN;
  s.SRB_CDBLen     = 6;
  s.SRB_PostProc   = (LPVOID)heventSRB;
  s.CDBByte[0]     = 0x15;
  s.CDBByte[4]     = 0x0C;

  ResetEvent( heventSRB );
  dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  if ( dwStatus == SS_PENDING )
    {
      WaitForSingleObject( heventSRB, DEFWAITLEN );
    }
  CloseHandle( heventSRB );

  if ( s.SRB_Status != SS_COMP )
    {
      alErrCode = ALERR_ASPI;
      alAspiErr = s.SRB_Status;
      return SS_ERR;
    }

  return s.SRB_Status;
}

/***************************************************************************
 * readCDAudioLBA_READ10
 ***************************************************************************/
DWORD readCDAudioLBA_READ10( HCDROM hCD, LPTRACKBUF t )
{
  DWORD dwStatus;
  HANDLE heventSRB;
  SRB_ExecSCSICmd s;
  int idx = (int)hCD - 1;

  if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
    {
      alErrCode = ALERR_INVHANDLE;
      return SS_ERR;
    }


  if ( t->numFrames * 2352 > t->maxLen )
    {
      alErrCode = ALERR_BUFTOOSMALL;
      return SS_ERR;
    }

  if ( !cdHandles[idx].bInit )
    {
      if ( cdHandles[idx].readType == CDR_READ10_2 )
	{
	  if ( initREAD10_2( hCD ) != SS_COMP )
	    return SS_ERR;
	}
      else
	{
	  if ( initREAD10( hCD ) != SS_COMP )
	    return SS_ERR;
	}
      cdHandles[idx].bInit = TRUE;
    }

  heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );

  memset( &s, 0, sizeof( s ) );
  s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  s.SRB_HaID       = cdHandles[idx].ha;
  s.SRB_Target     = cdHandles[idx].tgt;
  s.SRB_Lun        = cdHandles[idx].lun;
  s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
  s.SRB_BufLen     = t->maxLen;
  s.SRB_BufPointer = &(t->buf[0]);
  s.SRB_SenseLen   = SENSE_LEN;
  s.SRB_CDBLen     = 10;
  s.SRB_PostProc   = (LPVOID)heventSRB;
  s.CDBByte[0]     = 0x28;                 // read10
  s.CDBByte[1]     = cdHandles[idx].lun << 5;
  s.CDBByte[3]     = (t->startFrame >> 16) & 0xFF;
  s.CDBByte[4]     = (t->startFrame >> 8) & 0xFF;
  s.CDBByte[5]     = t->startFrame & 0xFF;
  s.CDBByte[8]     = t->numFrames & 0xFF;

  ResetEvent( heventSRB );
  dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  if ( dwStatus == SS_PENDING )
    {
      WaitForSingleObject( heventSRB, DEFWAITLEN );
    }
  CloseHandle( heventSRB );

  if ( s.SRB_Status != SS_COMP )
    {
#ifdef _DEBUG
      BYTE *p;
      dbprintf( "akrip32: readCDAudioLBA_READ10: ERROR! 0x%08X\n", s.SRB_Status );
      dbprintf( "akrip32:  haStat == %d (0x%04X), tgtStat == %d (0x%04X)",
	       s.SRB_HaStat, s.SRB_HaStat, s.SRB_TargStat, s.SRB_TargStat );
      p = s.SenseArea;
      dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
	       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
      p = &(s.SenseArea[8]);
      dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
	       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
#endif
      alErrCode = ALERR_ASPI;
      alAspiErr = s.SRB_Status;
      return SS_ERR;
    }

  t->len = t->numFrames * 2352;
  t->startOffset = 0;
  t->status = s.SRB_Status;

  return s.SRB_Status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -