vbAccelerator - Contents of code file: cCDDriveInfo.cls

This file is part of the download VB6 CD Ripper, which is described in the article CD Ripping in VB Part 1.

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "cDrive"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

' ------------------------------------------------------------
' Name:   cDrive
' Author: Steve McMahon (steve@vbaccelerator.com)
' Date:   2004-05-06
' Description:
' Wrapper around the CDRip.DLL API describing a drive
' capable of playing CDs.
'
' See http://vbaccelerator.com/
' ------------------------------------------------------------

Public Enum ECDRipDriveType
   GENERIC = 0
   TOSHIBA
   TOSHIBANEW
   IBM
   NEC
   DEC
   IMS
   KODAK
   RICOH
   HP
   PHILIPS
   PLASMON
   GRUNDIGCDR100IPW
   MITSUMICDR
   PLEXTOR
   SONY
   YAMAHA
   NRC
   IMSCDD5
   CUSTOMDRIVE
   NUMDRIVETYPES
End Enum

Public Enum ECDRipReadMethod
   READMMC = 0
   READ10
   READNEC
   READSONY
   READMMC2
   READMMC3
   READC1
   READC2
   READC3
   READMMC4
   NUMREADMETHODS
End Enum

Public Enum ECDRipSetSpeed
   SPEEDNONE = 0
   SPEEDMMC
   SPEEDSONY
   SPEEDYAMAHA
   SPEEDTOSHIBA
   SPEEDPHILIPS
   SPEEDNEC
   NUMSPEEDMETHODS
End Enum

Public Enum ECDRipENDIAN
   BIGENDIAN = 0
   LITTLEENDIAN
   NUMENDIAN
End Enum

Public Enum ECDRipENABLEMODE
   ENABLENONE = 0
   ENABLESTD
   NUMENABLEMODES
End Enum

Public Enum ECDRipOUTPUTFORMAT
   STEREO44100 = 0
   MONO44100
   STEREO22050
   MONO22050
   STEREO11025
   MONO11025
   NUMOUTPUTFORMATS
End Enum

Private Type tDRIVETABLE
   DriveType As ECDRipDriveType
   readMethod As ECDRipReadMethod
   setSpeed As ECDRipSetSpeed
   endian As ECDRipENDIAN
   enableMode As ECDRipENABLEMODE
   nDensity As Long
   bAtapi As Long ' BOOL
End Type

Private Const TRANSPLAYER_ASPI = (0)
Private Const TRANSPLAYER_NTSCSI = (1)


Private Const CR_RIPPING_MODE_NORMAL = (0)
Private Const CR_RIPPING_MODE_PARANOIA = (1)

Private Type tSENSKEY
   SK As Byte
   ASC As Byte
   ASCQ As Byte
End Type

' hmmm this looks rather VB-hostile if it is byte aligned
Private Type CDROMPARAMS
   lpszCDROMID As String * 255 '// CD-ROM ID, must be unique to index settings
    in INI file
   
   nNumReadSectors As Long '// Number of sector to read per burst
   nNumOverlapSectors As Long '// Number of overlap sectors for jitter
    correction
   nNumCompareSectors As Long '// Number of sector to compare for jitter
    correction
   nOffsetStart As Long '// Fudge factor at start of ripping in sectors
   nOffsetEnd As Long '// Fudge factor at the end of ripping in sectors
   nSpeed As Long '// CD-ROM speed factor 0 .. 32 x
   nSpinUpTime As Long ' // CD-ROM spin up time in seconds
   bJitterCorrection As Long '// Boolean indicates whether to use Jitter
    Correction
   bSwapLefRightChannel As Long '// Swap left and right channel ?
   driveTable As tDRIVETABLE  '// Drive specific parameters
      
   btTargetID As Byte '// SCSI target ID
   btAdapterID As Byte '// SCSI Adapter ID
   btLunID As Byte '// SCSI LUN ID

   bAspiPosting As Long '// When set ASPI posting is used, otherwhiese ASPI
    polling is used
   nAspiRetries As Integer
   nAspiTimeOut As Integer

   bEnableMultiRead As Long '// Enables Multiple Read Verify Feature
   bMultiReadFirstOnly As Long '// Only do the multiple reads on the first block
   nMultiReadCount As Integer '// Number of times to reread and compare

   bLockDuringRead As Long '// Number of times to reread and compare

   nRippingMode As Integer
   nParanoiaMode As Integer
   
   bJunk(0 To 1024) As Byte
End Type

Private Declare Function CR_SetCDROMParameters Lib "cdrip.dll" (pParam As
 CDROMPARAMS) As Long
Private Declare Function CR_GetCDROMParameters Lib "cdrip.dll" (pParam As
 CDROMPARAMS) As Long
Private Declare Sub CR_SetActiveCDROM Lib "cdrip.dll" (ByVal nActiveDrive As
 Long)
'// Checks if the unit is ready (i.e. is the CD media present)
Private Declare Function CR_IsUnitReady Lib "cdrip.dll" () As Long

'// Eject the CD, bEject=TRUE=> the CD will be ejected, bEject=FALSE=> the CD
 will be loaded
Private Declare Function CR_EjectCD Lib "cdrip.dll" (ByVal bEject As Long) As
 Long

'// Check if the CD is playing
Private Declare Function CR_IsAudioPlaying Lib "cdrip.dll" () As Long

'// Play track
Private Declare Function CR_PlayTrack Lib "cdrip.dll" (ByVal nTrack As Long) As
 Long

'// Stop Play track
Private Declare Function CR_StopPlayTrack Lib "cdrip.dll" ()

'// Pause Play track
Private Declare Function CR_PauseCD Lib "cdrip.dll" (ByVal bPause As Long)


Private m_index As Long
Private m_tP As CDROMPARAMS
Private m_bDirty As Boolean

Friend Property Get fCDIndex() As Long
   fCDIndex = m_index
End Property

Public Property Get IsUnitReady() As Boolean
   CR_SetActiveCDROM m_index
   IsUnitReady = IIf(CR_IsUnitReady() = 0, False, True)
End Property
Public Property Get IsAudioPlaying() As Boolean
   CR_SetActiveCDROM m_index
   IsAudioPlaying = IIf(CR_IsAudioPlaying() = 0, False, True)
End Property
Public Sub EjectCD()
   CR_SetActiveCDROM m_index
   CR_EjectCD 1
End Sub
Public Sub CloseCD()
   CR_SetActiveCDROM m_index
   CR_EjectCD 0
End Sub

Public Sub PlayCDTrack(ByVal nIndex As Long)
   CDRipErrHandler "cDrive.PlayCDTrack", CR_PlayTrack(nIndex - 1), True
End Sub
Public Sub UnpauseCD()
   CDRipErrHandler "cDrive.UnPauseCD", CR_PauseCD(0), True
End Sub
Public Sub PauseCD()
   CDRipErrHandler "cDrive.UnPauseCD", CR_PauseCD(1), True
End Sub
Public Sub StopCD()
   CDRipErrHandler "cDrive.UnPauseCD", CR_StopPlayTrack, True
End Sub

Public Property Get Name() As String
   Name = StripNull(m_tP.lpszCDROMID)
End Property

Public Property Get ReadSectors() As Long
   ReadSectors = m_tP.nNumReadSectors
End Property
Public Property Let ReadSectors(ByVal value As Long)
   If Not (m_tP.nNumReadSectors = value) Then
      m_tP.nNumReadSectors = value
      m_bDirty = True
   End If
End Property
Public Property Get ReadOverlap() As Long
   ReadOverlap = m_tP.nNumOverlapSectors
End Property
Public Property Let ReadOverlap(ByVal value As Long)
   If Not (m_tP.nNumOverlapSectors = value) Then
      m_tP.nNumOverlapSectors = value
      m_bDirty = True
   End If
End Property
Public Property Get BlockCompare() As Long
   BlockCompare = m_tP.nNumCompareSectors
End Property
Public Property Let BlockCompare(ByVal value As Long)
   If Not (m_tP.nNumCompareSectors = value) Then
      m_tP.nNumCompareSectors = value
      m_bDirty = True
   End If
End Property

Public Property Get StartOffset() As Long
   StartOffset = m_tP.nOffsetStart
End Property
Public Property Let StartOffset(ByVal value As Long)
   If Not (m_tP.nOffsetStart = value) Then
      m_tP.nOffsetStart = value
      m_bDirty = True
   End If
End Property
Public Property Get EndOffset() As Long
   EndOffset = m_tP.nOffsetEnd
End Property
Public Property Let EndOffset(ByVal value As Long)
   If Not (m_tP.nOffsetEnd = value) Then
      m_tP.nOffsetEnd = value
      m_bDirty = True
   End If
End Property
Public Property Get CDSpeed() As Long
   CDSpeed = m_tP.nSpeed
End Property
Public Property Let CDSpeed(ByVal value As Long)
   If Not (m_tP.nSpeed = value) Then
      m_tP.nSpeed = value
      m_bDirty = True
   End If
End Property

Public Property Get SpinUpTime() As Long
   SpinUpTime = m_tP.nSpinUpTime
End Property
Public Property Let SpinUpTime(ByVal value As Long)
   If Not (m_tP.nSpinUpTime = value) Then
      m_tP.nSpinUpTime = value
      m_bDirty = True
   End If
End Property

Public Property Get Retries() As Long
   Retries = m_tP.nAspiRetries
End Property
Public Property Let Retries(ByVal value As Long)
   If Not (m_tP.nAspiRetries = value) Then
      m_tP.nAspiRetries = value
      m_bDirty = True
   End If
End Property

Public Property Get DriveType() As ECDRipDriveType
   DriveType = m_tP.driveTable.DriveType
End Property
Public Property Let DriveType(ByVal value As ECDRipDriveType)
   If Not (m_tP.driveTable.DriveType = value) Then
      m_tP.driveTable.DriveType = value
      m_bDirty = True
   End If
End Property

Public Property Get RippingMethod() As ECDRipDriveType
   RippingMethod = m_tP.driveTable.readMethod
End Property
Public Property Let RippingMethod(ByVal value As ECDRipDriveType)
   If Not (m_tP.driveTable.readMethod = value) Then
      m_tP.driveTable.readMethod = value
      m_bDirty = True
   End If
End Property
Public Property Get TOC() As cToc
Dim cToc As New cToc
   CR_SetActiveCDROM m_index
   cToc.fInit m_index
   Set TOC = cToc
End Property

Public Sub Refresh()
   fInit m_index
End Sub

Public Sub Apply()
   If (m_bDirty) Then
      CDRipErrHandler "cCDDriveInfo.Apply", CR_SetCDROMParameters(m_tP), True
      m_bDirty = False
   End If
End Sub

Friend Sub fInit(ByVal index As Long)
   m_bDirty = False
   m_index = index
   CR_SetActiveCDROM m_index
   CDRipErrHandler "cCDDriveInfo.fInit", CR_GetCDROMParameters(m_tP), True
End Sub

Private Function StripNull(ByVal sz As String) As String
Dim i As Long
   i = InStr(sz, vbNullChar)
   If (i > 0) And (i < Len(sz)) Then
      StripNull = left(sz, i - 1)
   Else
      StripNull = sz
   End If
End Function