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

📄 wavestrm.cls

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