我的毕业设计是做一个录音程序,并实时传输,但我在录音的时候遇到一个问题,怎么也解决不了(菜鸟一只),希望高手帮忙解决! 要交了,急呀!
private
    { Private declarations }
    FWaveFmt : TWaveFormatEx;//Delphi中,WAVEFORMAT和PCMWAVEFORMAT合为TwaveFormatEx。
    WaveHandle : PHWaveIn;
    WaveHdr1 : PWAVEHDR; //数据缓冲区头结构的指针
    WaveBuffer1 : lpstr; //数据缓冲区的指针  public
    { Public declarations }
  end;var
  Frecorder: TFrecorder;implementation{$R *.dfm}procedure TFrecorder.Button2Click(Sender: TObject);
begin
   Close;
end;procedure CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD); stdcall;
var
   i:Integer;
   SPByte : ^Byte;  //假设在打开设备时采用8位量化
   SingleData : Integer;
Begin
   case uMsg of //uMsg是Windows的消息标记号
   MM_WIM_OPEN : //波形输入设备开启成功发回的消息
      showmessage('波形输入设备开启成功');
   MM_WIM_DATA : //一个缓冲区已满发回的消息
      begin
         showmessage('一个缓冲区已满');
         SPByte := Pointer(dwParam1);
         For i :=0 to ??? do  //这个地方也不明白
         begin
            SingleData := SPByte^; //通过SPByte来访问缓冲区中的数据
            Inc(SPByte);
         end;
      end;
   MM_WIM_CLOSE : //波形输入设备关闭成功发回的消息
      showmessage('波形输入设备关闭成功');
   end;
End;
procedure TFrecorder.Button1Click(Sender: TObject);
Var
   res : MMRESULT;
begin   FWaveFmt.wFormatTag:=WAVE_FORMAT_PCM;  //采样数据格式,目前只能用PCM格式
   FWaveFmt.wBitsPerSample:=8;
   FWaveFmt.nChannels:=2;
   FWaveFmt.nSamplesPerSec:=11025;     //采样速率
   FWaveFmt.nAvgBytesPerSec:=22050;   //每秒采样得到的数据
   FWaveFmt.nBlockAlign:=2;             //记录区块对齐的单位
   res:=WaveInOpen(WaveHandle,Wave_Mapper,@FRecorder.FwaveFmt,
       DWORD(@callback),DWORD(@self),CALLBACK_FUNCTION + WAVE_ALLOWSYNC);   case res of
     MMSYSERR_ALLOCATED: showmessage('资源已存在');
     MMSYSERR_BADDEVICEID:showmessage('装置ID超出范围.');
     MMSYSERR_NODRIVER:showmessage('没有驱动.');
     MMSYSERR_NOMEM:showmessage('不能分配内存.');
     WAVERR_BADFORMAT:showmessage('企图打开一个不被支持的格式.');
   end;   WaveHdr1:=GlobalAllocPtr(GHND or GMEM_SHARE,Sizeof(WAVEHDR));
   WaveBuffer1:=GlobalAllocPtr(GHND or GMEM_SHARE,2048);
   WaveHdr1.lpData := WaveBuffer1;
   WaveHdr1.dwBufferLength:=2048;   WaveInPrepareHeader(waveHandle^,WaveHdr1, sizeof(WAVEHDR));   //保证缓冲区不会被置换到硬盘上
   WaveInAddBuffer(WaveHandle^, WaveHdr1, sizeof(WAVEHDR));
   //开始录音
   WaveInUnprepareHeader(WaveHandle^,WaveHdr1, sizeof(TWAVEHDR));
   GlobalFreePtr(WaveBuffer1);
end;
运行后,会出现读地址错的情况,因为waveHandle=nil,为虾米呀??
如果   res:=WaveInOpen(@WaveHandle,Wave_Mapper,@FRecorder.FwaveFmt,
       DWORD(@callback),DWORD(@self),CALLBACK_FUNCTION + WAVE_ALLOWSYNC);
就会出现access violent。
还有,请教一下,如果回调函数用线程方式的话要怎么做?
别人的号,分数如果不够请多包涵。QQ545723024