|
vbAccelerator - Contents of code file: cWAVWriter.clsThis 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 = "cWAVWriter" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False Option Explicit ' ------------------------------------------------------------ ' Name: cWAVWriter ' Author: Steve McMahon (steve@vbaccelerator.com) ' Date: 2004-05-06 ' Description: ' Wrapper around the Windows multi-media IO for writing ' 16-bit stereo 44.1kHz Wave Files. ' ' See http://vbaccelerator.com/ ' ------------------------------------------------------------ Private Type WAVEFORMATEX wFormatTag As Integer nChannels As Integer nSamplesPerSec As Long nAvgBytesPerSec As Long nBlockAlign As Integer wBitsPerSample As Integer cbSize As Integer End Type Private Type mmioinfo dwFlags As Long fccIOProc As Long pIOProc As Long wErrorRet As Long htask As Long cchBuffer As Long pchBuffer As String pchNext As String pchEndRead As String pchEndWrite As String lBufOffset As Long lDiskOffset As Long adwInfo(4) As Long dwReserved1 As Long dwReserved2 As Long hmmio As Long End Type Private Type MMCKINFO ckid As Long ckSize As Long fccType As Long dwDataOffset As Long dwFlags As Long End Type Private Declare Function mmioClose Lib "winmm.dll" (ByVal hmmio As Long, ByVal uFlags As Long) As Long Private Declare Function mmioDescend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, lpckParent As MMCKINFO, ByVal uFlags As Long) As Long Private Declare Function mmioDescendParent Lib "winmm.dll" Alias "mmioDescend" (ByVal hmmio As Long, lpck As MMCKINFO, ByVal x As Long, ByVal uFlags As Long) As Long Private Declare Function mmioOpen Lib "winmm.dll" Alias "mmioOpenA" (ByVal szFileName As String, lpmmioinfo As Any, ByVal dwOpenFlags As Long) As Long Private Declare Function mmioSeek Lib "winmm.dll" (ByVal hmmio As Long, ByVal lOffset As Long, ByVal iOrigin As Long) As Long Private Declare Function mmioStringToFOURCC Lib "winmm.dll" Alias "mmioStringToFOURCCA" (ByVal sz As String, ByVal uFlags As Long) As Long Private Declare Function mmioAscend Lib "winmm.dll" (ByVal hmmio As Long, lpck As MMCKINFO, ByVal uFlags As Long) As Long Private Declare Function mmioWrite Lib "winmm.dll" (ByVal hmmio As Long, pch As Any, ByVal cch As Long) As Long Private Declare Function mmioWriteString Lib "winmm.dll" Alias "mmioWrite" (ByVal hmmio As Long, ByVal pch As String, ByVal cch As Long) As Long Private Declare Function mmioCreateChunk Lib "winmm.dll" (ByVal hmmio As Long, pmmcki As MMCKINFO, ByVal fuCreate As Long) As Long Private Const MMIO_READ = &H0 Private Const MMIO_WRITE = &H1 '/* open file for writing only */ Private Const MMIO_READWRITE = &H2 '/* open file for reading and writing */ Private Const MMIO_FINDCHUNK = &H10 Private Const MMIO_FINDRIFF = &H20 Private Const MMIO_CREATERIFF = &H20 '/* mmioCreateChunk: make a LIST chunk */ Private Const MMIO_ALLOCBUF = &H10000 '/* mmioOpen() should allocate a buffer */ Private Const MMIO_CREATE = &H1000& '/* create new file (or truncate file) */ Private Const MM_WOM_DONE = &H3BD Private Const MMSYSERR_NOERROR = 0 Private Const SEEK_CUR = 1 Private Const SEEK_END = 2 Private Const SEEK_SET = 0 Private Const TIME_BYTES = &H4 Private Const WHDR_DONE = &H1 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal cb As Long) Private Declare Sub CopyMemoryFromString Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal source As String, ByVal cb As Long) Private Declare Sub CopyMemoryToString Lib "kernel32" Alias "RtlMoveMemory" (ByVal dest As String, source As Any, ByVal cb As Long) Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Const GMEM_FIXED = &H0 Private Const GMEM_ZEROINIT = &H40 Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT) Private m_hMmio As Long Private m_ckBlank As MMCKINFO Private m_mmckInfoChild As MMCKINFO Private m_mmckInfoParent As MMCKINFO Private Const ERR_BASE = 29600 Public Function OpenFile(ByVal sSoundFile As String) As Boolean ' close previously open file (if any) CloseFile m_hMmio = mmioOpen(sSoundFile, ByVal 0&, MMIO_ALLOCBUF Or MMIO_READWRITE Or MMIO_CREATE) If (m_hMmio = 0) Then errHandler 3, "OpenFile" Exit Function End If If (WriteWaveFormatHeader()) Then OpenFile = True End If End Function Public Function WriteWavData(ByVal lPtrBuff As Long, ByVal lWriteSize As Long) As Long Dim lSize As Long If (m_hMmio = 0) Then errHandler 5, "WriteWavData" Else ' Write to the data chunk: lSize = mmioWrite(m_hMmio, ByVal lPtrBuff, lWriteSize) ' Check we wrote the right number of bytes: If Not (lSize = lWriteSize) Then errHandler 6, "WriteWavData" End If WriteWavData = lSize End If End Function Private Function WriteWaveFormatHeader() As Boolean ' This code writes 16 bit/44.1kHz Stereo Wave Files Dim wavEx As WAVEFORMATEX wavEx.cbSize = 0 wavEx.nAvgBytesPerSec = 176400 wavEx.nBlockAlign = 4 wavEx.nChannels = 2 wavEx.nSamplesPerSec = 44100 wavEx.wBitsPerSample = 16 wavEx.wFormatTag = 1 Dim lSize As Long ' Create the RIFF header chunk: LSet m_mmckInfoParent = m_ckBlank m_mmckInfoParent.fccType = mmioStringToFOURCC("WAVE", 0) If Not (mmioCreateChunk(m_hMmio, m_mmckInfoParent, MMIO_CREATERIFF) = 0) Then mmioClose m_hMmio, 0 m_hMmio = 0 errHandler 4, "WriteWaveFormatHeader" Exit Function End If ' Create the "fmt" chunk: LSet m_mmckInfoChild = m_ckBlank m_mmckInfoChild.ckid = mmioStringToFOURCC("fmt", 0) m_mmckInfoChild.ckSize = Len(wavEx) If Not (mmioCreateChunk(m_hMmio, m_mmckInfoChild, 0) = 0) Then mmioClose m_hMmio, 0 m_hMmio = 0 errHandler 4, "WriteWaveFormatHeader" Exit Function End If lSize = mmioWrite(m_hMmio, wavEx, Len(wavEx)) If Not (lSize = Len(wavEx)) Then mmioClose m_hMmio, 0 m_hMmio = 0 errHandler 4, "WriteWaveFormatHeader" Exit Function End If ' Jump back to the RIFF chunk If Not (mmioAscend(m_hMmio, m_mmckInfoChild, 0) = 0) Then mmioClose m_hMmio, 0 m_hMmio = 0 errHandler 4, "WriteWaveFormatHeader" Exit Function End If ' Create the "data" chunk m_mmckInfoChild.ckid = mmioStringToFOURCC("data", 0) If Not (mmioCreateChunk(m_hMmio, m_mmckInfoChild, 0) = 0) Then mmioClose m_hMmio, 0 m_hMmio = 0 errHandler 4, "WriteWaveFormatHeader" Exit Function End If ' Stay in the data chunk for writing WriteWaveFormatHeader = True End Function Public Sub CloseFile() Dim lErr As Long If Not (m_hMmio = 0) Then ' Ascend the output file out of the 'data' chunk: If Not (mmioAscend(m_hMmio, m_mmckInfoChild, 0) = 0) Then lErr = 1 End If ' Ascend the output file out of the 'RIFF' chunk, this writes out ' the size of the data If Not (mmioAscend(m_hMmio, m_mmckInfoParent, 0) = 0) Then lErr = 2 End If mmioClose m_hMmio, 0 m_hMmio = 0 errHandler lErr, "CloseFile" End If End Sub Private Sub errHandler(ByVal lErr As Long, ByVal sProc As String) Dim sMsg As String Select Case lErr Case 0 ' No error Exit Sub Case 1 sMsg = "Unable to finalise data chunk; WAV file may not be usable." Case 2 sMsg = "Unable to finalise RIFF chunk; WAV file may not be usable." Case 3 sMsg = "Unable to open file for writing." Case 4 sMsg = "Unable to write the WAV file header." Case 5 sMsg = "WAV file not open." Case 6 sMsg = "Error writing data: bytes written does not match request, WAV file may not be usable." End Select Err.Raise lErr + ERR_BASE, App.EXEName & "." & sProc, sMsg End Sub Private Sub Class_Terminate() If Not (m_hMmio = 0) Then On Error Resume Next CloseFile Debug.Assert "" = "Warning: class terminated when file still open" End If End Sub
|
|||
|
||||
|