请问;这是有关声卡采集方面的问题,为什么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.

解决方案 »

  1.   

    //参考一下unit ShareWav;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
         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;
      

  2.   

    //续procedure TWavForm.mWaveInOpenNotify(var msg: TMessage);
    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.
      

  3.   

    楼上的,真的很感谢你,不过不知道你能不能把原程序发给我,如果可以的话,我的E-Mmail是  :[email protected]  谢谢