找回密码
 注册
搜索
查看: 3514|回复: 1

VB的语音聊天API播放接收音频源代码,高手改成易语言的呀。希望对语音研究有用

[复制链接]
发表于 2011-5-13 21:05:33 | 显示全部楼层 |阅读模式
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)

' 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
'------------------------------------------------------------------
 楼主| 发表于 2011-5-13 21:06:05 | 显示全部楼层

声明部分

Public Const MAXEXTRABYTES = 3 ' Maximum (Extra Bytes + 1) In Non PCM Wave Formats...
Public Const MAXBUFFERS = 500 ' Maximum Wave Buffer Array Member
Public Const MINBUFFERS = 0 ' Minimum Wave Buffer Array Member


'== MCI Wave Constants ================================================
' Sound Quality
Public Const c8_0kHz = 8000 ' 8.0 khz
Public Const c11_025kHz = 11025 ' 11.025 khz
Public Const c22_05kHz = 22050 ' 22.05 khz
Public Const c44_1kHz = 44010 ' 44.1 khz


' Sound Format
Public Const WAVE_FORMAT_PCM = &H1 ' Microsoft Windows PCM Wave Format
Public Const WAVE_FORMAT_ADPCM = &H11 ' ADPCM Wave Format
Public Const WAVE_FORMAT_IMA_ADPCM = &H11 ' IMA ADPCM Wave Format
Public Const WAVE_FORMAT_DVI_ADPCM = &H11 ' DVI ADPCM Wave Format
Public Const WAVE_FORMAT_DSPGROUP_TRUESPEECH = &H22 ' DSP Group Wave Format
Public Const WAVE_FORMAT_GSM610 = &H31 ' GSM610 Wave Format
Public Const WAVE_FORMAT_MSN_AUDIO = &H32 ' MSN Audio Wave Format


' PCM Wave Format Types
Public Const WAVE_FORMAT_1M08 = &H1 ' 11.025 kHz, Mono, 8-bit
Public Const WAVE_FORMAT_1M16 = &H4 ' 11.025 kHz, Mono, 16-bit
Public Const WAVE_FORMAT_1S08 = &H2 ' 11.025 kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_1S16 = &H8 ' 11.025 kHz, Stereo, 16-bit
Public Const WAVE_FORMAT_2M08 = &H10 ' 22.05 kHz, Mono, 8-bit
Public Const WAVE_FORMAT_2M16 = &H40 ' 22.05 kHz, Mono, 16-bit
Public Const WAVE_FORMAT_2S08 = &H20 ' 22.05 kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_2S16 = &H80 ' 22.05 kHz, Stereo, 16-bit
Public Const WAVE_FORMAT_4M08 = &H100 ' 44.1 kHz, Mono, 8-bit
Public Const WAVE_FORMAT_4M16 = &H400 ' 44.1 kHz, Mono, 16-bit
Public Const WAVE_FORMAT_4S08 = &H200 ' 44.1 kHz, Stereo, 8-bit
Public Const WAVE_FORMAT_4S16 = &H800 ' 44.1 kHz, Stereo, 16-bit


'== Wave...Open() Constants ===========================================
Public Const WAVE_FORMAT_QUERY = &H1& ' Query wave format flag
Public Const WAVE_MAPPER = (-1) ' Maps To First Available Sound Device
Public Const WAVE_ALLOWSYNC = &H2& ' Asynchronous playback flag
Public Const CALLBACK_WINDOW = &H10000 ' dwCallback is a HWND
Public Const CALLBACK_NULL = &H0& ' no callback


'== MCI WaveHeader Bit Values In dwflags ==============================
Public Const WHDR_DONE = &H1& '[00001][01] done bit
Public Const WHDR_PREPARED = &H2& '[00010][02] set if this header has been prepared
Public Const WHDR_BEGINLOOP = &H4& '[00100][04] loop start block
Public Const WHDR_ENDLOOP = &H8& '[01000][08] loop end block
Public Const WHDR_INQUEUE = &H10& '[10000][16] reserved for driver


'== MCI MM Return Codes ===============================================
Public Const ERROR_SHARING_VIOLATION = 32
Public Const MMSYSERR_NOERROR = 0 ' no error
Public Const MMSYSERR_BASE = 0
Public Const MMSYSERR_ERROR = (MMSYSERR_BASE + 1) ' unspecified error
Public Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2) ' device ID out of range
Public Const MMSYSERR_NOTENABLED = (MMSYSERR_BASE + 3) ' driver failed enable
Public Const MMSYSERR_ALLOCATED = (MMSYSERR_BASE + 4) ' device already allocated
Public Const MMSYSERR_INVALHANDLE = (MMSYSERR_BASE + 5) ' device handle is invalid
Public Const MMSYSERR_NODRIVER = (MMSYSERR_BASE + 6) ' no device driver present
Public Const MMSYSERR_NOMEM = (MMSYSERR_BASE + 7) ' memory allocation error
Public Const MMSYSERR_NOTSUPPORTED = (MMSYSERR_BASE + 8) ' function isn't supported
Public Const MMSYSERR_BADERRNUM = (MMSYSERR_BASE + 9) ' error value out of range
Public Const MMSYSERR_INVALFLAG = (MMSYSERR_BASE + 10) ' invalid flag passed
Public Const MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11) ' invalid parameter passed
Public Const MMSYSERR_LASTERROR = (MMSYSERR_BASE + 11) ' last error in range


Public Const WAVERR_BASE = 32
Public Const WAVERR_BADFORMAT = (WAVERR_BASE + 0) ' unsupported wave format
Public Const WAVERR_STILLPLAYING = (WAVERR_BASE + 1) ' still something playing
Public Const WAVERR_UNPREPARED = (WAVERR_BASE + 2) ' header not prepared
Public Const WAVERR_LASTERROR = (WAVERR_BASE + 3) ' last error in range
Public Const WAVERR_SYNC = (WAVERR_BASE + 3) ' device is synchronous


'== flag values for wFlags parameter ==================================
Public Const SND_SYNC = &H0 ' play synchronously (default)
Public Const SND_ASYNC = &H1 ' play asynchronously
Public Const SND_NODEFAULT = &H2 ' don't use default sound
Public Const SND_MEMORY = &H4 ' lpszSoundName points to a memory file
Public Const SND_LOOP = &H8 ' loop the sound until next sndPlaySound
Public Const SND_NOSTOP = &H10 ' don't stop any currently playing sound


'== MCI Wave API Declarations ================================================
Declare Function timeGetTime Lib "winmm.dll" () As Long
'Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal SoundData As Any, ByVal uFlags As Long) As Long


Declare Function waveInOpen Lib "winmm.dll" (lphWaveIn As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMATEX, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInUnprepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInAddBuffer Lib "winmm.dll" (ByVal hWaveIn As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveInStart Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
Declare Function waveInStop Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
Declare Function waveInReset Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
Declare Function waveInClose Lib "winmm.dll" (ByVal hWaveIn As Long) As Long


Declare Function waveOutOpen Lib "winmm.dll" (lphWaveOut As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMATEX, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Declare Function waveOutPrepareHeader Lib "winmm.dll" (ByVal hWaveOut As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveOutUnprepareHeader Lib "winmm.dll" (ByVal hWaveOut As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveOutWrite Lib "winmm.dll" (ByVal hWaveOut As Long, wH As WAVEHDR, ByVal uSize As Long) As Long
Declare Function waveOutClose Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
Declare Function waveOutReset Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
Declare Function waveOutPause Lib "winmm.dll" (ByVal hWaveOut As Long) As Long
Declare Function waveOutRestart Lib "winmm.dll" (ByVal hWaveOut As Long) As Long


'== Global Memory Functions ==================================================
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long


Declare Sub CopyPTRtoBYTES Lib "Kernel32.dll" Alias "RtlMoveMemory" (ByRef ByteDest As Byte, ByVal PtrSrc As Long, ByVal length As Long)
Declare Sub CopyBYTEStoPTR Lib "Kernel32.dll" Alias "RtlMoveMemory" (ByVal PtrDest As Long, ByRef ByteSrc As Byte, ByVal length As Long)


Public Const GMEM_MOVEABLE = &H2&
Public Const GMEM_SHARE = &H2000&
Public Const GMEM_ZEROINIT = &H40&


'== MCI User Defined Data Types...=======================================
Type WAVEHDR
lpData As Long ' pointer to locked data buffer
dwBufferLength As Long ' length of data buffer
dwBytesRecorded As Long ' used for input only
dwUser As Long ' for client's use
dwFlags As Long ' assorted flags (see defines)
dwLoops As Long ' loop control counter
wavehdr_tag As Long ' reserved for driver
Reserved As Long ' reserved for driver
hData As Long ' handle to locked data buffer
End Type


Type WAVEFORMATEX
wFormatTag As Integer ' format type
nChannels As Integer ' number of channels (i.e. mono, stereo, etc.)
nSamplesPerSec As Long ' sample rate
nAvgBytesPerSec As Long ' for buffer estimation
nBlockAlign As Integer ' block size of data
wBitsPerSample As Integer ' Bits Per Sample
cbSize As Integer ' Size Of (FACT CHUNCK)
xBytes(MAXEXTRABYTES) As Byte ' (FACT CHUNCK)
End Type
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-19 05:30 , Processed in 0.200098 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表