www.pudn.com > direct_mp3.rar > AudioPlayRec.h


#if !defined(AFX_AUDIOPLAYREC_H__A2C89DE8_176E_43ED_AD32_7CF7BD1F667D__INCLUDED_) 
#define AFX_AUDIOPLAYREC_H__A2C89DE8_176E_43ED_AD32_7CF7BD1F667D__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
// AudioPlayRec.h : header file 
//			 
////////////////////////////////////////////////////////////////////// 
 
/**************************************************************************************************************** 
		投稿说明: 
****************************************************************************************************************/ 
#define NOTE_AudioPlayRec \ 
"		◆◆◆ 说明:◆◆◆\r\n\ 
	直接压缩成mp3的录音机程序,录音过程中不需要产生.wav文件,边录音边压缩,处理速度快,节约磁盘空间,尤其对长时间录音\ 
非常合理。本程序可以录制单声道、立体声、左声道、右声道的语音。录音和播放过程中都有实时的波形显示。特别感谢我的好朋友\ 
李志刚的指点,由于他的提醒,我从使用mciSendXXX()改用waveInXXX()。\r\n\ 
\r\n\ 
		◆◆◆ 作者:◆◆◆\r\n\ 
	谢红伟 · chrys · chrys@163.com · http://ndxz.126.com\r\n\ 
\r\n\ 
		◆◆◆ 日期:◆◆◆\r\n\ 
	2006-01-13 02:59:28" 
 
#include "BladeMP3EncDLL.h" 
#include "VolumeInXXX.h" 
 
typedef void (*FUNC_CallbackNotify) ( UINT uWaveMsg, WPARAM wParam ); 
 
///////////////////////////////////////////////////////////////////////////// 
// CAudioPlayRec window 
 
class CAudioPlayRec : public CWnd 
{ 
// Construction 
public: 
	typedef enum _enum_status 
	{ 
		ENUM_STATUS_INVALID,		// 无效的状态 
		ENUM_STATUS_READY,			// 准备就绪 
		ENUM_STATUS_PLAYING,		// 正在播放 
		ENUM_STATUS_RECORDING,		// 正在录音 
		ENUM_STATUS_STOPING,		// 正在停止 
		ENUM_STATUS_NUM, 
	} ENUM_STATUS; 
 
	enum 
	{ 
		TIMER_EVENT_STOPREC = 1, 
		TIMER_EVENT_STOPPLAY, 
		TIMER_EVENT_NUM, 
	}; 
	enum 
	{ 
		PARTLINE_HEIGHT = 2, 
		COLOR_FRAME = RGB(128,64,0), 
	}; 
 
	// 录音的声道 
	typedef enum _enum_rec_channel 
	{ 
		ENUM_REC_CHANNEL_MONO, 
		ENUM_REC_CHANNEL_STEREO, 
		ENUM_REC_CHANNEL_ALONE, 
		ENUM_REC_CHANNEL_NUM, 
	} ENUM_REC_CHANNEL; 
 
	// 保存文件的通道 
	typedef enum _enum_file_channel 
	{ 
		ENUM_FILE_CHANNEL_COMMON, 
		ENUM_FILE_CHANNEL_LEFT=ENUM_FILE_CHANNEL_COMMON, 
		ENUM_FILE_CHANNEL_RIGHT, 
		ENUM_FILE_CHANNEL_NUM, 
	} ENUM_FILE_CHANNEL; 
 
	CAudioPlayRec(); 
	virtual ~CAudioPlayRec(); 
public: 
	CString GetWaveOutName(UINT uDeviceID); 
	UINT GetWaveOutCount(); 
	CString GetWaveInName(UINT uDeviceID); 
	UINT GetWaveInCount(); 
	BOOL Init ( 
		UINT uDeviceID=WAVE_MAPPER, 
		DWORD dwBufferSize=1024, 
		HWND hwndParent=NULL, 
		LPRECT lpRect=NULL, 
		FUNC_CallbackNotify Proc_CallbackNotify=NULL, 
		WPARAM wParam=NULL 
	); 
	inline ENUM_STATUS GetStatus () { return m_eStatus; } 
	BOOL StartRecordAudioFile ( ENUM_FILE_CHANNEL eFileChannel, LPCTSTR lpszAudioFileName ); 
	void StopRecordAudioFile ( ENUM_FILE_CHANNEL eFileChannel, CString csStopFileType="mp3" ); 
	void SetDeviceID ( UINT uDeviceID ); 
 
// Attributes 
public: 
 
// Operations 
public: 
 
// Overrides 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAudioPlayRec) 
	public: 
	virtual BOOL PreTranslateMessage(MSG* pMsg); 
	//}}AFX_VIRTUAL 
 
// Implementation 
public: 
	int GetAvailableDeviceIndex(); 
	void SetWaveInDevice ( BOOL bLineIn, DWORD dwVolume=ULONG_MAX ); 
	DWORD GetWaveInVolume ( BOOL bLineIn, DWORD *pdwMaxVolume=NULL, DWORD *pdwMinVolume=NULL ); 
	UINT m_uLineIndex_Microphone;				// Microphone 录音设备序号 
	UINT m_uLineIndex_LineIn;					// Line In 录音设备序号 
	BOOL m_bAlwaysDrawTowChannel;				// 总是画两个声道的声波图 
	void SetBkColor(COLORREF clr); 
	BOOL Play ( LPCTSTR lpszWaveFileName ); 
	void Stop(); 
	BOOL Record ( ENUM_REC_CHANNEL eRecChannel, DWORD nSamplesPerSec, WORD wBitsPerSample ); 
 
	// Generated message map functions 
protected: 
	LRESULT OnMM_WIM_DATA ( WPARAM wParam, LPARAM lParam ); 
	LRESULT OnMM_WOM_DONE ( WPARAM wParam, LPARAM lParam ); 
	//{{AFX_MSG(CAudioPlayRec) 
	afx_msg BOOL OnEraseBkgnd(CDC* pDC); 
	afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); 
	afx_msg void OnTimer(UINT nIDEvent); 
	//}}AFX_MSG 
 
	DECLARE_MESSAGE_MAP() 
 
private: 
	CString m_csDeviceName; 
	void DrawBackground ( CDC *pDC ); 
	void DrawBackground ( CDC *pDC, BOOL bLeftChannel ); 
	BOOL LoadMp3DllFunc (); 
	void StopAndFreeAll (); 
	CRect GetRectByChannel ( BOOL bLeftChannel ); 
	void DrwaWaveShort ( CClientDC &dc, DWORD dwDrawBytes, SHORT *pShortData, BOOL bLeftChannel ); 
	void DrwaWaveChar ( CClientDC &dc, DWORD dwDrawBytes, BYTE *pCharData, BOOL bLeftChannel ); 
	void ResetMp3EncodeVar(); 
	BOOL WaveBufferMp3Encode ( char *szWavData, int nWavSize, ENUM_FILE_CHANNEL eFileChannel ); 
	void EndEncodeMp3 ( ENUM_FILE_CHANNEL eFileChannel ); 
	void FreeMp3Encode (); 
	BOOL PrepareEncodeMp3 ( LPCTSTR lpszMp3FileName, ENUM_FILE_CHANNEL eFileChannel ); 
	int PickupMonoData ( WORD wBitsPerSample, char *szOrgData, int nOrgSize ); 
	void DrawWave ( DWORD dwChannelBytes ); 
	void StopPlay(); 
	void StopRec (); 
	void FreeBuffer (); 
	BOOL AllocateBuffer ( DWORD dwBufferSize ); 
	BOOL AddOutputBufferToQueue ( int nIndex, int nSize ); 
	BOOL ReadSoundDataFromFile ( LPVOID data, int &size ); 
	BOOL OpenWaveFile ( LPCTSTR lpszWaveFileName ); 
	int m_nDataQueueNum; 
	BOOL CreateWaveFile ( LPCTSTR lpszWaveFileName, ENUM_FILE_CHANNEL eFileChannel ); 
	void waveErrorMsg(MMRESULT result, LPCTSTR addstr); 
	BOOL AddInputBufferToQueue ( int nIndex ); 
	void SetWaveFormat ( ENUM_REC_CHANNEL eRecChannel, DWORD nSamplesPerSec, WORD wBitsPerSample ); 
	BOOL SetRelateParaAfterGetWaveFormat (); 
	BOOL Create ( HWND hwndParent, LPRECT lpRect=NULL ); 
 
	FUNC_CallbackNotify m_Proc_CallbackNotify; 
	WPARAM				m_wParam; 
 
	CBrush				m_brsBkGnd;					// 背景刷 
	COLORREF			m_clrBK; 
	CRect				m_rcClient; 
	CPen				m_PenB; 
	CPen				m_PenG; 
	CPen				m_PenPartLine; 
	CFont				m_fntChannelText; 
	CFont				m_fntDeviceNameText; 
 
	ENUM_STATUS			m_eStatus; 
	BOOL				m_bRecording; 
	UINT				m_uDeviceID; 
	WAVEFORMATEX		m_Format; 
	ENUM_REC_CHANNEL	m_eRecChannel; 
	HWAVEIN				m_hRecord; 
	HWAVEOUT			m_hPlay; 
 
	char				**m_szAryInData; 
	char				*m_szLeftInData; 
	char				*m_szRightInData; 
	WAVEHDR				**m_pAryHdr; 
	DWORD				m_dwQueuBufferSize; 
	WORD				m_wInQueu; 
 
	HMMIO				m_hWaveFile[ENUM_FILE_CHANNEL_NUM]; 
	MMCKINFO			m_MMCKInfoParent[ENUM_FILE_CHANNEL_NUM]; 
	MMCKINFO			m_MMCKInfoChild[ENUM_FILE_CHANNEL_NUM]; 
 
	// mp3编码用到的变量 
	PBYTE				m_ForMp3_pMP3Buffer[ENUM_FILE_CHANNEL_NUM]; 
	PBYTE				m_ForMp3_pWaveBuffer[ENUM_FILE_CHANNEL_NUM]; 
	FILE*				m_pFileMp3[ENUM_FILE_CHANNEL_NUM]; 
	CString				m_csMp3FileName[ENUM_FILE_CHANNEL_NUM]; 
	DWORD				m_ForMp3_dwWaveDataBytes[ENUM_FILE_CHANNEL_NUM]; 
	HBE_STREAM			m_ForMp3_hStream[ENUM_FILE_CHANNEL_NUM]; 
 
	HINSTANCE			m_ForMp3_hDLL_LameEnc; 
	DWORD				m_ForMp3_dwWaveBufferSize; 
	BEINITSTREAM		m_ForMp3_Proc_hInitStream; 
	BEENCODECHUNK		m_ForMp3_Proc_hEncodeChunk; 
	BEDEINITSTREAM		m_ForMp3_Proc_hDeinitStream; 
	BECLOSESTREAM		m_ForMp3_Proc_hCloseStream; 
	BEVERSION			m_ForMp3_Proc_hVersion; 
	BEWRITEVBRHEADER	m_ForMp3_Proc_hWriteVBRHeader; 
	BEWRITEINFOTAG		m_ForMp3_Proc_hWriteInfoTag; 
	DWORD				m_dwSamplesEncodeMp3Block; 
 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
 
//{{AFX_INSERT_LOCATION}} 
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. 
 
#endif // !defined(AFX_AUDIOPLAYREC_H__A2C89DE8_176E_43ED_AD32_7CF7BD1F667D__INCLUDED_)