📄 wavestrm.cls
字号:
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveOutHdr.dwFlags, WHDR_PREPARED)
'Call InitWaveFormat(cWavefmt, waveCodec, TIMESLICE) ' Set current wave format
Call InitWaveFormat(cWavefmt, WAVE_FORMAT_PCM, TIMESLICE) ' Set current wave format
' Open/Configure an acm Stream Handle For Compression
rc = acmStreamOpen(hAS, 0&, waveFmt, cWavefmt, 0&, 0&, 0&, ACM_STREAMOPENF_NONREALTIME)
Call AudioErrorHandler(rc, "acmStreamOpen")
' Initialize Audio Compression wave streaming headers...
Call InitAcmHDR(hAS, acmHdr, WaveOutHdr)
Call InitAcmHDR(hAS, acmHdr_x, WaveOutHdr_x)
' Prepare acm Stream Header
rc = acmStreamPrepareHeader(hAS, acmHdr, 0&)
Call AudioErrorHandler(rc, "acmStreamPrepareHeader")
' Prepare acm Stream Header
rc = acmStreamPrepareHeader(hAS, acmHdr_x, 0&)
Call AudioErrorHandler(rc, "acmStreamPrepareHeader_x")
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForACMCallBack(acmHdr_x.dwStatus, ACMSTREAMHEADER_STATUSF_PREPARED)
' Wait For Wave Header CallBack
Call WaitForACMCallBack(acmHdr.dwStatus, ACMSTREAMHEADER_STATUSF_PREPARED)
' <<<Double Buffer>>> Write (extra)Wave Buffer To Output Device...
rc = waveOutWrite(hWaveOut, WaveOutHdr_x, Len(WaveOutHdr_x))
If Not AudioErrorHandler(rc, "waveOutWrite_x") Then GoTo ErrorPlayWave ' Validate Return Code
Do
' Copy Wave Data To Buffer
If Not (LoadPlayBuffer(hWaveOut, WaveOutHdr, waveFmt, _
PlayWaveBuffer.Stream(StreamIdx).Waves(CurPlayPos(StreamIdx)).Data, _
CurPlayPos(StreamIdx))) Then GoTo CleanUpPlayWave ' Cleanup And Leave
' <<Double Buffering>> Compress acm Stream Wave Buffer
rc = acmStreamConvert(hAS, acmHdr, ACM_STREAMCONVERTF_BLOCKALIGN)
If Not AudioErrorHandler(rc, "acmStreamConvert") Then GoTo ErrorPlayWave
' Write Wave Buffer To Output Device...
rc = waveOutWrite(hWaveOut, WaveOutHdr, Len(WaveOutHdr))
If Not AudioErrorHandler(rc, "waveOutWrite") Then GoTo ErrorPlayWave ' Validate Return Code
' <<<Double Buffer>>> Wait For Wave Header CallBack
Call WaitForCallBack(WaveOutHdr_x.dwFlags, WHDR_DONE)
' <<<Double Buffer>>> Copy (extra)Wave Data To Buffer
If Not (LoadPlayBuffer(hWaveOut, WaveOutHdr_x, waveFmt, _
PlayWaveBuffer.Stream(StreamIdx).Waves(CurPlayPos(StreamIdx)).Data, _
CurPlayPos(StreamIdx))) Then GoTo CleanUpPlayWave ' Cleanup And Leave
' <<Double Buffering>> Compress acm Stream Wave Buffer
rc = acmStreamConvert(hAS, acmHdr_x, ACM_STREAMCONVERTF_BLOCKALIGN)
If Not AudioErrorHandler(rc, "acmStreamConvert_x") Then GoTo ErrorPlayWave
' <<<Double Buffer>>> Write (extra)Wave Buffer To Output Device...
rc = waveOutWrite(hWaveOut, WaveOutHdr_x, Len(WaveOutHdr_x))
If Not AudioErrorHandler(rc, "waveOutWrite_x") Then GoTo ErrorPlayWave ' Validate Return Code
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveOutHdr.dwFlags, WHDR_DONE)
Loop While Playing ' Continue Playing...
'------------------------------------------------------------------
CleanUpPlayWave: ' Cleanup...
'------------------------------------------------------------------
' <<Double Buffering>> UnPrepare acm Stream Header
rc = acmStreamUnprepareHeader(hAS, acmHdr_x, 0&)
Call AudioErrorHandler(rc, "acmStreamUnprepareHeader_x")
' UnPrepare acm Stream Header
rc = acmStreamUnprepareHeader(hAS, acmHdr, 0&)
Call AudioErrorHandler(rc, "acmStreamUnprepareHeader")
Call FreeAcmHdr(acmHdr) ' Free wave header memory
Call FreeAcmHdr(acmHdr_x) ' Free extra wave header memory
' Close acm Stream Handle
rc = acmStreamClose(hAS, 0&)
Call AudioErrorHandler(rc, "acmStreamClose")
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveOutHdr.dwFlags, WHDR_DONE)
' Unprepare Wave Output Buffer
rc = waveOutUnprepareHeader(hWaveOut, WaveOutHdr, Len(WaveOutHdr))
' <<Double Buffer>> Wait For Wave Header CallBack
Call WaitForCallBack(WaveOutHdr_x.dwFlags, WHDR_DONE)
' <<Double Buffer>> Unprepare Wave Output Buffer
rc = waveOutUnprepareHeader(hWaveOut, WaveOutHdr_x, Len(WaveOutHdr_x))
' Close Output Wave Device
rc = waveOutClose(hWaveOut)
If Not AudioErrorHandler(rc, "waveOutClose") Then Exit Function ' Validate Return Code
' Clean Up Memory Data...
rc = FreeWaveHDR(WaveOutHdr) ' Free Wave Header Data
rc = FreeWaveHDR(WaveOutHdr_x) ' Free Extra Wave Header Data
PlayWave = True ' Return Success
PlayDeviceFree = True ' Free Recording Device
Exit Function ' Exit
'------------------------------------------------------------------
ErrorPlayWave: ' Handle Errors And Cleanup...
'------------------------------------------------------------------
rc = acmStreamUnprepareHeader(hAS, acmHdr, 0&) ' Attempt To UnPrepare acm Stream Header
rc = acmStreamUnprepareHeader(hAS, acmHdr_x, 0&) ' Attempt To UnPrepare acm Stream (xtra)Header
Call FreeAcmHdr(acmHdr) ' Free wave header memory
Call FreeAcmHdr(acmHdr_x) ' Free extra wave header memory
rc = acmStreamClose(hAS, 0&) ' Attempt To Close acm Stream Handle
rc = waveOutUnprepareHeader(hWaveOut, WaveOutHdr, Len(WaveOutHdr)) ' Attempt To Unprepare Header
rc = waveOutUnprepareHeader(hWaveOut, WaveOutHdr_x, Len(WaveOutHdr_x)) ' Attempt To Unprepare Header
rc = waveOutClose(hWaveOut) ' Close Wave Output Device
rc = FreeWaveHDR(WaveOutHdr) ' Free Wave Header Data
rc = FreeWaveHDR(WaveOutHdr_x) ' Free Extra Wave Header Data
PlayDeviceFree = True ' Free Recording Device Flag
Exit Function ' Exit
'------------------------------------------------------------------
End Function
'------------------------------------------------------------------
'------------------------------------------------------------------
Private Sub IncBufferPointer(NextVal As Long)
' Moves Buffer Pointer Up One Notch In A Continuous Loop...
'------------------------------------------------------------------
If NextVal < MAXBUFFERS Then ' If Not At End Of Buffer
NextVal = NextVal + 1 ' Increment Buffer Pointer
Else ' At End Of Buffer
NextVal = MINBUFFERS ' Go To Beginning Of Buffer
End If
'------------------------------------------------------------------
End Sub
'------------------------------------------------------------------
'------------------------------------------------------------------
Private Sub InitWaveFormat(waveFmt As WAVEFORMATEX, fmtType As Long, Time_Slice As Single)
' Initializes Wave Format Data Type
'------------------------------------------------------------------
Dim i As Long
'------------------------------------------------------------------
Select Case fmtType
Case WAVE_FORMAT_ADPCM
waveFmt.wFormatTag = WAVE_FORMAT_ADPCM ' wave format type
waveFmt.nChannels = 1 ' number of channels - mono
waveFmt.wBitsPerSample = 4 ' bits/sample of TRUESPEECH - not used.
waveFmt.nSamplesPerSec = c8_0kHz ' sample rate kHz
waveFmt.nAvgBytesPerSec = 4055 ' Bytes/Sec
waveFmt.nBlockAlign = 256 ' block size of data
waveFmt.cbSize = 2 ' extra bytes used for WaveFormatEx
waveFmt.xBytes(0) = &HF9 ' Fact Chunk - Byte 0
waveFmt.xBytes(1) = &H1 ' Fact Chunk - Byte 1
Case WAVE_FORMAT_MSN_AUDIO ' Initialize Wave Format - WAVE_FORMAT_MSN_AUDIO
waveFmt.wFormatTag = WAVE_FORMAT_MSN_AUDIO ' wave format type
waveFmt.nChannels = 1 ' number of channels - mono
waveFmt.wBitsPerSample = 0 ' bits/sample of TRUESPEECH - not used.
waveFmt.cbSize = 4 ' extra bytes used for WaveFormatEx
waveFmt.xBytes(0) = &H40 ' Fact Chunk - Byte 0
waveFmt.xBytes(1) = &H1 ' Fact Chunk - Byte 1
'<<< 8.0 kHz - 8200 Bauds >>> (Fair, No FeedBack)
waveFmt.nSamplesPerSec = c8_0kHz ' sample rate kHz
waveFmt.nAvgBytesPerSec = 1025 ' Bytes/Sec
waveFmt.nBlockAlign = 41 ' block size of data
waveFmt.xBytes(2) = &H8 ' Fact Chunk - Byte 2
waveFmt.xBytes(3) = &H20 ' Fact Chunk - Byte 3
'<<< 8.0 kHz - 10000 Bauds >>> (Excellent, No FeedBack)
' WaveFmt.nSamplesPerSec = c8_0kHz ' sample rate kHz
' WaveFmt.nAvgBytesPerSec = 1250 ' Bytes/Sec
' WaveFmt.nBlockAlign = 50 ' block size of data
' WaveFmt.xBytes(2) = &H10 ' Fact Chunk - Byte 2
' WaveFmt.xBytes(3) = &H27 ' Fact Chunk - Byte 3
'<<< 11.025 kHz - 11301 Bauds >>> (Bad, FeedBack)
'<<< 11.025 kHz - 12128 Bauds >>> (Bad, FeedBack)
'<<< 11.025 kHz - 13782 Bauds >>> (Bad, FeedBack)
Case WAVE_FORMAT_GSM610 ' Initialize Wave Format - WAVE_FORMAT_GSM610
waveFmt.wFormatTag = WAVE_FORMAT_GSM610 ' wave format type
waveFmt.nChannels = 1 ' number of channels - mono
waveFmt.nSamplesPerSec = c8_0kHz ' sample rate kHz
waveFmt.nAvgBytesPerSec = 1625 ' Bytes/Sec
waveFmt.nBlockAlign = 65 ' block size of data
waveFmt.wBitsPerSample = 0 ' bits/sample of TRUESPEECH - not used.
waveFmt.cbSize = 2 ' extra bytes used for WaveFormatEx
waveFmt.xBytes(0) = &H40 ' Fact Chunk - Byte 0
waveFmt.xBytes(1) = &H1 ' Fact Chunk - Byte 1
Case WAVE_FORMAT_PCM ' Initialize Wave Format - WAVE_FORMAT_PCM
waveFmt.wFormatTag = WAVE_FORMAT_PCM ' format type
waveFmt.nChannels = WAVE_FORMAT_1M08 ' number of channels (i.e. mono, stereo, etc.)
waveFmt.nSamplesPerSec = c8_0kHz ' sample rate 8.0 kHz
waveFmt.nAvgBytesPerSec = waveFmt.nSamplesPerSec ' for buffer estimation
waveFmt.wBitsPerSample = 8 ' [8, 16, or 0]
waveFmt.nBlockAlign = waveFmt.nChannels * waveFmt.wBitsPerSample / 8 ' block size of data
waveFmt.cbSize = 0 ' Not Used If [wFormatTag= WAVE_FORMAT_PCM]
End Select
'------------------------------------------------------------------
End Sub
'------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -