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_)