📄 wavestrm.cls
字号:
'<<Double Buffering>> Initialize Wave Header Format Information
Call InitWaveHDR(WaveInHDR_x, waveFmt, (waveFmt.nAvgBytesPerSec * TIMESLICE))
' Initialize Wave Header Format Information
Call InitWaveHDR(WaveInHDR, waveFmt, (waveFmt.nAvgBytesPerSec * TIMESLICE))
' <<Double Buffering>> Prepare Input Wave Device Header
rc = waveInPrepareHeader(hWaveIn, WaveInHDR_x, Len(WaveInHDR_x)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInPrepareHeader_x") Then GoTo ErrorRecordWave
' Prepare Input Wave Device Header
rc = waveInPrepareHeader(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInPrepareHeader") Then GoTo ErrorRecordWave
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForCallBack(WaveInHDR_x.dwFlags, WHDR_PREPARED)
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveInHDR.dwFlags, WHDR_PREPARED)
' <<Double Buffering>> Add Input Wave (xtra)Buffer To Wave Input Device
rc = waveInAddBuffer(hWaveIn, WaveInHDR_x, Len(WaveInHDR_x)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInAddBuffer_x") Then GoTo ErrorRecordWave
' Add Input Wave Buffer To Wave Input Device
rc = waveInAddBuffer(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInAddBuffer") Then GoTo ErrorRecordWave
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForCallBack(WaveInHDR_x.dwFlags, WHDR_PREPARED)
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveInHDR.dwFlags, WHDR_PREPARED)
Call InitWaveFormat(cWavefmt, waveCodec, 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 Manager Streaming Headers
Call InitAcmHDR(hAS, acmHdr, WaveInHDR)
Call InitAcmHDR(hAS, acmHdr_x, WaveInHDR_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)
' Start Input Wave Device Recording...
rc = waveInStart(hWaveIn) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInStart") Then GoTo ErrorRecordWave
Do
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForCallBack(WaveInHDR_x.dwFlags, WHDR_DONE)
' <<Double Buffering>> Compress acm Stream Wave Buffer
rc = acmStreamConvert(hAS, acmHdr_x, ACM_STREAMCONVERTF_BLOCKALIGN)
If Not AudioErrorHandler(rc, "acmStreamConvert_x") Then GoTo ErrorRecordWave
rc = SendSoundAll(TCPSocket, acmHdr_x) ' <<Double Buffering>> Send Sound Buffer To TCPSocket
If Not Recording Then Exit Do ' Evaluate Recording Stop Flag
' <<Double Buffering>> Add Input Wave (xtra)Buffer To Wave Input Device
rc = waveInAddBuffer(hWaveIn, WaveInHDR_x, Len(WaveInHDR_x)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInAddBuffer_x") Then GoTo ErrorRecordWave
Call WaitForCallBack(WaveInHDR.dwFlags, WHDR_DONE) ' Wait For Wave Header CallBack
' Convert/Compress acm Stream Wave Buffer
rc = acmStreamConvert(hAS, acmHdr, ACM_STREAMCONVERTF_BLOCKALIGN)
If Not AudioErrorHandler(rc, "acmStreamConvert") Then GoTo ErrorRecordWave
rc = SendSoundAll(TCPSocket, acmHdr) ' Send Sound Buffer To TCPSocket
If Not Recording Then Exit Do ' Evaluate Recording Stop Flag
' Add Input Wave Buffer To Wave Input Device
rc = waveInAddBuffer(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInAddBuffer") Then GoTo ErrorRecordWave
Loop While Recording ' Continue Recording...
' <<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")
' Free globally allocated and locked memory variables...
Call FreeAcmHdr(acmHdr_x) ' Free extra wave header memory
Call FreeAcmHdr(acmHdr) ' Free wave header memory
' Close acm Stream Handle
rc = acmStreamClose(hAS, 0&)
Call AudioErrorHandler(rc, "acmStreamClose")
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForCallBack(WaveInHDR_x.dwFlags, WHDR_DONE)
' Wait For Wave Header CallBack
Call WaitForCallBack(WaveInHDR.dwFlags, WHDR_DONE)
' Stop Input Wave Device
rc = waveInStop(hWaveIn) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInStop") Then GoTo ErrorRecordWave
' UnPrepare Input Wave Device Header
rc = waveInUnprepareHeader(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInUnPrepareHeader") Then GoTo ErrorRecordWave
' <<Double Buffering>> UnPrepare Input Wave Device (xtra)Header
rc = waveInUnprepareHeader(hWaveIn, WaveInHDR_x, Len(WaveInHDR_x)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInUnPrepareHeader_x") Then GoTo ErrorRecordWave
' Close Input Wave Device
rc = waveInClose(hWaveIn) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveInClose") Then Exit Function
' Clean Up Memory Data...
rc = FreeWaveHDR(WaveInHDR) ' Free Wave Header Data
rc = FreeWaveHDR(WaveInHDR_x) ' Free Extra Wave Header Data
RecordWave = True ' Return Success
RecDeviceFree = True ' Free Recording Device
Exit Function ' Exit
'------------------------------------------------------------------
ErrorRecordWave: ' Clean Up Environment(Brute force no error handling)...
'------------------------------------------------------------------
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 = waveInStop(hWaveIn) ' Attempt To Stop WaveInput Device
rc = waveInReset(hWaveIn) ' Attempt To Reset WaveInput Device
rc = waveInUnprepareHeader(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Attempt To Unprepare WaveInput Header
rc = waveInUnprepareHeader(hWaveIn, WaveInHDR_x, Len(WaveInHDR_x)) ' Attempt To Unprepare WaveInput (xtra)Header
rc = waveInClose(hWaveIn) ' Attempt To Close Wave Input Device
rc = FreeWaveHDR(WaveInHDR) ' Free Wave Header Data
rc = FreeWaveHDR(WaveInHDR_x) ' Free Extra Wave Header Data
RecDeviceFree = True ' Free Recording Device
Exit Function ' Exit
'------------------------------------------------------------------
End Function
'------------------------------------------------------------------
'------------------------------------------------------------------
Public Function PlayWave(hWND As Long, StreamIdx As Integer) As Boolean
' Play's Back Audio Wave Data From String Buffers...
'------------------------------------------------------------------
Dim rc As Long ' Function Return Code
Dim hAS As Long ' ACM stream device
Dim acmHdr As ACMSTREAMHEADER ' ACM stream header
Dim acmHdr_x As ACMSTREAMHEADER ' <<Double Buffering>> ACM stream header
Dim cWavefmt As WAVEFORMATEX ' Wave compression format
Dim waveFmt As WAVEFORMATEX ' Wave format type
Dim hWaveOut As Long ' Handle To A Wave Output Device
Dim WaveOutHdr As WAVEHDR ' Handle To A Wave Output Device Header
Dim WaveOutHdr_x As WAVEHDR ' Handle To A Wave Output Device Header
'------------------------------------------------------------------
Call InitWaveFormat(waveFmt, waveCodec, TIMESLICE) ' Set current wave format
' Open Output Wave Device
rc = waveOutOpen(hWaveOut, WAVE_MAPPER, waveFmt, 0&, 0&, CALLBACK_NULL)
If Not AudioErrorHandler(rc, "waveOutOpen") Then Exit Function ' Validate Return Code
PlayDeviceFree = False ' Allocate Recording Device
' Init Extra Wave Header Format Information
Call InitWaveHDR(WaveOutHdr_x, waveFmt, (waveFmt.nAvgBytesPerSec * TIMESLICE))
' Init Wave Header Format Information
Call InitWaveHDR(WaveOutHdr, waveFmt, (waveFmt.nAvgBytesPerSec * TIMESLICE))
' Prepare Output Wave Device Header
rc = waveOutPrepareHeader(hWaveOut, WaveOutHdr_x, Len(WaveOutHdr_x)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveOutPrepareHeader") Then GoTo ErrorPlayWave
' Prepare Output Wave Device Header
rc = waveOutPrepareHeader(hWaveOut, WaveOutHdr, Len(WaveOutHdr)) ' Validate Return Code
If Not AudioErrorHandler(rc, "waveOutPrepareHeader") Then GoTo ErrorPlayWave
' <<<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 ErrorPlayWave ' Cleanup And Leave
' <<Double Buffering>> Wait For Wave (xtra)Header CallBack
Call WaitForCallBack(WaveOutHdr_x.dwFlags, WHDR_PREPARED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -