簡單處理音頻輸入資料的類

來源:互聯網
上載者:User

處理簡單的音頻輸入資料

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);}

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.