|
原文:http://www.cnblogs.com/witxjp/archive/2010/05/27/1745121.html// MCIWave.h: interface for the CMCIWave class.
/ G* X& J+ I6 p3 s//$ i# k2 y5 o0 `3 }& F
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)3 z! a; e6 w' j6 z) y
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000+ s$ T) o! m: X# z" w
#pragma once# v2 _% `, ]) b8 \
#endif // _MSC_VER > 1000
S, B! K) v" ]& V: l! y8 z9 q1 P+ z#include <Mmsystem.h>
% F' t9 Y4 ]/ u0 \#pragma comment(lib, "Winmm.lib")
! t1 v5 c) Q5 h$ z; ~2 dclass CMyMCIWave
; q$ i% p- v8 v{1 P. U/ I. m+ ]: b7 ^
public:$ a% [/ \" Y) E& [
CMyMCIWave();//构造函数
5 b8 S y+ V6 n$ A. d; l( D virtual ~CMyMCIWave();//析构函数* L2 ]: w% R) W4 X% L _# n3 K# ~9 K$ ?' r
DWORD OpenWave(CString strFileName); //打开文件, M3 q: H3 v% n
DWORD CloseWave(); //关闭文件0 ]: F7 i0 b2 I
DWORD PlayWave(); //播放9 J, j3 V; Z3 V9 Q' Y. w+ d
void StopWave(); //停止播放" r+ i2 D& J$ e5 h, {/ b
DWORD RecordWave(); //录制* V" L7 D$ W. l& |$ W8 B
DWORD SaveWave(CString strFileName); //保存8 a/ _4 x+ a7 { {. A7 @: D0 \
DWORD GetBitLength(); //得到位长
+ Y4 _' h* |! H" T% @1 L& w/ x DWORD GetSampleRate(); //得到采样率2 S6 e @1 W: A* | ]
DWORD GetChannel(); //得到当前声道0 t- K% ?& n" r6 f2 c# F3 g
DWORD GetWaveLength(); //得到音频长度7 r0 @0 g' y% n z' S& B$ k) ]7 C! k
public:# j3 ^5 u: V% e# y- ?' Q
BOOL m_bPlaying; //是否正在播放
1 @1 _: K: b& v" O. W BOOL m_bRecord; //是否在录音
8 [5 @# l: g: W# S8 F BOOL m_bOpen; //文件是否打开5 b p/ G: |! ~1 w4 Z0 Z8 S& A7 X6 u# J
WORD m_wDeviceID; //播放设备ID& _% |# G; v% G e8 v5 g
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_) // MCIWave.cpp: implementation of the CMyMCIWave class.
& P/ B1 _/ ]% A% ?0 }( A8 r//
1 u" {7 d% B) p% g: [! \% T, M/ W+ o//////////////////////////////////////////////////////////////////////#include "stdafx.h"
5 k- j9 ~& R4 ?7 Q1 f% \; g# o; n#include "MCIWavPlay.h"* W6 T. w& z1 H
#include "MyMCIWave.h"#ifdef _DEBUG
2 v/ \& S1 V# Z# g/ e#undef THIS_FILE+ k( n9 t2 ~/ | M/ D# d
static char THIS_FILE[]=__FILE__;
9 N& l: v! ?( J) S% X6 f, U, y#define new DEBUG_NEW7 x3 A z) A0 e8 J, h
#endif//////////////////////////////////////////////////////////////////////
6 ?1 v) I. s: t. k+ ]* g// Construction/Destruction
& ~: @! g5 c. W" |9 w9 x2 k//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()" K. ]% n) ^( E7 s1 x% ~
{5 a7 o: _3 k3 e1 W( p0 }; F C! j
//进行状态指示变量的初始化
- n/ x3 X/ |2 @1 e m_bPlaying = FALSE;
- ?0 d5 F: s/ L' k$ R& c8 m m_bRecord = FALSE;
2 w) ]: [' v3 s# O: i! p m_bOpen = FALSE;
. i+ x* [5 I+ N3 A% H m_wDeviceID = 0;
7 j* G& _# B$ L7 k% ^) g, e}CMyMCIWave::~CMyMCIWave()( f$ m; ~( A |/ I* b2 k
{
* @. }, @' G: Z v9 x CloseWave();//关闭WAV文件
: ^# N$ A" [% Y9 \}& i8 o% K2 b5 u/ t# u3 h, H
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
. G" L! k9 s- Z$ N{
% @" ?+ i' H" K$ e* i, G( y" e/ n if (m_bOpen)//如果文件已经打开
% d! H9 B- ?) \$ S6 e; f {
6 n6 n6 @& p8 e5 N4 h3 K% w CloseWave();//关闭该文件" P& I. }1 @, y& K' z% D
}
4 [' b9 w: ~* F/ u, M DWORD dwOpenFlag;//打开标记9 \% W; y6 i1 r4 g3 P
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
2 {( h8 L8 @+ M$ d- l$ z mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
8 @2 V6 K% ]. U' p& j9 i mciOpenParam.lpstrElementName = strFileName;//打开文件名$ J/ K, R6 G- H# i$ u e
//初始化MCI设备$ F' o! u& o0 P. [
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);0 O# V3 e- \# m, r5 X4 F4 Y
if (dwOpenFlag)//初始化失败
5 D$ T2 q* H& H k9 i return dwOpenFlag;//返回错误代码- w0 }0 {: y' l$ A% T. c" y# r
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID7 S8 u- k# X: T5 r, R
m_bOpen = TRUE;
; G. n* G& i7 G0 p; ~ dwOpenFlag = 0;
7 q2 I( L9 I. E/ u+ b. s# { MCI_SET_PARMS mciSetParam;
9 U: b- j1 V O4 v) c, j3 k' A" | mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
# r( N' L6 U' N: I- |: _% R //改变时间控制设置
& b8 y' q9 |% E/ ] dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);7 y ~' j9 \( K8 P
if (dwOpenFlag)//设置失败5 k% o, c4 D5 A `4 [
return dwOpenFlag;//返回错误代码
. j7 C0 ^1 g" {, s7 t return 0;
( p3 R3 B+ `# V ^4 u}DWORD CMyMCIWave::PlayWave()//播放波形文件
7 i& m2 y/ P, x& H! w k8 e2 q5 r{ u- q0 ^& U) _2 V
MCI_PLAY_PARMS mciPlayParam;2 X# a8 V+ R& h8 s
DWORD dwPlayFlag;1 o" W1 Q6 Y# d9 [5 S3 l5 @4 N
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
3 h1 y( m5 r; b Z4 I" y) @( P3 U9 M if (dwPlayFlag)//播放失败. t9 A X' s9 p6 [5 ]( H% V' ?
return dwPlayFlag;//返回错误代码
4 @& E1 ?5 E6 Z: W2 N4 Z else
- d Z7 W* E2 D8 W {
- R% r" K; M3 S m_bPlaying = TRUE;
; f$ Z& T% e; @1 m4 Q9 G& s; ~ return 0;
6 [ P6 F, V1 W! \" K9 ^ }0 l: K+ u" R$ h1 l! I# f
}7 O# W$ r! b* x+ }6 m- R {
void CMyMCIWave::StopWave()//停止播放波形文件
1 w$ P5 s2 k3 _) Z{$ [. z9 j, F9 P6 u9 t
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
4 O& S: M' V5 g9 k% S}& m" e$ |) v4 ~' O# k4 U
DWORD CMyMCIWave::RecordWave()
2 A: K" d% A$ Y5 Z" ?{
- M8 E, @/ W7 H- V if (m_bOpen)//如果有文件打开7 \6 }% d! e6 ^* Y% w/ m, [
CloseWave();//关闭文件+ y" v A, Q% f/ s8 E
DWORD dwRecordFlag;
1 |' ` z$ J/ r! z% C! j* k MCI_OPEN_PARMS mciOpenParam;" N6 X) n! T# c9 \8 k z
mciOpenParam.lpstrDeviceType = " waveAudio ";$ B' N- C4 E7 o* q% b
mciOpenParam.lpstrElementName = NULL;8 u5 l5 I, T$ g7 |' w
//初始化MCI设备+ ?" Q+ V% x Z9 `% }, ~+ w7 G/ I" X
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);% o) g/ j* `4 L& h" T; s3 l
if (dwRecordFlag)//初始化失败. e2 V$ J+ A) ~$ y" b2 j
return dwRecordFlag;//返回错误代码2 P" l! F% z; _ l& ^% Z- {! `
m_wDeviceID = mciOpenParam.wDeviceID;0 j& [9 ~4 P- _* \
MCI_RECORD_PARMS mciRecordParam;
1 a- B/ }& H( @3 K# x# O //开始记录数据2 k0 s6 ?+ b0 p. q& l
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
) X3 J+ [4 ~4 ]4 q if (dwRecordFlag)//记录数据失败
6 w# b; ?5 }8 M ]( Q: b return dwRecordFlag;//返回错误代码. i3 N! `8 w; C* ~( Z* y
m_bRecord = TRUE;
0 n) O9 ?3 \, y* o2 G. { m_bOpen = TRUE;
' L2 ^1 T0 _& X% ]6 A$ T return 0;
2 J" _5 B$ B# T; c" H+ ]}
' m# p5 i; ?3 w& F5 u7 Z4 HDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
% }1 M3 d, Z9 L% p$ a; s9 u{
& B; X' ]* o. G& n6 l% _+ D9 `* D if (m_bRecord)//正在录音
8 W6 n9 e3 x3 j# V: }* i" {8 ] return 0;//返回+ r' |9 \8 |1 J1 a4 S- M
StopWave();//停止录音
, i! w, F N9 M# o9 D4 m/ u MCI_SAVE_PARMS mciSaveParam;
, ?6 y0 w- ~4 @& Q5 x* u mciSaveParam.lpfilename = strFileName;//设置保存的文件; Q3 j! B- r7 J/ P& I9 a9 W
//保存WAV数据到文件
3 c9 y* u8 b G- O5 h DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);1 Q1 p0 o! t& V5 V
if (dwSaveFlag)//保存失败
4 V& H4 y g# J. b9 J7 f# Y2 W: I return dwSaveFlag;//返回错误代码
4 B5 D& J! j8 m m_bRecord = FALSE;
/ A) O6 B0 V& W return 0;
7 m: o0 }6 c( A# d. d+ P$ @}" c q- c+ N$ \) V; p! r
DWORD CMyMCIWave::CloseWave()& _5 w/ L- y. {9 |
{7 d: X- D9 j- N9 J0 Y) P6 H
if (m_wDeviceID)//有MCI设备在工作9 _* L) [/ M% H9 z. ^
{
2 g h k9 } d e% e, V( W DWORD dwCloseFlag;
7 |& V9 Q+ r6 k# p! U! r mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作3 f0 D/ a/ m* m5 U6 ]# K, i
dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
% X5 w0 S8 H0 Q4 D% o if (dwCloseFlag)
, r( l. C. E: | {& `' `7 S3 w' I; v! ~
AfxMessageBox("关闭时出现错误");5 n6 P0 o8 L5 R; C
return dwCloseFlag;: l. s3 m4 ^5 f+ e# E) J
}# p4 I9 N% H+ G8 i" m% J; m
}
' O, a) g8 D6 C: x8 N, a //设置状态变量$ @& s3 y: i2 C( h7 s$ {! P1 u
m_bRecord = FALSE;! \1 N+ J4 O9 {9 i( ~
m_bOpen = FALSE;
; _) n6 Z. p2 P+ x3 `% R; }# U' r1 w m_bPlaying = FALSE;6 S* c1 n7 I1 Y- d
m_wDeviceID = NULL;5 B7 f, d* e, u$ I1 G6 m e% D
return 0;6 @, g) i" y, S4 z8 v
}! \ E( q) W, j; ~( g
DWORD CMyMCIWave::GetSampleRate()//获取采样率
6 } _: A: ?1 |. D: u1 f; M{
0 t, E* k( e9 m2 q7 m6 {& Y, d% J! x MCI_STATUS_PARMS mciStatusParam;
7 P* Z1 z4 [# A8 }/ p mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率6 M! j; e4 V9 @7 u8 M
//MCI设备的状态信息(采样频率) ~9 u" C0 I3 m9 O1 l& F# E6 X7 ?' O
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);% W8 E) R$ K7 C# X# _0 |
if (dwStatusFlag)( l5 p# s/ X+ |. m9 j
return dwStatusFlag;//返回错误代码; ]' n+ ? _ \
else
5 F( `! g3 G- j6 O return mciStatusParam.dwReturn;//返回采样频率9 P6 U# G- K; l* @/ P; d
}
5 _4 H Q; N* r% y* sDWORD CMyMCIWave::GetChannel()//获取声道数
8 `" H/ s( b4 ?5 |{
9 [$ g' {, _) u0 G; E( y MCI_STATUS_PARMS mciStatusParam;
, f6 q. ?7 `% _% v- U mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数; H1 Q6 v2 d! Q1 j5 W
//MCI设备的状态信息(声道数)
9 o$ j& G# f& E' s DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
; V+ L& u7 w' d. i' e( P1 h if (dwStatusFlag)
% E, Q/ z0 w* ]3 ` return dwStatusFlag;
. P' |* H/ z- o ^4 O: V8 d else2 y* q, [9 }+ `0 P" y( _
return mciStatusParam.dwReturn;//返回声道数7 s6 ~4 `7 ]* q: @* v" Q( E4 O% F# T
}
0 ` r7 w& Y2 i( s" C X' SDWORD CMyMCIWave::GetBitLength()//获取声音位长7 W1 [0 s4 D( J f
{8 l: w) s2 K8 [( N/ r C
MCI_STATUS_PARMS mciStatusParam;( P; b6 [2 ^' d. h7 k O p
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长, p$ W! z$ |8 L9 b* I
//MCI设备的状态信息(声音位长)' }( t: ~% Y! i' V* r- q- N
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);# n! c3 C! \( i! z
if (dwStatusFlag)1 i N5 J4 T5 W! N4 a) k- b( h
return dwStatusFlag;
, b& m1 D9 b) t+ L% _ else" ?/ F" t; J( G3 K6 Q
return mciStatusParam.dwReturn;//返回位长
7 V4 g7 i$ A0 ]2 [- I( h# c. `}) P2 I& B$ W/ ]3 J: H: L4 [* t
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
2 y z, Y3 i3 ?, h0 Q* V: ^ \{
/ R9 M: g9 ^6 G4 u7 M MCI_STATUS_PARMS mciStatusParam;
" P2 f9 ]8 ~# o4 p mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
9 R' x& U5 B2 _+ }( K1 V //返回MCI设备的状态信息(音频长度)$ v. p+ A8 P, q; h' D& Y& O
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);6 v# i# W; }3 e8 c+ P, A4 _
if (dwStatusFlag)% v8 V$ h3 {" q& \/ z
return dwStatusFlag;
. y' k0 S! V7 \( O; ~5 T else7 w6 S2 {' H) u' R
return mciStatusParam.dwReturn;//返回音频长度
# X$ q8 r& Y. ^5 q; u' M} |
|