处理简单的音频输入数据
SoundIn类见我的另一篇博客 http://blog.csdn.net/zgl7903/article/details/5669770
#pragma once //Microphone_Measure.h #include "SoundIn.h" class CMicrophone_Measure { public: CMicrophone_Measure(); virtual ~CMicrophone_Measure(); public: BOOL StartMeasure(); void StopMeansure(); public: typedef struct _WAVEMEASUMERESULT_TAG { BOOL bValid; DWORD dwPtSize; //点数 double fWave_Frame_Avg; //平均值 double fWave_Frame_RMS; //有效值 double fWave_Frame_Max; //最大值 double fWave_Frame_Min; //最小值 double fWave_Frame_AbsMax; //绝对最大值 double fWave_Frame_AbsMin; //绝对最小值 }WAVEMEASUMERESULT; WAVEMEASUMERESULT m_WaveMeasureResult; BOOL IsOpened() { return bMicrophone_Opened; } protected: BOOL bMicrophone_Opened; CSoundIn m_SoundIn; static BOOL WaveInProc(LPVOID pUser, SHORT *pData, DWORD dwSize); };
#include "stdafx.h" #include "Microphone_Measure.h" CMicrophone_Measure::CMicrophone_Measure() { bMicrophone_Opened = FALSE; //置关闭状态 memset(&m_WaveMeasureResult, 0, sizeof(m_WaveMeasureResult)); //初始化结构体 } CMicrophone_Measure::~CMicrophone_Measure() { StopMeansure();//停止测量 } BOOL CMicrophone_Measure::StartMeasure() { if(!bMicrophone_Opened)//非打开状态 { if( m_SoundIn.OpenMic(this, WaveInProc) == MMSYSERR_NOERROR) bMicrophone_Opened = TRUE; } return bMicrophone_Opened; } void CMicrophone_Measure::StopMeansure() { m_SoundIn.CloseMic(); bMicrophone_Opened = FALSE; } BOOL CMicrophone_Measure::WaveInProc(LPVOID pUser, SHORT *pData, DWORD dwSize) { CMicrophone_Measure *pThis = (CMicrophone_Measure *)pUser; WAVEMEASUMERESULT tmpResult={0}; double dbVal = pData[0]; //第一个点 tmpResult.dwPtSize = dwSize; //点数 tmpResult.fWave_Frame_Avg = dbVal; //平均值 tmpResult.fWave_Frame_RMS = pow(dbVal, 2); //有效值 tmpResult.fWave_Frame_Max = dbVal; //最大值 tmpResult.fWave_Frame_Min = dbVal; //最小值 tmpResult.fWave_Frame_AbsMax = fabs(dbVal); //绝对最大值 tmpResult.fWave_Frame_AbsMin = fabs(dbVal); //绝对最小值 for(DWORD i=1; i<dwSize; i++) { dbVal = pData[i];//单声道 tmpResult.fWave_Frame_Avg += dbVal; //平均值 tmpResult.fWave_Frame_RMS += pow(dbVal, 2); //有效值 tmpResult.fWave_Frame_Max = max(dbVal, tmpResult.fWave_Frame_Max); //最大值 tmpResult.fWave_Frame_Min = min(dbVal, tmpResult.fWave_Frame_Min); //最小值 tmpResult.fWave_Frame_AbsMax = max(fabs(dbVal), tmpResult.fWave_Frame_AbsMax); //绝对最大值 tmpResult.fWave_Frame_AbsMin = min(fabs(dbVal), tmpResult.fWave_Frame_AbsMin); //绝对最小值 } tmpResult.fWave_Frame_Avg /= dwSize; //平均值 tmpResult.fWave_Frame_RMS = sqrt(tmpResult.fWave_Frame_RMS / dwSize);//有效值 tmpResult.bValid = TRUE; pThis->m_WaveMeasureResult = tmpResult; return TRUE; }
//简单的应用举例
#pragma once #include "Microphone_Measure.h" // CTestDlg 对话框 class CTestDlg : public CDialog { public: CMicrophone_Measure m_Microphone_Measure; afx_msg void OnTimer(UINT_PTR nIDEvent); CProgressCtrl m_ProgressCtrl;
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 if(m_Microphone_Measure.StartMeasure()) SetTimer(1, 100, NULL); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CTestDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(m_Microphone_Measure.m_WaveMeasureResult.bValid) { CString itemStr; itemStr.Format( _T("点数 %ld\r\n") _T("平均值 %g\r\n") _T("有效值 %g\r\n") _T("最大值 %g\r\n") _T("最小值 %g\r\n") _T("绝对最大值 %g\r\n") _T("绝对最小值 %g\r\n"), m_Microphone_Measure.m_WaveMeasureResult.dwPtSize, //点数 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Avg, //平均值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_RMS, //有效值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Max, //最大值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Min, //最小值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_AbsMax, //绝对最大值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_AbsMin, //绝对最小值 0); SetDlgItemText(IDC_EDIT1, itemStr); } CDialog::OnTimer(nIDEvent); }