找回密码
 注册
搜索
查看: 2745|回复: 0

创建基于MCI的WAV音频处理类——CMyMCIWave

[复制链接]
发表于 2013-9-2 12:31:02 | 显示全部楼层 |阅读模式
原文:http://www.cnblogs.com/witxjp/archive/2010/05/27/1745121.html// MCIWave.h: interface for the CMCIWave class.$ K# R& z% @6 K4 s
//
' \: w+ ]: ~8 @6 ?6 i# ~//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
, G8 @# ~' ^/ o8 M$ t* J#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000& h4 L. z# I" F0 y
#pragma once* m' L, ~, d  d# {1 J; L* R
#endif // _MSC_VER > 1000
/ r  ?( m8 t$ k( D#include <Mmsystem.h>   
* q$ T* {8 w  n7 M#pragma   comment(lib,   "Winmm.lib")   
  p" O1 Y5 S1 v( H( T) Pclass CMyMCIWave  8 ~9 R0 B: r% y/ C% _# }* l
{
& z& F. m4 J  l5 t' Ppublic:
' `2 ~& a  J6 U5 v% ] CMyMCIWave();//构造函数
4 c" `0 o5 p9 a1 ]* x, x4 b4 [ virtual ~CMyMCIWave();//析构函数
( q, u9 g& L3 [0 l7 Y5 m; P DWORD OpenWave(CString strFileName);                  //打开文件9 i% r" W; C8 i
DWORD CloseWave();                  //关闭文件) F. ^  c  q. g4 C  K0 Q8 u
DWORD PlayWave();                   //播放% y  {$ T0 u+ T1 R- \2 z, z
void  StopWave();                   //停止播放
4 t3 r/ G- W5 a DWORD RecordWave();                 //录制6 Y- j2 C1 m; b1 o1 @
DWORD SaveWave(CString strFileName);  //保存1 M# {0 ?  v( F* \6 b8 W, W
DWORD  GetBitLength();          //得到位长
9 D2 r% F$ s# I" c: U3 q# C DWORD GetSampleRate();          //得到采样率
0 T" P" a6 Q% ]1 Z+ g* A6 _ DWORD  GetChannel();             //得到当前声道, d" X3 X# ~. Q! X
DWORD GetWaveLength();         //得到音频长度7 ?9 N7 @" B9 R3 O/ _" S
public:
$ ^9 e7 ?; C9 B  V* b BOOL m_bPlaying;               //是否正在播放/ P' P2 k! R* ^* p, C
BOOL m_bRecord;                //是否在录音
  H% b! A$ i/ g" r5 C BOOL m_bOpen;                 //文件是否打开9 B" q# W  z$ }) Q: `3 w
WORD m_wDeviceID;            //播放设备ID
5 x; c% J2 r0 D  u& U! K) g};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.* r: g$ l! Y! Y7 k5 p: x: l6 s
//
4 s0 A9 M0 w2 V+ i" |1 Q6 `//////////////////////////////////////////////////////////////////////#include "stdafx.h"7 m/ u+ j( Z" V: `+ q; E; r
#include "MCIWavPlay.h"
# t& B3 y& ?  f! o4 F#include "MyMCIWave.h"#ifdef _DEBUG
* y+ y, u9 b9 i7 B5 w; H6 v#undef THIS_FILE6 D9 U  p* u  ]# [! U
static char THIS_FILE[]=__FILE__;
, x7 D0 o9 I. V- c#define new DEBUG_NEW0 s, ^5 J, D( k# b
#endif//////////////////////////////////////////////////////////////////////8 `; o3 l2 U1 r$ s% w- E
// Construction/Destruction/ [) E9 E5 ]6 P4 }/ Q
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
% s' {0 ]. i3 j) w{
2 P* ~) {( U( J% p //进行状态指示变量的初始化
2 r9 f6 _$ `$ ~* C% f m_bPlaying = FALSE;
$ \) g) B% R2 K2 N# \/ L, k    m_bRecord = FALSE;
# j9 T. a, ]( E" e7 ]( N5 p    m_bOpen = FALSE;" b* c4 a% w, b
    m_wDeviceID = 0;
' e9 ]7 [9 \9 }6 M5 l}CMyMCIWave::~CMyMCIWave()
7 o, _, B: a" k1 l' v  S{
9 P- I4 T" U% K/ f CloseWave();//关闭WAV文件
! `$ g0 G& \3 B7 E1 z0 W2 ?}
! Y* `! F( u, D1 _: aDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件' a/ F6 r9 T/ ^0 N
{
8 }/ v/ o/ _* f! Z1 U- ~ if (m_bOpen)//如果文件已经打开, j8 C# v6 P$ l
{8 _" M5 e4 q0 I4 p# W% O
  CloseWave();//关闭该文件3 n# T+ Y. F" V3 J6 j  @( n
}
, M# V7 o* k! S; Q: d DWORD dwOpenFlag;//打开标记
2 {* V' F3 i3 y MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构9 I/ J! n- y) @( U1 V& U& k# F
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
& T  [5 Z6 C' j6 M mciOpenParam.lpstrElementName = strFileName;//打开文件名
+ @5 q8 O. X3 D2 p& C" ` //初始化MCI设备- x- U. a% E( _! W8 D) `
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
' m/ j7 z( ^% O4 j' G1 s% F7 I+ u if (dwOpenFlag)//初始化失败
* y, S5 ]4 Q" r4 P  _6 |8 s  return dwOpenFlag;//返回错误代码- P1 q) y" [. l, D* V9 R  Q
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
% Y* _# K( g, l3 l6 D' @$ Y  l m_bOpen = TRUE;
) z4 @5 v4 l0 `3 G0 K dwOpenFlag = 0;
. m' w* |1 Y, a& X MCI_SET_PARMS mciSetParam;
  @: E. N" S  D+ A7 X, o# L( o mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
' \- Z2 j1 N9 I# C //改变时间控制设置
8 C, ?! K+ |* m% V4 d# D dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);& Y; ]' L2 }9 Z) D% {3 a8 @# Y; w
if (dwOpenFlag)//设置失败
/ w  v6 C- [9 k  return dwOpenFlag;//返回错误代码
6 ]7 h$ Z: |+ S: L return 0;/ b& R& s6 z- |5 H: C' z
}DWORD CMyMCIWave::PlayWave()//播放波形文件. D/ \% i% B* \2 g
{, ^1 |9 J' D* F% P1 Z
MCI_PLAY_PARMS mciPlayParam;
* e% U; ?- n7 n, w/ z DWORD dwPlayFlag;
* R8 |7 J- T6 k+ |4 ]7 a. R: c* g0 W dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
: F( s' O" A3 F8 o! d. N if (dwPlayFlag)//播放失败- E" I3 B  f- Z+ m
  return dwPlayFlag;//返回错误代码
+ m0 W; M3 c  c" H9 D1 ^( I( U* R else' C7 {/ P# W: y
{
# v8 U$ y$ r5 ~& p9 B9 ~  m_bPlaying = TRUE;" b: i" v1 \( Q$ h" n
  return 0;
% `4 N. V! q0 s$ R/ d% |  f/ K% K }
+ s# h! Q' B: |/ H5 G" e}- ?/ e: {  U) C4 }
void CMyMCIWave::StopWave()//停止播放波形文件
* f) k1 C- w/ J7 V) F{/ v( Q  P, o1 Z3 m9 V3 |$ T6 |# ?
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放) p+ b, J7 M- ]3 \; C
}& }+ H" v9 K  n
DWORD CMyMCIWave::RecordWave()( O  G5 Y0 J) Y" |- F
{7 T8 W& v2 O. Z
if (m_bOpen)//如果有文件打开8 X$ Q7 f4 l4 |/ @% x
  CloseWave();//关闭文件' ?1 w* M" q  A4 j/ i. |: N
DWORD dwRecordFlag;
) B' P- z9 R, e  L  U8 i MCI_OPEN_PARMS mciOpenParam;
8 f/ `5 `: [" H# W7 [ mciOpenParam.lpstrDeviceType = " waveAudio ";! W/ \, G/ ]. M
mciOpenParam.lpstrElementName = NULL;7 V5 ^" D' d$ y+ @2 k
//初始化MCI设备+ ?, e: {) r0 h# H
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
- E8 u1 J( p* g# C6 i& i: ? if (dwRecordFlag)//初始化失败: [" R# [& [* G. W( D# S/ ]
  return dwRecordFlag;//返回错误代码: V4 w( r+ y6 M& N
m_wDeviceID = mciOpenParam.wDeviceID;
* M+ Z' G2 W: h8 h MCI_RECORD_PARMS mciRecordParam;
  B, B4 `' n6 q/ p9 w. k4 F8 C //开始记录数据) Y* S! c" O7 F. x; L! Y
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
- p4 [9 Z5 Y1 ` if (dwRecordFlag)//记录数据失败
6 m* ?6 E: K  d* Z$ d  return dwRecordFlag;//返回错误代码/ c* _7 W6 C, Y4 u; x2 d
m_bRecord = TRUE;( O/ j& I; J6 B! u5 ]/ d# L3 r
m_bOpen = TRUE;- G: ?  |8 r, a( U* i5 R7 |
return 0;
8 t( Y/ f5 i! b}
3 W8 f7 v  g; Y- h/ c0 pDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件6 P+ H2 V: ?8 \  I; D9 @% I
{* p+ n7 Q3 K9 W6 A, q1 u& h, M, q
    if (m_bRecord)//正在录音7 t+ S8 A- s- E) U; e9 d
        return 0;//返回/ q8 r0 L1 y" ?6 p3 g+ i
StopWave();//停止录音
+ y2 S* T  y, a" [5 Y. S0 z MCI_SAVE_PARMS mciSaveParam;& ^. s5 A) h1 a5 K2 a& t  ]
mciSaveParam.lpfilename = strFileName;//设置保存的文件& ?5 |3 s; }' L! U
//保存WAV数据到文件( j# G8 ]" v3 w- c, y
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);2 P( l3 r# D! M7 W& V9 ~
if (dwSaveFlag)//保存失败
( L5 R1 z) q, s. U  return dwSaveFlag;//返回错误代码
8 o& G0 o7 Q! e* M; S, E7 A m_bRecord = FALSE;" C% H! }- v- L
return 0;
0 q9 T8 B0 r2 t- {; e}8 G: @9 n0 ]5 V1 G( z
DWORD CMyMCIWave::CloseWave()
  ]+ T5 v$ f6 g$ m1 _{
* o  u' s, }+ e; U- @3 L if (m_wDeviceID)//有MCI设备在工作
  B7 v" g/ ~+ m2 M1 C' S {5 [" `( }3 K$ l- E7 Q
  DWORD dwCloseFlag;' C- p) p+ g, R# K
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
4 c0 F6 v. N$ V9 x; w2 f  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
+ b: U" V: W' f0 D) x9 `  if (dwCloseFlag)
) c' j2 o, ^  D2 o$ v  {
4 c7 |4 d$ t/ _: H   AfxMessageBox("关闭时出现错误");0 Y7 a  `4 n9 W/ ~- D# U# h) G
   return dwCloseFlag;6 g; Z. r3 G5 K4 L- f" i
  }' f- J. y1 _9 Y# d/ d, @2 o
}
& K# d) P  I- l- s& {. h' n# R //设置状态变量
) b9 y- d5 I$ F- E/ W! Z m_bRecord = FALSE;0 d9 a  V9 t  O0 q
m_bOpen = FALSE;
" x0 y# x" }% s3 m7 u! {6 ]* K m_bPlaying = FALSE;4 [4 \8 {$ l6 A+ M. F" N5 @* _3 g- x
m_wDeviceID = NULL;1 F% {  b8 l3 q7 w" P- y( K
return 0;! l& C+ ?& K- o" }. d
}5 K1 {* I% T/ P/ b* h% `; ]
DWORD CMyMCIWave::GetSampleRate()//获取采样率
- @2 a8 l  F0 z) i. j& y{2 C; s8 k0 l" @. {) C
MCI_STATUS_PARMS mciStatusParam;% ]+ \' O: o8 {) y# l; b8 S, k9 @
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率, I  n- M: }: u
//MCI设备的状态信息(采样频率)+ c5 u; B2 I( Z1 I: D
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);. t5 F- P% p2 s: f7 J6 w! S* _. A7 n
if (dwStatusFlag); q5 A8 c( u. d: O" M
  return dwStatusFlag;//返回错误代码
( I" _2 b3 a& c1 r. _ else
" [6 X3 Q1 q* E+ m- I  return mciStatusParam.dwReturn;//返回采样频率
2 h( B6 O3 m. ]1 P1 ^}
3 `# M& D" H! R9 H& ?DWORD CMyMCIWave::GetChannel()//获取声道数: t1 i/ O2 K; O* b' O
{* D. @$ H% {8 @
MCI_STATUS_PARMS mciStatusParam;; }: i  r& j. C8 c9 G4 T& O) N
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
- i) W& [! \2 C" d6 G //MCI设备的状态信息(声道数)
, q3 o  R5 K- D DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
* Q" d" k& D' y9 N" a if (dwStatusFlag)
3 O, f8 w% f8 V2 m- y5 c6 I  return dwStatusFlag;
* N& e, B; C5 f( ~1 S else/ [& R6 d" Q" F& J, l* I! L( J
  return mciStatusParam.dwReturn;//返回声道数. _1 v* f$ ]2 {8 P9 Z
}' `( A# `  Y( Z+ |, g6 t
DWORD CMyMCIWave::GetBitLength()//获取声音位长
- c  \, v: M; w" a{
+ }- ?7 T2 D3 k/ g6 i- m- m& V MCI_STATUS_PARMS mciStatusParam;
; t4 {& P9 n/ \! L mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长* _9 U" y5 C( U6 }, v
//MCI设备的状态信息(声音位长); K4 r6 F+ V6 z& ~# B' C5 u2 a
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);& X) `8 u; S! f$ D+ v
if (dwStatusFlag)
( x5 a  I: Q2 f" W8 K7 O! k  return dwStatusFlag;; ^, b- X7 N5 ~2 s
else
% k( H& S+ A1 J  \  B! ^0 f) _* b  return mciStatusParam.dwReturn;//返回位长1 s0 [1 {$ v3 l+ [, L4 \  D4 _. L
}
5 o/ @- b/ l6 w4 V  YDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长  L& v( o  {9 L+ J) P
{
7 m5 T- l. ~3 e0 o2 e& r$ z+ ]5 r MCI_STATUS_PARMS mciStatusParam;# o, P. s4 X# {: K3 a2 H+ y
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
; m5 z  m) k" U/ O( o, j //返回MCI设备的状态信息(音频长度)
( m! ]1 z/ ?6 M5 z1 c3 t) E1 b DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
, v. X! C0 N; o3 @+ B' b6 | if (dwStatusFlag)* `) @+ Z9 s. W8 x  i
  return dwStatusFlag;( S* p' H+ ~0 f
else
/ e4 {2 g) ~; a3 B: _+ ^* F  return mciStatusParam.dwReturn;//返回音频长度: Q! c: L7 [" U
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-11-14 20:04 , Processed in 0.019409 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表