用VB通过低级音频函数写录音程序遇到问题:
WAVEHDR的C声名如下:
typedef struct {
LPSTR lpData; //音频数据缓冲区地址
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag * lpNext;
DWORD reserved;
} WAVEHDR;VB API浏览器得到的声名如下:
Public Type WAVEHDR
lpData As String
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
dwLoops As Long
lpNext As Long
Reserved As Long
End Type使用该结构的函数:
Public Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
--其中lpWaveInHdr是该结构变量,uSize是该结构的长度.现在的问题是:
lpData参数存放的是音频数据(二进制)而不是字符串,如果就这么调用waveInPrepareHeader函数,则VB可能会把lpData当成是字符串自动做Unicode到ANSI的转换后传给DLL,且获得uSize参数时,Len(lpWaveInHdr)和C中的SizeOf(WAVEHDR)结果也不同(SizeOf返回结构是32,Len返回的取决于lpData的长度)..但如果把lpData声名为Long(用来存放缓冲区句柄),则无法通过VB直接得到缓冲区(我定义的Byte数组)的句柄,即不能这样赋值:lpWaveInHdr.lpData=bytBuffer()......如果传递地址的参数在函数定义内,可以用ByRef搞定,但现在间接通过WAVEHDR传递地址,有没有办法呢?我找遍MSDN都没有答案....
谢谢!!
WAVEHDR的C声名如下:
typedef struct {
LPSTR lpData; //音频数据缓冲区地址
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag * lpNext;
DWORD reserved;
} WAVEHDR;VB API浏览器得到的声名如下:
Public Type WAVEHDR
lpData As String
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
dwLoops As Long
lpNext As Long
Reserved As Long
End Type使用该结构的函数:
Public Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
--其中lpWaveInHdr是该结构变量,uSize是该结构的长度.现在的问题是:
lpData参数存放的是音频数据(二进制)而不是字符串,如果就这么调用waveInPrepareHeader函数,则VB可能会把lpData当成是字符串自动做Unicode到ANSI的转换后传给DLL,且获得uSize参数时,Len(lpWaveInHdr)和C中的SizeOf(WAVEHDR)结果也不同(SizeOf返回结构是32,Len返回的取决于lpData的长度)..但如果把lpData声名为Long(用来存放缓冲区句柄),则无法通过VB直接得到缓冲区(我定义的Byte数组)的句柄,即不能这样赋值:lpWaveInHdr.lpData=bytBuffer()......如果传递地址的参数在函数定义内,可以用ByRef搞定,但现在间接通过WAVEHDR传递地址,有没有办法呢?我找遍MSDN都没有答案....
谢谢!!
既然是地址,就声明为long吧Private Type WaveFormatEx
FormatTag As Integer
Channels As Integer
SamplesPerSec As Long
AvgBytesPerSec As Long
BlockAlign As Integer
BitsPerSample As Integer
ExtraDataSize As Integer
End TypePrivate Type WaveHdr
lpData As Long
dwBufferLength As Long
dwBytesRecorded As Long
dwUser As Long
dwFlags As Long
dwLoops As Long
lpNext As Long
Reserved As Long
End TypePrivate Type WaveInCaps
ManufacturerID As Integer
ProductID As Integer
DriverVersion As Long
ProductName(1 To 32) As Byte
Formats As Long
Channels As Integer
Reserved As Integer
End TypeConst WAVE_INVALIDFORMAT = &H0& 'invalid forma
Const WAVE_FORMAT_1M08 = &H1& '11.025 kHz,Mono, 8-bit
Const WAVE_FORMAT_1S08 = &H2& '11.025 kHz,Stereo, 8-bit
Const WAVE_FORMAT_1M16 = &H4& '11.025 kHz,Mono, 16-bit
Const WAVE_FORMAT_1S16 = &H8& '11.025 kHz,Stereo,16-bit
Const WAVE_FORMAT_2M08 = &H10& '22.05 kHz,Mono, 8-bit
Const WAVE_FORMAT_2S08 = &H20& '22.05 kHz,Stereo, 8-bit
Const WAVE_FORMAT_2M16 = &H40& '22.05 kHz,Mono, 16-bit
Const WAVE_FORMAT_2S16 = &H80& '22.05 kHz,Stereo,16-bit
Const WAVE_FORMAT_4M08 = &H100& '44.1 kHz,Mono, 8-bit
Const WAVE_FORMAT_4S08 = &H200& '44.1 kHz,Stereo, 8-bit
Const WAVE_FORMAT_4M16 = &H400& '44.1 kHz,Mono, 16-bit
Const WAVE_FORMAT_4S16 = &H800& '44.1 kHz,Stereo,16-bitConst WAVE_FORMAT_PCM = 1Const WHDR_DONE = &H1&
Const WHDR_PREPARED = &H2&
Const WHDR_BEGINLOOP = &H4&
Const WHDR_ENDLOOP = &H8&
Const WHDR_INQUEUE = &H10&参考:
http://www.activevb.de/tipps/vb6tipps/tipp0406.html(代码很长,我就不贴了)可从:
http://www.activevb-archiv.de/downloadstore/tipps/vb6/tipp0406.zip
下载源代码
OK已经搞定,谢谢!