织梦CMS - 轻松建站从此开始!

罗索

DirectSound抓取麦克风PCM数据封装类

jackyhwei 发布于 2010-11-01 10:06 点击:次 
在这里发布一个我自己写的directsound的麦克风PCM数据采集类,通过它,可以很方便的利用directsound技术把麦克风的数据采集到,而且本身,开发者不必太在意自己会不会directsound编程,可以很方便的让开发者的主要精力集中于程序本身,而不是细节。
TAG:

网上有很多方法从麦克风读取PCM数据,不想一一举例。只是在这里发布一个我自己写的directsound的麦克风PCM数据采集类,通过它,可以很方便的利用directsound技术把麦克风的数据采集到,而且本身,开发者不必太在意自己会不会directsound编程,可以很方便的让开发者的主要精力集中于程序本身,而不是细节。
这个是头文件:
  1. #pragma once 
  2. #ifndef _CAPTURE_SOUND_H_ 
  3. #define _CAPTURE_SOUND_H_ 
  4. #include <mmsystem.h> 
  5. #include <dsound.h> 
  6. #define NUM_REC_NOTIFICATIONS  16 
  7. class CAdoFrameHandler { 
  8. public
  9.  virtual void AdoFrameData(BYTE* pBuffer, long lBufferSize) = 0 ; 
  10. }; 
  11. class CCaptureAudio 
  12. public
  13.  BOOL        m_bRecording ;  //recording now ? also used by event recv thread 
  14. protected
  15.  LPDIRECTSOUNDCAPTURE8    m_pCapDev ;   //capture device ptr 
  16.  LPDIRECTSOUNDCAPTUREBUFFER m_pCapBuf ;   //capture loop buffer ptr 
  17.  LPDIRECTSOUNDNOTIFY8    m_pNotify ;   //capture auto-notify event callback handler ptr 
  18.  GUID        m_guidCapDevId ;  //capture device id 
  19.  WAVEFORMATEX      m_wfxInput;   //input wave format description struct 
  20.  DSBPOSITIONNOTIFY     m_aPosNotify[NUM_REC_NOTIFICATIONS + 1]; //notify flag array 
  21.  HANDLE        m_hNotifyEvent;   //notify event 
  22.  BOOL        m_abInputFmtSupported[20]; 
  23.  DWORD        m_dwCapBufSize;  //capture loop buffer size 
  24.  DWORD        m_dwNextCapOffset;//offset in loop buffer 
  25.  DWORD        m_dwNotifySize;  //notify pos when loop buffer need to emit the event 
  26.  CAdoFrameHandler*     m_frame_handler ; // outer frame data dealer ptr 
  27. public// callback func to add enum devices string name 
  28.  static BOOL CALLBACK enum_dev_proc(LPGUID lpGUID, LPCTSTR lpszDesc, 
  29.             LPCTSTR lpszDrvName, LPVOID lpContext ) ; 
  30.  static UINT notify_capture_thd(LPVOID data) ; 
  31. protected
  32.  HRESULT InitDirectSound(GUID dev_id = GUID_NULL) ; 
  33.  HRESULT FreeDirectSound() ; 
  34.  HRESULT InitNotifications() ; 
  35.  HRESULT CreateCaptureBuffer(WAVEFORMATEX * wfx) ; 
  36.  HRESULT StartOrStopRecord(BOOL bStartRec) ; 
  37.  HRESULT RecordCapturedData() ; 
  38.  void    SetWavFormat(WAVEFORMATEX * wfx) ; 
  39. public
  40.  CCaptureAudio(void); 
  41.  ~CCaptureAudio(void); 
  42.  BOOL EnumDevices(HWND hList) ; 
  43.  BOOL Open(void) ; 
  44.  BOOL Close() ; 
  45.  void GrabAudioFrames(BOOL bGrabAudioFrames, CAdoFrameHandler* frame_handler) ; 
  46. }; 
  47. #endif 
 
使用的时候,也很简单,我这里声明了一个纯虚类CAdoFrameHandler,这个类专门是用来让使用者重载它的纯虚函数的,只要重载了以 后,设置正确,就可以自动开始采集音频数据了。注意,在这个类里面,我用的是8KHz,16Bits,Mono单声道的PCM数据采集。
使用的时候,首先:
#include "CaptureAudio.h"
然后:
class CMyClass : public CAdoFrameHandler {
...
public: // override the CAdoFrameHandler
 void AdoFrameData(BYTE* pBuffer, long lBufferSize) ;  // 这个类重载一下,就可以采集了
 
protected:
  CCaptureAudio   m_cap_ado ; // 这个对象就是用来采集音频数据的
} ;
 
在OnInitDialog类中,我们可以使用如下初始化方法:
 
打开mic,同时初始化directsound:
m_cap_ado.Open() ;
 
开始采集声音就是:
m_cap_ado.GrabAudioFrames(TRUE, this) ;
调用它以后,只要你重载了上面的那个函数,directsound就会周期性的从麦克采集数据,然后调用该函数。
 
停止声音采集是:
m_cap_ado.GrabAudioFrames(FALSE, NULL) ;
 
关闭mic,同时释放directsound:
m_cap_ado.Close() ;
 
就这么简单的几步,就可以完成麦克风的音频数据采集。
有问题欢迎大家多多交流。

CPP的源码见后一页。

(陈罡)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201011/10384.html]
本文出处:北京理工大学 20981  作者:陈罡
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容