|
||||
|
vbAccelerator - Contents of code file: cCDTrackRipper.clsThis file is part of the download VB5 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 = "cCDTrackRipper" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit ' ------------------------------------------------------------ ' Name: cCDTrackRipper ' Author: Steve McMahon (steve@vbaccelerator.com) ' Date: 2004-05-06 ' Description: ' Wrapper around the CDRip.DLL API for ripping tracks (or ' parts of CDs) ' ' See http://vbaccelerator.com/ ' ------------------------------------------------------------ Private Const GMEM_FIXED = &H0 Private Const GMEM_ZEROINIT = &H40 Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT) Private Declare Function LocalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal wBytes As Long) As Long Private Declare Function LocalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function LocalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Sub CR_SetActiveCDROM Lib "cdrip.dll" (ByVal nActiveDrive As Long) '// Start ripping section, output is fetched to WriteBufferFunc '// Data is extracted from dwStartSector to dwEndSector Private Declare Function CR_OpenRipper Lib "cdrip.dll" ( _ ByRef plBufferSize As Long, _ ByVal dwStartSector As Long, _ ByVal dwEndSector As Long) As Long '// Close the ripper, has to be called when the ripping process is completed (i.e 100%) '// Or it can be called to abort the current ripping section Private Declare Function CR_CloseRipper Lib "cdrip.dll" () As Long '// Indicates how far the ripping process is right now '// Returns 100% when the ripping is completed Private Declare Function CR_GetPercentCompleted Lib "cdrip.dll" () As Long '// Get number of Jitter Errors that have occured during the ripping '// This function must be called before CloseRipper is called ! Private Declare Function CR_GetNumberOfJitterErrors Lib "cdrip.dll" () As Long '// Get the jitter position of the extracted track Private Declare Function CR_GetJitterPosition Lib "cdrip.dll" () As Long '// Returns the peak value of the ripped section (0..2^15) Private Declare Function CR_GetPeakValue Lib "cdrip.dll" () As Long '// Rip a chunk from the CD, pbtStream contains the ripped data, pNumBytes the '// number of bytes that have been ripped and corrected for jitter (if enabled) Private Declare Function CR_RipChunk Lib "cdrip.dll" ( _ pbtStream As Any, _ ByRef pNumBytes As Long, _ bAbort As Long) As Long '// Normalize the stream (i.e. multiply by dScaleFactor) Private Declare Sub CR_NormalizeChunk Lib "cdrip.dll" ( _ pbsStream As Any, _ ByVal nNumSamples As Long, _ ByVal dScaleFactor As Double _ ) Private m_cdIndex As Long Private m_startSector As Long Private m_endSector As Long Private m_iJitterErrCount As Long Private m_bRipperOpen As Boolean Private m_lBufferSize As Long Private m_lReadSize As Long Private m_hMem As Long Private m_lPtrMem As Long Private m_lPercentComplete As Long Public Sub CreateForTrack(cTrack As cTocEntry) If CloseRipper() Then m_startSector = cTrack.StartSector m_endSector = cTrack.EndSector m_cdIndex = cTrack.fCDIndex End If End Sub Public Sub CreateForSection(cD As cDrive, ByVal lStartSector As Long, ByVal lEndSector As Long) If CloseRipper() Then m_startSector = 0 m_endSector = 0 If (lStartSector >= 0) And (lStartSector < cD.TOC.TotalLengthSectors) Then CDRipErrHandler "CreateForSection", 3, False Else If (lEndSector > lStartSector) And (lEndSector < cD.TOC.TotalLengthSectors) Then CDRipErrHandler "CreateForSection", 3, False Else m_startSector = lStartSector m_endSector = lEndSector m_cdIndex = cD.fCDIndex End If End If End If End Sub Public Property Get JitterErrorCount() As Long JitterErrorCount = m_iJitterErrCount End Property Public Property Get PercentComplete() As Long PercentComplete = m_lPercentComplete End Property Public Function CloseRipper() Dim eErr As ECDRipErrorCode If (m_bRipperOpen) Then m_bRipperOpen = False m_iJitterErrCount = CR_GetNumberOfJitterErrors() eErr = CR_CloseRipper() CDRipErrHandler "cCDTrackRipper.CloseRipper", eErr, True If (eErr = CDEX_OK) Then CloseRipper = True End If Else CloseRipper = True End If End Function Private Function CreateBuffer(ByVal lSize As Long) As Boolean If (lSize <= 1) Then ' inappropriate Debug.Print lSize Debug.Assert "" = "Inappropriate buffer size" Exit Function End If If Not (lSize = m_lBufferSize) Then DestroyBuffer End If If (m_lPtrMem = 0) Then m_hMem = LocalAlloc(GPTR, lSize) If (m_hMem = 0) Then ' failed Else m_lPtrMem = LocalLock(m_hMem) If (m_lPtrMem = 0) Then ' failed DestroyBuffer Else ' success m_lBufferSize = lSize CreateBuffer = True End If End If Else ' success CreateBuffer = True End If End Function Private Sub DestroyBuffer() If Not (m_lPtrMem = 0) Then LocalUnlock m_hMem m_lPtrMem = 0 End If If Not (m_hMem = 0) Then LocalFree m_hMem m_hMem = 0 End If m_lReadSize = 0 m_lBufferSize = 0 End Sub Public Function OpenRipper() As Boolean Dim eErr As ECDRipErrorCode Dim lStartSector As Long Dim lEndSector As Long Dim lBufferSize As Long If CloseRipper() Then CR_SetActiveCDROM m_cdIndex m_lPercentComplete = 0 lStartSector = m_startSector lEndSector = m_endSector eErr = CR_OpenRipper(lBufferSize, lStartSector, lEndSector) CDRipErrHandler "cCDTrackRipper.OpenRipper", eErr, True If (eErr = CDEX_OK) Then If CreateBuffer(lBufferSize) Then m_bRipperOpen = True m_iJitterErrCount = 0 OpenRipper = True Else CDRipErrHandler "cCDTrackRipper.CreateBuffer", 7, False End If End If End If End Function Public Function Read() As Boolean Dim bAbort As Long Dim lNumBytes As Long Dim eErr As ECDRipErrorCode If (m_bRipperOpen) Then ' Try and read the next chunk eErr = CR_RipChunk(ByVal m_lPtrMem, lNumBytes, bAbort) m_lReadSize = lNumBytes m_lPercentComplete = CR_GetPercentCompleted() Select Case eErr Case CDEX_RIPPING_INPROGRESS, CDEX_OK Read = True Case CDEX_RIPPING_DONE ' Complete CloseRipper Read = True ' will be false next time Case CDEX_JITTER_ERROR ' TODO handle jitter error Read = True Case CDEX_FILEOPEN_ERROR ' Failed CloseRipper CDRipErrHandler "cCDTrackRipper.Read", eErr, True Read = False Case CDEX_ERROR ' Failed CloseRipper CDRipErrHandler "cCDTrackRipper.Read", eErr, True Read = False End Select Else m_lReadSize = 0 Read = False End If End Function Public Property Get ReadBufferPtr() As Long ReadBufferPtr = m_lPtrMem End Property Public Property Get ReadBufferSize() As Long ReadBufferSize = m_lReadSize End Property Private Sub Class_Terminate() Dim bWasOpen As Boolean bWasOpen = m_bRipperOpen On Error Resume Next ' don't throw in terminate DestroyBuffer CloseRipper If (bWasOpen) Then Debug.Print "Warning: cCDTrackRipper instance terminated whilst ripper open" Debug.Assert Not (m_bRipperOpen) End If End Sub
|
|||
|