找回密码
 注册
搜索
查看: 2523|回复: 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.
4 q( n( m1 d9 O/ c" i1 k% w  P//
( w: v1 i2 Z* \$ Q7 Z0 z//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
5 ~6 n1 ^4 ~  }. O! }% Z#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10008 U: Q3 m. m1 B5 b
#pragma once
; m& g1 e* s. t& a! a$ d#endif // _MSC_VER > 1000* }/ L$ r5 ^+ I) l$ S5 @9 I) K
#include <Mmsystem.h>   # a. s# b+ Z  x" u- x
#pragma   comment(lib,   "Winmm.lib")   
4 j( p: i  |" k4 W% @% C) l$ L+ qclass CMyMCIWave  + i- S2 S8 Y9 \5 E$ \
{% z  i6 w9 R! v3 b% Z
public:/ A2 A0 |3 Z! g! U0 v, ]
CMyMCIWave();//构造函数
& \4 M* l: U7 l5 _3 f4 z virtual ~CMyMCIWave();//析构函数
4 j* f) |+ M: K0 } DWORD OpenWave(CString strFileName);                  //打开文件
4 j7 A- O. c) \! G& Q DWORD CloseWave();                  //关闭文件
6 k3 Q8 X* j; a0 a' W% C% ? DWORD PlayWave();                   //播放, d: d, x6 A& b) C0 w' X
void  StopWave();                   //停止播放, M0 l2 s$ U7 I* D- k0 ?2 A, m0 {
DWORD RecordWave();                 //录制3 k% H  |  r$ c: ?) c
DWORD SaveWave(CString strFileName);  //保存# m4 s+ S' L1 ^$ S
DWORD  GetBitLength();          //得到位长7 O* L/ c  w- R+ k
DWORD GetSampleRate();          //得到采样率
2 E8 Y5 E  ^9 o% G( [4 _ DWORD  GetChannel();             //得到当前声道  V! C- f" i4 S- u
DWORD GetWaveLength();         //得到音频长度
9 C( G& C4 s& U. mpublic:
% J+ c3 u" {8 V( m. U5 U4 ] BOOL m_bPlaying;               //是否正在播放
, M+ x9 _9 W- @6 |1 M BOOL m_bRecord;                //是否在录音
5 I& j& ?" U# a6 R4 y BOOL m_bOpen;                 //文件是否打开
) Y! V! u+ j# N" y& p WORD m_wDeviceID;            //播放设备ID
5 m3 I8 c; g" Q: c5 |};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.9 C* [, C3 Z4 J/ `6 E6 m
//
. R$ j: b1 z! G! \+ m//////////////////////////////////////////////////////////////////////#include "stdafx.h"1 f6 g8 ]" i' M& `: I5 q
#include "MCIWavPlay.h"; _. d1 F8 i) t" t  `3 }
#include "MyMCIWave.h"#ifdef _DEBUG/ \0 m) A7 I6 T: H
#undef THIS_FILE4 r  K+ l1 t7 O: l, v% ^1 A
static char THIS_FILE[]=__FILE__;% i$ D0 V$ D6 S" w
#define new DEBUG_NEW
' v2 e5 F' W; c5 O5 z#endif//////////////////////////////////////////////////////////////////////
. T; R# ]6 I6 v2 V* G// Construction/Destruction
9 m" M9 i( o+ K//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()( G, t; @- j( X3 n' F4 G
{, T+ t! r  C0 G( h+ T
//进行状态指示变量的初始化( Y1 ?3 Y) M7 q4 S9 G2 i
m_bPlaying = FALSE;
% t* @) u2 u& E    m_bRecord = FALSE;
$ z7 M# V$ u, K/ q( y4 f" ]    m_bOpen = FALSE;1 I# D5 G$ D* X- C
    m_wDeviceID = 0;
& }% X8 G* N' u1 L& }  `' o3 L8 S}CMyMCIWave::~CMyMCIWave()/ q( v- p3 E4 C0 Q
{8 K2 `7 {2 h8 v  {* v
CloseWave();//关闭WAV文件: J/ I$ k2 l/ M$ C! z& c/ c& N
}( `) N9 u# k, `8 }; X4 L- H3 B
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件0 t1 x- _) k9 S: `# E. f& O3 ?
{6 u4 j. C3 D5 y6 O2 @1 J
if (m_bOpen)//如果文件已经打开+ q0 B, n" ^9 c  U) ?; a; s. u' b9 U! ~) z
{
. i# r+ g2 J6 {7 G6 }+ G. Y7 y& E  CloseWave();//关闭该文件
2 g1 d' c* ]# Q4 z& H2 c4 ? }
" E  @' `9 S1 b6 X DWORD dwOpenFlag;//打开标记
9 d: u7 @! P9 X! D  H MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构; I- [; ^+ h" W: \0 [& E
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
% m3 w, \6 n: t/ o3 M9 l9 J& J mciOpenParam.lpstrElementName = strFileName;//打开文件名
$ q. N) ~2 J5 K //初始化MCI设备
$ J) P- Y% s1 @6 Y) S! y$ {5 o dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
# r- O" C) [7 ~  M; f7 D4 h if (dwOpenFlag)//初始化失败
9 Y) p2 o3 e' }  return dwOpenFlag;//返回错误代码
6 g. ?! j- A5 n- W- c& G) C' e% m m_wDeviceID = mciOpenParam.wDeviceID;//设备ID# z' H0 Y9 L. @  W
m_bOpen = TRUE;/ G% ]; c* C4 d
dwOpenFlag = 0;
; |1 \* o( M$ B% j' z$ ^ MCI_SET_PARMS mciSetParam;
0 y7 H% v& h; B# Y3 h7 [ mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒* a2 F+ ?) ?/ }1 c* n4 \9 \
//改变时间控制设置
( _2 p) u* g* c: u5 _ dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);1 T, ]- U8 m7 }
if (dwOpenFlag)//设置失败& g! z0 {/ J, d& [# Z
  return dwOpenFlag;//返回错误代码
% @  n( S7 o  q, V/ A! y/ L  D' j" V return 0;
% K6 l2 W  l' X}DWORD CMyMCIWave::PlayWave()//播放波形文件' z8 f! r0 c# P0 T) X
{
2 Q9 O! I7 p# t. u: k" }( l  \7 P MCI_PLAY_PARMS mciPlayParam;5 D9 B9 I1 Q: Y0 A5 a' i; l2 l7 l( y1 z
DWORD dwPlayFlag;5 |! m) [0 {/ @3 h) Z+ J- |& e
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
( \/ t8 U4 u3 b; g3 w/ K8 s9 _ if (dwPlayFlag)//播放失败
) F2 S9 ~; V  b) v  return dwPlayFlag;//返回错误代码
# K' l/ V$ o7 L! ^1 {6 s; g else
0 {* p2 A8 `. Y% d1 ] {, s+ [) h) D  L% ~2 r$ j! a% _% `
  m_bPlaying = TRUE;
; q  \( n* I+ k; L6 ^* g/ t, T  return 0;
% y3 b! [* M$ T7 G; j. {* T }
" W+ I: j/ g, x% q7 {7 t}( x% b& a& l7 g$ Q$ F
void CMyMCIWave::StopWave()//停止播放波形文件3 W$ [5 w" n  A2 y- R, a# k
{% s1 c4 v0 B" K& `* P6 ~$ H
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
6 ~6 T& e2 ]1 q  U}
/ o& {" Y& ~) m6 A7 ODWORD CMyMCIWave::RecordWave()
5 j" J) O4 P' I% c+ r8 E" _8 ^8 Q{1 _( x8 w9 y% I; t4 b: M6 r
if (m_bOpen)//如果有文件打开  y" {" N3 m5 c3 ^
  CloseWave();//关闭文件
, L2 y& n9 v) d/ ^& P8 \  L DWORD dwRecordFlag;
- I' T: c% B' a6 ~: I8 M( ?# k MCI_OPEN_PARMS mciOpenParam;# a' B& w7 D( ~% c; ?$ Z
mciOpenParam.lpstrDeviceType = " waveAudio ";
3 y7 ]  G  e8 V1 d5 }4 Q4 C mciOpenParam.lpstrElementName = NULL;
; c: P; t$ s) } //初始化MCI设备" r3 p# ~3 X6 }2 p$ _6 d* v5 B5 H
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);" r# e+ o8 A" |) z
if (dwRecordFlag)//初始化失败
5 {, L7 p2 K9 f- P  return dwRecordFlag;//返回错误代码, y0 N* A  I& ^5 `# i
m_wDeviceID = mciOpenParam.wDeviceID;* U8 \- Y7 w4 {  t0 I; x$ \
MCI_RECORD_PARMS mciRecordParam;
; m' V+ G+ Y5 Y1 @ //开始记录数据9 U! U: {' j6 L! X5 ]2 u
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
. k8 [/ |6 `$ U4 Z if (dwRecordFlag)//记录数据失败
$ |! z, V% K, \  return dwRecordFlag;//返回错误代码7 O) h1 }8 R0 V4 s& o+ D
m_bRecord = TRUE;
+ G+ v& P+ |  R2 W- v$ V m_bOpen = TRUE;! N8 T& F. M/ T
return 0;' j$ i& e& U2 P- J8 J
}
. V" O% m) v! `8 o7 [DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件( `: q  s, C4 z3 V
{
3 b# v, Y* m! ]" J6 D, c    if (m_bRecord)//正在录音8 z6 l8 R  w* u0 @3 R, _& R3 Q7 ]
        return 0;//返回
* ]% K" c4 k! A4 h2 V5 q StopWave();//停止录音+ y2 k' J/ ]$ U( Z6 z
MCI_SAVE_PARMS mciSaveParam;& u1 n3 r  ]7 ^" c
mciSaveParam.lpfilename = strFileName;//设置保存的文件! B# j8 s. w' E2 P3 W% V' ]
//保存WAV数据到文件
6 s2 {0 ?0 m* m; `1 C$ I9 q DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
* f, i  e$ ]! ]: ]! G% Z if (dwSaveFlag)//保存失败
+ a5 _+ C1 U( D: Q' b+ z/ V( A  return dwSaveFlag;//返回错误代码4 @/ _( N; L$ Z
m_bRecord = FALSE;5 e. A$ {. ]/ U& J- z
return 0;
8 \- ]$ I! u9 k& s}/ I- |2 U% o& K* r+ ^; U$ n6 c% t! \
DWORD CMyMCIWave::CloseWave()% v# `) @1 a! P- A/ ^7 t
{5 Q9 j4 w: d. A, t
if (m_wDeviceID)//有MCI设备在工作
$ u0 V8 z* i5 ?! `4 {& r& `5 X6 ] {8 z, @- D$ O( ^2 U2 Q& p# B
  DWORD dwCloseFlag;2 x% Q3 I8 g6 n% @% O
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
2 ?  P9 M  c0 e: O  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备( E) k# W- }. [4 `
  if (dwCloseFlag)
( X6 O* P9 V/ j8 H  {! M- L) F3 g1 t6 i/ I
   AfxMessageBox("关闭时出现错误");
) W0 `! M9 w2 m" G  h   return dwCloseFlag;
& o% G0 ], @+ ^  }
" e) p& z& U4 V+ I5 E$ a1 e" s }
# L. ?. p& w+ W //设置状态变量
% [" I5 d" D+ }& g5 ]. V: r m_bRecord = FALSE;
' v# y& v' ]+ E2 O$ A5 p3 \ m_bOpen = FALSE;) c; f& d) j8 L  V( Q5 h4 n4 Y+ \1 c
m_bPlaying = FALSE;( E4 r5 G2 T8 R: ^& m
m_wDeviceID = NULL;9 m6 U4 F7 ?3 S5 S6 @8 ^
return 0;
+ q2 K& a3 i2 ^. Z" E}, F, Z3 @/ b$ i7 ^4 T6 h( f* v# y3 V0 y. u
DWORD CMyMCIWave::GetSampleRate()//获取采样率% m" V$ ]# c1 H! O" g
{" L+ D. ~+ |* Q' a6 Q6 H4 t8 Q
MCI_STATUS_PARMS mciStatusParam;
( B. l) `5 R8 k mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
5 T4 K  S( n0 _  v //MCI设备的状态信息(采样频率)0 V5 D( D7 N9 N4 z7 J
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 R- a& J4 X8 [) U" c2 R
if (dwStatusFlag)
( d- ]" ?) C, w: R, @7 X1 \  return dwStatusFlag;//返回错误代码
9 v) H" [7 y: A* `* W' V& y else6 u  B+ P: u# ~
  return mciStatusParam.dwReturn;//返回采样频率
5 |: T# p! a6 [8 {- v6 p}
% p# ]* h, Z4 r& h: q8 n0 bDWORD CMyMCIWave::GetChannel()//获取声道数/ n* G) I/ ?4 p; W
{# o4 g% o; S2 s3 N
MCI_STATUS_PARMS mciStatusParam;
5 s% \% \& `( d mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数1 g+ a$ G! o7 i+ }
//MCI设备的状态信息(声道数)2 g" o  O# f+ e
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 j' C9 d8 Z0 i. j! [* a
if (dwStatusFlag)
( L. ^; Q4 H/ S  return dwStatusFlag;8 F8 n9 u8 d/ R& V3 ]% v
else% z& F' a6 b, H; h) L
  return mciStatusParam.dwReturn;//返回声道数% E! s% C/ i' ^6 V. M6 P$ t7 X: Y1 |
}2 `0 j2 x1 a7 F1 S% d/ Z
DWORD CMyMCIWave::GetBitLength()//获取声音位长
5 x* b2 D" i! v- Z# o4 S  ]{
  S  x, e. I$ h4 b9 j6 o7 L MCI_STATUS_PARMS mciStatusParam;8 g6 A0 ?  y2 X# N: O4 p! F" j
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长( I+ o8 {; |0 j; I0 r- T- q" |) a
//MCI设备的状态信息(声音位长)
9 K: U) h5 p' q/ j DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
$ q/ j. S; ^- @* h if (dwStatusFlag)2 ]0 ^, X$ b9 g- F* z' o4 K# O: h
  return dwStatusFlag;
' ~: f% Z+ j: h0 t- I: q" ] else, Z/ b5 J0 M! L% s8 O. p; h  y
  return mciStatusParam.dwReturn;//返回位长- C$ r/ m8 D5 |' e6 a& ]. ]. Y
}* U2 A0 Y$ `# |3 w8 \( a1 Q# ]
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长9 {$ [4 e' y1 ?3 i2 W
{4 O9 i# J+ W6 {& _, T
MCI_STATUS_PARMS mciStatusParam;
) ^# E# B. x  T2 ?( u mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度% ]* }! |! B8 ^' T
//返回MCI设备的状态信息(音频长度)7 L7 Y- l6 P2 `1 L+ L
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
' U) ?: ~+ m% h0 P& N" _) r if (dwStatusFlag)
% Z; u  g9 h9 V6 `3 [: C  return dwStatusFlag;
( i3 X* z( ?  \' _/ Y else
1 f; f! j* s1 ~0 Y2 s' e  return mciStatusParam.dwReturn;//返回音频长度
: U7 h+ ?& A3 B3 @}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 11:03 , Processed in 0.015230 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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