⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavestrm.cls

📁 一个VB做的语音系统控件
💻 CLS
📖 第 1 页 / 共 4 页
字号:
    
    '<<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 + -