请问;这是有关声卡采集方面的问题,为什么waveinopen()的返回值是32?我的机器上有两个录音设备,一个是猫,一个是声卡。
unit caiji;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,MMSystem, ExtCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
trecorder=class
private
Fwavefmt:Twaveformatex;
wavehandle:hwavein;
wavehdr1:pwavehdr;
wavebuffer1:lpstr;
zc:integer;
procedure callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall;
end;var
Form1: TForm1;
recorder:trecorder;
umsg,dwinstance,dwparam1,dwparam2:dword;
dddd:WAVEINCAPS;
implementation
{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
re:uint;
wave_num:uint;
str:string;
mmrError:MMRESULT;
pszText: LPSTR;
cchText:UINT;
begin
recorder:=trecorder.Create;
recorder.Fwavefmt.wFormatTag:=wave_format_pcm;
recorder.Fwavefmt.nSamplesPerSec:=11025; //采样速率
recorder.Fwavefmt.nAvgBytesPerSec:=22050; //每秒采样得到的数据
recorder.Fwavefmt.wBitsPerSample:=16; //量化位数
recorder.Fwavefmt.nBlockAlign:=2; //记录区块对齐的单位。
re:=waveInGetNumDevs;
re:= waveinopen(@recorder.wavehandle,wave_mapper,(@recorder.Fwavefmt),dword(@trecorder.callback),dword(@recorder), callback_function+wave_allowsync );//callback_function+wave_allowsync;
showmessage(inttostr(re));
case re of
MMSYSERR_ALLOCATED:showmessage('已经分配内存');
MMSYSERR_BADDEVICEID:showmessage('超出索引');
MMSYSERR_NODRIVER:showmessage('没有驱动');
MMSYSERR_NOMEM:showmessage('不能分配内存');
WAVERR_BADFORMAT:showmessage('打开不支持的设备');
end;//end case
////////////////////////////////////
//////////为采样数据分配缓冲空间
recorder.wavehdr1:=globalallocptr(ghnd or gmem_share,sizeof(wavehdr));
recorder.wavebuffer1:=globalallocptr(ghnd or gmem_share,1024);
recorder.wavehdr1.lpData:=recorder.wavebuffer1;
recorder.wavehdr1.dwBufferLength:=1024;
waveinprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr));
waveinaddbuffer(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr));
waveinunprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(twavehdr));
globalfreeptr(recorder.wavebuffer1);
////////////////////////////////////////////////////////////////////////////////////////
///////////启动波形输入设备
re:=waveinstart(1);
showmessage(inttostr(re));
case re of
MMSYSERR_INVALHANDLE: showmessage('Specified device handle is invalid.');
MMSYSERR_NODRIVER: showmessage('No device driver is present.' ) ;
MMSYSERR_NOMEM:showmessage( 'Unable to allocate or lock memory.' );
end;
end;
procedure trecorder.callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall;
var i:integer;
spbyte:^byte;
singledata:integer;
begin
showmessage('good');
case umsg of
mm_wim_open:
begin
showmessage('good');
end;
mm_wim_data:
begin
spbyte:=pointer(dwparam1);
for i:=0 to 100 do
begin
singledata:=spbyte^;
inc(spbyte);
end;
end;
end;
end;end.
unit caiji;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,MMSystem, ExtCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
trecorder=class
private
Fwavefmt:Twaveformatex;
wavehandle:hwavein;
wavehdr1:pwavehdr;
wavebuffer1:lpstr;
zc:integer;
procedure callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall;
end;var
Form1: TForm1;
recorder:trecorder;
umsg,dwinstance,dwparam1,dwparam2:dword;
dddd:WAVEINCAPS;
implementation
{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
re:uint;
wave_num:uint;
str:string;
mmrError:MMRESULT;
pszText: LPSTR;
cchText:UINT;
begin
recorder:=trecorder.Create;
recorder.Fwavefmt.wFormatTag:=wave_format_pcm;
recorder.Fwavefmt.nSamplesPerSec:=11025; //采样速率
recorder.Fwavefmt.nAvgBytesPerSec:=22050; //每秒采样得到的数据
recorder.Fwavefmt.wBitsPerSample:=16; //量化位数
recorder.Fwavefmt.nBlockAlign:=2; //记录区块对齐的单位。
re:=waveInGetNumDevs;
re:= waveinopen(@recorder.wavehandle,wave_mapper,(@recorder.Fwavefmt),dword(@trecorder.callback),dword(@recorder), callback_function+wave_allowsync );//callback_function+wave_allowsync;
showmessage(inttostr(re));
case re of
MMSYSERR_ALLOCATED:showmessage('已经分配内存');
MMSYSERR_BADDEVICEID:showmessage('超出索引');
MMSYSERR_NODRIVER:showmessage('没有驱动');
MMSYSERR_NOMEM:showmessage('不能分配内存');
WAVERR_BADFORMAT:showmessage('打开不支持的设备');
end;//end case
////////////////////////////////////
//////////为采样数据分配缓冲空间
recorder.wavehdr1:=globalallocptr(ghnd or gmem_share,sizeof(wavehdr));
recorder.wavebuffer1:=globalallocptr(ghnd or gmem_share,1024);
recorder.wavehdr1.lpData:=recorder.wavebuffer1;
recorder.wavehdr1.dwBufferLength:=1024;
waveinprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr));
waveinaddbuffer(recorder.wavehandle,recorder.wavehdr1,sizeof(wavehdr));
waveinunprepareheader(recorder.wavehandle,recorder.wavehdr1,sizeof(twavehdr));
globalfreeptr(recorder.wavebuffer1);
////////////////////////////////////////////////////////////////////////////////////////
///////////启动波形输入设备
re:=waveinstart(1);
showmessage(inttostr(re));
case re of
MMSYSERR_INVALHANDLE: showmessage('Specified device handle is invalid.');
MMSYSERR_NODRIVER: showmessage('No device driver is present.' ) ;
MMSYSERR_NOMEM:showmessage( 'Unable to allocate or lock memory.' );
end;
end;
procedure trecorder.callback(umsg,dwinstance,dwparam1,dwparam2:dword);stdcall;
var i:integer;
spbyte:^byte;
singledata:integer;
begin
showmessage('good');
case umsg of
mm_wim_open:
begin
showmessage('good');
end;
mm_wim_data:
begin
spbyte:=pointer(dwparam1);
for i:=0 to 100 do
begin
singledata:=spbyte^;
inc(spbyte);
end;
end;
end;
end;end.
解决方案 »
- 如何用Socket.ReceiveBuf一个字节一个字节的接收数据到一个Byte数组?
- 怎么禁用U盘
- 很急!在windows2003中,delphi7如何调试Com+ ? 注意是在WINDOWS SERVER 2003 中!!!
- 共享工程、窗体
- 【求助】ADOQuery查出了两条记录,如何写语句直接使用第二条记录的某个字段的值? 谢谢
- ★启动一个两星计划的ID,各位朋友进来支持一下,谢谢!★
- 有谁愿意帮我测试一个小软件?
- OleContainer1.CreateObjectFromFile('c:\2.txt',false),怎么提示‘找不到应用程序’??哪儿错误
- 怎么编辑资源文件?
- 各位高手,Delphi中如何使用WINSOCK2.0的API,我好象找不到?
- 连接Database时出现Operation must be performed on the current session
- 关于trayicon的提示hint二次更改的问题~~~~~~~急!
mmsystem, ShareFunc;
// , CltUnit1type
TWaveInBufferStatuses = (wibsEmpty, wibsData, wibsInUse);
TWaveOutBufferStatuses = (wobsEmpty, wobsData, wobsMerged, wobsInUse);
TWaveInBuffer = Record
hwavhdr: integer;
pwavhdr: PWAVEHDR;
hdatabuf: integer;
status: TWaveInBufferStatuses;
end;
PWaveInBuffer = ^TWaveInBuffer;
TWaveOutBuffer = Record
hwavhdr: integer;
pwavhdr: PWAVEHDR;
hdatabuf: integer;
status: TWaveOutBufferStatuses;
end;
PWaveOutBuffer = ^TWaveOutBuffer;var
WaveInNums: integer;
WaveInDevID: integer;
WaveInDevHandle: HWAVEIN;
WaveInWindowHandle: HWND;
WaveIn_OnOff: Boolean;
WaveInBuf1, WaveInBuf2: TWaveInBuffer; WaveOutNums: integer;
WaveOutDevID: integer;
WaveOutDevHandle: HWAVEIN;
WaveOutWindowHandle: HWND;
WaveOut_OnOff: Boolean;
WaveOutBuf1, WaveOutBuf2: TWaveOutBuffer; mWaveFormat: TPCMWaveFormat;// hwavhdrtype
TWavForm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure mWaveInOpen(wnd: HWND);
procedure mWaveInClose;
procedure mWaveOutOpen(wnd: HWND);
procedure mWaveOutClose;
procedure mWaveInOpenNotify(var msg: TMessage); Message MM_WIM_OPEN;
procedure mWaveInCloseNotify(var msg: TMessage); Message MM_WIM_CLOSE;
procedure mWaveInDataNotify(var msg: TMessage); Message MM_WIM_DATA; procedure mWaveOutOpenNotify(var msg: TMessage); Message MM_WOM_OPEN;
procedure mWaveOutCloseNotify(var msg: TMessage); Message MM_WOM_CLOSE;
procedure mWaveOutDoneNotify(var msg: TMessage); Message MM_WOM_DONE;
function mWaveOutPlay(pSoundData: PByte; size: integer): integer; end;var
WavForm: TWavForm;
WaveErrCode: integer = 0;
ErrCodeBool: Boolean;implementationuses SrvUnit1;{$R *.DFM}
procedure TWavForm.mWaveInOpen(wnd: HWND);
var
TmpHandle: integer;
begin
if WaveInNums > 0 then
begin
WaveErrCode := WaveInOpen(@TmpHandle, 0, @mWaveFormat, Handle,
0, WAVE_ALLOWSYNC or CALLBACK_WINDOW);
if WaveErrCode = 0 then
begin
WaveInDevHandle := TmpHandle;
WaveInDevID := 0;
WaveInWindowHandle := wnd;
WaveErrCode := WaveInPrepareHeader(WaveInDevHandle, WaveInBuf1.pwavhdr, sizeof(WAVEHDR));
WaveErrCode := WaveInPrepareHeader(WaveInDevHandle, WaveInBuf2.pwavhdr, sizeof(WAVEHDR));
WaveErrCode := WaveInAddBuffer(WaveInDevHAndle, WaveInBuf1.pwavhdr, sizeof(WAVEHDR));
WaveErrCode := WaveInAddBuffer(WaveInDevHAndle, WaveInBuf2.pwavhdr, sizeof(WAVEHDR));
case WaveErrCode of
0:
begin
WaveInStart(WaveInDevHandle);
end;
MMSYSERR_INVALHANDLE,
MMSYSERR_NOMEM:
Inc(WaveErrCode);
end;
end;
end;end;procedure TWavForm.mWaveInClose();
begin
WaveErrCode := WaveInStop(WaveInDevHandle);
WaveErrCode := WaveInReset(WaveInDevHandle);
WaveErrCode := WaveInClose(WaveInDevHandle);
end;procedure TWavForm.mWaveOutOpen(wnd: HWND);
var
TmpHandle: integer;
begin
if WaveOutNums > 0 then
begin
WaveErrCode := WaveOutOpen(@TmpHandle, 0, @mWaveFormat, Handle,
0, WAVE_ALLOWSYNC or CALLBACK_WINDOW); if WaveErrCode = 4 then
begin
TmpHandle := WaveInDevHandle;
WaveErrCode := 0;
end; if WaveErrCode = 0 then
begin
WaveOutDevHandle := TmpHandle;
WaveOutDevID := 0;
WaveOutWindowHandle := wnd;
WaveErrCode := WaveOutPrepareHeader(WaveOutDevHandle, WaveOutBuf1.pwavhdr, sizeof(WAVEHDR));
WaveErrCode := WaveOutPrepareHeader(WaveOutDevHandle, WaveOutBuf2.pwavhdr, sizeof(WAVEHDR));
end; end;
end;procedure TWavForm.mWaveOutClose();
begin
WaveErrCode := WaveOutClose(WaveOutDevHandle);
end;
begin {}
PostMessage(WaveInWindowHandle, MM_WIM_OPEN, msg.wParam, msg.lParam);
WaveIn_OnOff := True; // open record
end;procedure TWavForm.mWaveInCloseNotify(var msg: TMessage);
begin {}
PostMessage(WaveInWindowHandle, MM_WIM_CLOSE, msg.wParam, msg.lParam);
WaveIn_OnOff := False;
end;procedure TWavForm.mWaveInDataNotify(var msg: TMessage);
var
tpiwavhdr: PWAVEHDR;
// tmpb: integer;
begin {}
if not WaveIn_OnOff then exit;
tpiwavhdr := PWAVEHDR(msg.lParam);
if tpiwavhdr.dwBytesRecorded = 0 then exit;
{
if BYTES_PER_SAMPLE > 1 then
tmpb := MyMaxWord(PByte(tpiwavhdr.lpData), tpiwavhdr.dwBytesRecorded)
else
tmpb := MyMaxByte(PByte(tpiwavhdr.lpData), tpiwavhdr.dwBytesRecorded); if tmpb >= MIN_SOUND then
}
SvrForm.mWaveInDataNotify(msg); WaveErrCode := WaveInAddBuffer(WaveInDevHandle, tpiwavhdr, sizeof(WAVEHDR));
end;
procedure TWavForm.mWaveOutOpenNotify(var msg: TMessage);
begin {}
PostMessage(WaveOutWindowHandle, MM_WOM_OPEN, msg.wParam, msg.lParam);
WaveOut_OnOff := True; // open record
end;procedure TWavForm.mWaveOutCloseNotify(var msg: TMessage);
begin {}
PostMessage(WaveOutWindowHandle, MM_WOM_CLOSE, msg.wParam, msg.lParam);
WaveOut_OnOff := False;
end;procedure TWavForm.mWaveOutDoneNotify(var msg: TMessage);
var
tpwavhdr: PWAVEHDR;
begin {}
PostMessage(WaveOutWindowHandle, MM_WOM_DONE, msg.wParam, msg.lParam);
tpwavhdr := PWAVEHDR(msg.lParam);
tpwavhdr.dwUser := 0; // indicate buffer is free
end;procedure mWaveInBufInit(var inbuffer: TWaveInBuffer);
begin
inbuffer.hdatabuf := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, SEG_SIZE);
inbuffer.hwavhdr := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, sizeof(WAVEHDR));
inbuffer.pwavhdr := GlobalLock(inbuffer.hwavhdr);
inbuffer.pwavhdr.lpData := GlobalLock(inbuffer.hdatabuf);
inbuffer.pwavhdr.dwBufferLength := SEG_SIZE;
end;procedure mWaveInBufFree(var inbuffer: TWaveInBuffer);
begin
ErrCodeBool := GlobalUnLock(inbuffer.hdatabuf);
ErrCodeBool := GlobalUnLock(inbuffer.hwavhdr);
WaveErrCode := GlobalFree(inbuffer.hdatabuf);
WaveErrCode := GlobalFree(inbuffer.hwavhdr);
end;
procedure mWaveOutBufInit(var outbuffer: TWaveOutBuffer);
begin
outbuffer.hdatabuf := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, SEG_SIZE);
outbuffer.hwavhdr := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, sizeof(WAVEHDR));
outbuffer.pwavhdr := GlobalLock(outbuffer.hwavhdr);
outbuffer.pwavhdr.lpData := GlobalLock(outbuffer.hdatabuf);
outbuffer.pwavhdr.dwBufferLength := SEG_SIZE;
end;procedure mWaveOutBufFree(var outbuffer: TWaveOutBuffer);
begin
ErrCodeBool := GlobalUnLock(outbuffer.hdatabuf);
ErrCodeBool := GlobalUnLock(outbuffer.hwavhdr);
WaveErrCode := GlobalFree(outbuffer.hdatabuf);
WaveErrCode := GlobalFree(outbuffer.hwavhdr);
end;var
LastWaveHdr: integer;
function TWavForm.mWaveOutPlay(pSoundData: PByte; size: integer): integer;
var
tpwavhdr: PWAVEHDR;
begin
if LastWaveHdr = 1 then
begin
tpwavhdr := WaveOutBuf2.pwavhdr;
LastWaveHdr := 2;
end
else
begin
tpwavhdr := WaveOutBuf1.pwavhdr;
LastWaveHdr := 1;
end;
if tpwavhdr.dwUser = 0 then // is buffer free ?
begin
MemCopy(pSoundData, PByte(tpwavhdr.lpData), size);
tpwavhdr.dwBufferLength := size;
Result := WaveOutWrite(WaveOutDevHandle, tpwavhdr, sizeof(WAVEHDR));
if Result = 0 then
tpwavhdr.dwUser := 1; // set buffer in use;
end else Result := 10; // buffer full
end;initialization
WaveInNums := WaveInGetNumDevs;
WaveOutNums := WaveOutGetNumDevs; mWaveFormat.wf.wFormatTag := WAVE_FORMAT_PCM;
mWaveFormat.wf.nChannels := 1;
mWaveFormat.wf.nSamplesPerSec := 22050;
mWaveFormat.wf.nAvgBytesPerSec := 22050 * BYTES_PER_SAMPLE;
mWaveFormat.wf.nBlockAlign := BITS_PER_SAMPLE div 8;
mWaveFormat.wBitsPerSample := BITS_PER_SAMPLE; mWaveInBufInit(WaveInBuf1);
mWaveInBufInit(WaveInBuf2);
mWaveOutBufInit(WaveOutBuf1);
mWaveOutBufInit(WaveOutBuf2);finalization
mWaveInBufFree(WaveInBuf1);
mWaveInBufFree(WaveInBuf2);
mWaveOutBufFree(WaveOutBuf1);
mWaveOutBufFree(WaveOutBuf2);end.