怎样才能捕获声卡中的声音

这是我以前写的代码,供参考,网上这种代码很多的   
  #define   MAX_BUFFER   8   
  #include   <Mmsystem.h>   
  /////////////////////////////////////////////////////////////////////////////   
  //   CAudioDlg   dialog   
    
  class   CAudioDlg   :   public   CDialog   
  {   
  //   Construction   
  public:   
  void   Log(int   tag,   char   *buf);   
  CAudioDlg(CWnd*   pParent   =   NULL); //   standard   constructor   
  void   OnMmWimData(WPARAM   wParam,LPARAM   lParam);   
  void   OnMmWomDone(WPARAM   wParam,LPARAM   lParam);   
    
  HWAVEIN     m_hWaveIn;   
  HWAVEOUT     m_hWaveOut;   
  WAVEHDR   m_pWaveHdr[MAX_BUFFER];   
  WAVEHDR   m_pWaveHdrOut[MAX_BUFFER];   
  int   m_curHdr;   
  int   m_curHdrOut;   
  WAVEFORMATEX   m_waveformat;   
                    。。。。。。   
  };   
    
  BEGIN_MESSAGE_MAP(CAudioDlg,   CDialog)   
  //{{AFX_MSG_MAP(CAudioDlg)   
  ON_WM_SYSCOMMAND()   
  ON_WM_PAINT()   
  ON_WM_QUERYDRAGICON()   
  ON_MESSAGE(MM_WIM_DATA,   OnMmWimData)   
  ON_MESSAGE(MM_WOM_DONE,   OnMmWomDone)   
  //}}AFX_MSG_MAP   
  END_MESSAGE_MAP()   
    
  void   CAudioDlg::OnOK()     
  {   
  //   TODO:   Add   extra   validation   here   
  DWORD   datasize   =   6400;   
    
  CreateMutex(   NULL,   false,   "MyMutex");   
    
  if(   GetLastError()   ==   ERROR_ALREADY_EXISTS   )   {   
  TRACE("Exists   and   Exit/n");   
  }   
  else{   
  TRACE("aaaaaaaa/n");   
  }   
    
  m_waveformat.wFormatTag=WAVE_FORMAT_PCM;   
  m_waveformat.nChannels=2;   
  m_waveformat.nSamplesPerSec=16000;   
  m_waveformat.nAvgBytesPerSec=16000;   
  m_waveformat.nBlockAlign=1;   
  m_waveformat.wBitsPerSample=16;   //指定录音格式   
  m_waveformat.cbSize=0;   
    
  Log(waveInGetNumDevs(),   "waveInGetNumDevs()");   
    
  TRACE("有%d个可以使用的   WaveOut   通道/n",   waveOutGetNumDevs());   
  // waveOutGetDevCaps();   
    
  int   res=waveInOpen(&m_hWaveIn,WAVE_MAPPER,   &m_waveformat,   (DWORD)m_hWnd,0L,CALLBACK_WINDOW);   
    
    
  if   (   res   ==   MMSYSERR_NOERROR   )   {   
  TRACE("打开   waveIn   成功/n");     //   验证创建是否成功   
  }   
  else{   
  TRACE("打开   waveIn   通道失败,Error_Code   =   0x%x/n",   res   );   
  } //   End   of   验证创建是否成功   
    
  res   =   waveOutOpen(&m_hWaveOut,   -1,   &m_waveformat,   (DWORD)m_hWnd,0L,CALLBACK_WINDOW);   
  if   (   res   ==   MMSYSERR_NOERROR   )   {   
  TRACE("打开   waveOut   成功/n");     //   验证创建是否成功   
  }   
  else{   
  TRACE("打开   waveOut   通道失败,Error_Code   =   0x%x/n",   res   );   
  } //   End   of   验证创建是否成功   
    
  unsigned   int   DeviceID;   
  waveOutGetID(m_hWaveOut,   &DeviceID);   
    
  for(int   i=0;i<MAX_BUFFER;i++){   
  m_pWaveHdr[i].lpData   =   (char   *)GlobalLock(   GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,   datasize)   );   
  memset(m_pWaveHdr[i].lpData,   0,   datasize   );   
  m_pWaveHdr[i].dwBufferLength   =   datasize;   
  m_pWaveHdr[i].dwBytesRecorded   =   0;   
  m_pWaveHdr[i].dwUser   =   0;   
  m_pWaveHdr[i].dwFlags   =   0;   
  m_pWaveHdr[i].dwLoops   =   0;   
  m_pWaveHdrOut[i].lpData   =   (char   *)GlobalLock(   GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,   datasize)   );   
  memset(m_pWaveHdrOut[i].lpData,   0,   datasize   );   
  m_pWaveHdrOut[i].dwBufferLength   =   datasize;   
  m_pWaveHdrOut[i].dwBytesRecorded   =   0;   
  m_pWaveHdrOut[i].dwUser   =   0;   
  m_pWaveHdrOut[i].dwFlags   =   0;   
  m_pWaveHdrOut[i].dwLoops   =   0;   
  }   
    
  int   resPrepare;   
  for(i=0;i<MAX_BUFFER-1;i++){   
  resPrepare   =   waveInPrepareHeader(   m_hWaveIn,   &m_pWaveHdr[i],   sizeof(WAVEHDR)   );   //准备内存块录音   
  if   (   resPrepare   ==   MMSYSERR_NOERROR){   
  TRACE("准备录音用头文件成功/n");   
  }   
  else{   
  TRACE("不能开辟录音头文件,Error_Code   =   0x%03X/n",   resPrepare   );   
  } //   End   of   验证开辟缓冲   
  resPrepare   =   waveInAddBuffer(   m_hWaveIn,   &m_pWaveHdr[i],   sizeof(WAVEHDR)   );   
  if   (   resPrepare   ==   MMSYSERR_NOERROR)   {   
  TRACE("准备录音用内存成功/n");   
  }   
  else{   
  TRACE("不能开辟录音用缓冲,Error_Code   =   0x%03X/n",   resPrepare   );   
  } //   End   of   验证开辟缓冲   
  }   
  m_curHdr   =   0;   
    
  if   (!   waveInStart(m_hWaveIn)   )   {   
  TRACE("开始录音/n");     
  }   
  else   {   
  TRACE("开始录音失败/n");   
  }   
    
  }   
    
  void   CAudioDlg::OnMmWomDone(WPARAM   wParam,LPARAM   lParam)   
  {   
  // TRACE("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/n");   
  waveOutUnprepareHeader(   m_hWaveOut,   &m_pWaveHdrOut[m_curHdrOut],   sizeof(WAVEHDR)   );   
  }   
    
  void   CAudioDlg::OnMmWimData(WPARAM   wParam,LPARAM   lParam)   
  {   
  int   aa;   
    
  waveInUnprepareHeader(   m_hWaveIn,   &m_pWaveHdr[m_curHdr],   sizeof(WAVEHDR)   );   
    
  memcpy(m_pWaveHdrOut[m_curHdr].lpData,   m_pWaveHdr[m_curHdr].lpData,   m_pWaveHdr[m_curHdr].dwBufferLength   );   
  m_pWaveHdrOut[m_curHdr].dwBufferLength   =   m_pWaveHdr[m_curHdr].dwBufferLength   ;   
  m_pWaveHdrOut[m_curHdr].dwBytesRecorded   =   0;   
  m_pWaveHdrOut[m_curHdr].dwUser   =   0;   
  m_pWaveHdrOut[m_curHdr].dwFlags   =   0;   
  m_pWaveHdrOut[m_curHdr].dwLoops   =   0;   
    
  waveOutPrepareHeader(   m_hWaveOut,   &m_pWaveHdrOut[m_curHdr],   sizeof(WAVEHDR)   );   
    
  m_curHdrOut   =   m_curHdr;   
  Log(waveOutWrite(m_hWaveOut,   &m_pWaveHdrOut[m_curHdr],   sizeof(WAVEHDR)),   "waveOutWrite()");   
    
  aa   =   m_curHdr==0?MAX_BUFFER-1:m_curHdr   -   1;   
    
  waveInUnprepareHeader(   m_hWaveIn,   &m_pWaveHdr[aa],   sizeof(WAVEHDR)   );   
    
  Log(waveInPrepareHeader(   m_hWaveIn,   &m_pWaveHdr[aa],   sizeof(WAVEHDR)),   "waveInPrepareHeader()");   
    
  Log(waveInAddBuffer(   m_hWaveIn,   &m_pWaveHdr[aa],   sizeof(WAVEHDR)   ),   "waveInAddBuffer()");   
    
  m_curHdr   =   m_curHdr==MAX_BUFFER-1   ?   0:m_curHdr+1;   
  return;   
  }   
    
  void   CAudioDlg::Log(int   tag,   char   *buf)   
  {   
  if   (   strcmp(buf,   "waveOutWrite()")==0   ){   
  if(tag==   MMSYSERR_NOERROR){   
  TRACE("播放成功/n");   
  }   
  else{   
  TRACE("播放失败,Error_Code   =   0x%x/n",   tag);   
  }   
  }   
  else   if   (   strcmp(buf,   "waveInPrepareHeader()")==0   ){   
  if(tag==   MMSYSERR_NOERROR){   
  TRACE("准备录音用头文件成功/n");   
  }   
  else{   
  TRACE("不能开辟录音头文件,Error_Code   =   0x%03X/n",   tag);   
  }   
  }   
  else   if   (   strcmp(buf,   "waveInAddBuffer()")==0   ){   
  if(tag==   MMSYSERR_NOERROR){   
  TRACE("准备录音用内存成功/n");   
  }   
  else{   
  TRACE("不能开辟录音用缓冲,   Error_Code   =   0x%03X/n",   tag);   
  }   
  }   
  else   if   (   strcmp(buf,   "waveInGetNumDevs()")==0   ){   
  if(tag){   
  TRACE("有可以使用的   WaveIn   通道/n");   
  }   
  else{   
  TRACE("没有可以使用的   waveIn   通道/n");   
  }   
  }   
  }   
    
  void   CAudioDlg::OnCancel()     
  {   
  //   TODO:   Add   extra   cleanup   here   
  waveInClose(m_hWaveIn);   
  waveOutClose(m_hWaveOut);   
    
  CDialog::OnCancel();   
  }   
    
    
  BOOL   CAudioDlg::DestroyWindow()     
  {   
  //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class   
  return   CDialog::DestroyWindow();   
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值