|
|
原文:http://www.cnblogs.com/witxjp/archive/2010/05/27/1745121.html// MCIWave.h: interface for the CMCIWave class.
5 q* }1 s$ D" \( p, m//1 V1 [9 ?+ g$ V6 V$ _% i7 s
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
o# ]& ?3 Z P) S7 ^- @$ A3 H' W#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
+ b) h0 Y I- F#pragma once
5 q6 i; m0 r! P* \$ F; B#endif // _MSC_VER > 1000
$ k' k* m- \+ R# y& p H#include <Mmsystem.h>
0 @6 t7 d; S* h: U#pragma comment(lib, "Winmm.lib") 9 a6 j( P& }0 L& _* y
class CMyMCIWave
: x* ?; y8 b7 K! W{
% |. A$ {9 x* P4 \2 [2 J& M/ dpublic:
: `& V6 P2 K6 r1 F CMyMCIWave();//构造函数
* m2 D$ A( i# @! Z. Z virtual ~CMyMCIWave();//析构函数; W2 a2 u' _, d' ]" `- H
DWORD OpenWave(CString strFileName); //打开文件0 m% K: ~ z! |; H/ N3 U" _$ ~/ s6 ^1 q
DWORD CloseWave(); //关闭文件
8 `! T: W" u' k' i( m8 J2 \ DWORD PlayWave(); //播放4 k# C$ {# }/ O1 E# c$ U
void StopWave(); //停止播放
. D3 l, O1 m. X DWORD RecordWave(); //录制# l4 |% k6 @$ g0 n% p
DWORD SaveWave(CString strFileName); //保存6 l4 Z7 U0 u5 e, r0 x4 E3 t" w; [
DWORD GetBitLength(); //得到位长
' X' \6 `3 {# d- e/ h$ y DWORD GetSampleRate(); //得到采样率
# X6 c* F7 B6 j3 Q DWORD GetChannel(); //得到当前声道
/ n- n" b3 K4 M1 z/ r! G# S. \ DWORD GetWaveLength(); //得到音频长度
$ ]0 n' w0 X' l3 x9 o. z% P: xpublic:
7 N" F8 i; P( Z( C' Y/ E% q BOOL m_bPlaying; //是否正在播放4 ~3 M% m" b1 j$ F5 F& f) O
BOOL m_bRecord; //是否在录音: ?! e: X9 D9 e, B) F
BOOL m_bOpen; //文件是否打开0 G0 \3 o# \2 ~0 l
WORD m_wDeviceID; //播放设备ID
" X/ E& b8 @4 U+ v2 Z+ x# H& z};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_) // MCIWave.cpp: implementation of the CMyMCIWave class.
* Z. ~6 _6 `: o" R//; U! `, n: C$ ?
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
0 q# d* ?& j. | s2 h6 Y% p, u4 t$ S#include "MCIWavPlay.h"$ S8 @( g* m c2 g* _2 T9 ?+ q
#include "MyMCIWave.h"#ifdef _DEBUG3 w, t- F- c3 N* b
#undef THIS_FILE
9 _5 r( H3 ^, `' ^5 g! b. Gstatic char THIS_FILE[]=__FILE__;
3 m6 p( U" H1 a* {1 m1 e# M$ ^#define new DEBUG_NEW
# H$ K. s+ E8 ~; z" b! {#endif//////////////////////////////////////////////////////////////////////1 [& t1 \: H; F, i
// Construction/Destruction
) L9 H8 u2 x/ B" d//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()7 O& a; Z+ s) h' J6 g( L( |
{3 J" p/ K# @) i1 k7 p
//进行状态指示变量的初始化
% D F9 s+ f; a m_bPlaying = FALSE;
- b( ?5 R& r _! l4 W2 Y$ O m_bRecord = FALSE;. [2 O5 k. f! U, d
m_bOpen = FALSE;+ Q1 C: H2 ^2 O& [8 ^
m_wDeviceID = 0;) g" ]* Z S2 ~, w" n7 w
}CMyMCIWave::~CMyMCIWave()9 k$ ?+ [9 P2 v" u/ e ]
{ W9 c1 q( a- A2 ]4 J( R, n- G3 _
CloseWave();//关闭WAV文件1 A6 n6 K+ M D( _. |
}% a' |9 s8 o; c4 |
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
7 Q" Z; c' |% f# l; `2 }. z{
$ |2 J! ~4 j6 E if (m_bOpen)//如果文件已经打开
) N- n: u- G: v' w2 Z, k {# h1 ]9 g* J4 b! F- b4 b/ E2 P
CloseWave();//关闭该文件
1 Z& q9 A# @0 r: P6 M; r6 \# i }
9 v8 U/ }7 z; J" y4 T D DWORD dwOpenFlag;//打开标记
) k0 v% Q% |) U MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
2 F- J! d) m$ {/ E mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型" i3 q, [3 }0 x! G$ o
mciOpenParam.lpstrElementName = strFileName;//打开文件名; _ _- r& g/ j& |9 b
//初始化MCI设备
2 s6 D* E7 P! r dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);9 _$ {1 C$ |; u' u1 g! E+ ^ s8 D6 c
if (dwOpenFlag)//初始化失败
& Y" [1 `# \* H8 h/ j, S9 T$ k& ] return dwOpenFlag;//返回错误代码
* x- T' W- n3 Q0 M$ t& ^; H! O m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
; z% P" M) _9 H2 ~" s! j- z1 u m_bOpen = TRUE;
0 M4 Z- Z3 ^" w5 X. P dwOpenFlag = 0;7 u: Y. @1 m( L s
MCI_SET_PARMS mciSetParam;
6 `" C) F) n) O mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒) ]" l# ~4 s0 x9 T5 W7 @* a
//改变时间控制设置9 U N( m8 C) K# m+ n6 q
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);! l; F O1 J9 g0 y
if (dwOpenFlag)//设置失败# b m" g. u. D0 l
return dwOpenFlag;//返回错误代码
* C5 ^% k1 u* f) S' z3 E& q) c7 p return 0;8 \1 d. L; Z' ~, s
}DWORD CMyMCIWave::PlayWave()//播放波形文件
$ N+ V0 _& G. \2 m" Z{
# V& U* n9 M0 }1 k9 t( O MCI_PLAY_PARMS mciPlayParam;( W z% ^' O) H
DWORD dwPlayFlag;
! M. E$ N+ j3 Z6 l4 X" u dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据7 H5 N! }3 g8 I7 J2 W
if (dwPlayFlag)//播放失败6 [; _1 z: Z& `& ~
return dwPlayFlag;//返回错误代码
! U2 Y8 T# D! @' m) z/ t/ N else
+ M. \ H) a& v" i6 o) e2 G {
1 u. i+ P: Y+ J8 v$ T m_bPlaying = TRUE;
; `9 w! q6 m7 h8 G3 s8 i return 0;
* m, x" K7 T6 E) @0 Z- A& H3 W$ q }
; O3 @' M, g1 a* q0 u" b} C) x& n" ^2 O- |6 Q
void CMyMCIWave::StopWave()//停止播放波形文件
% V# p0 Y6 X6 V9 b5 T0 y: ~{
8 Q7 B2 g0 L& d* D! C) z& h8 I mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放7 e; K% e' t4 S. \
}
( x, J: k+ L6 Y) N3 \DWORD CMyMCIWave::RecordWave()
' J1 k9 @, K$ G6 W5 E' l( V{+ z* r0 p* A9 H4 O* Q& W
if (m_bOpen)//如果有文件打开6 W8 j8 r! p7 a/ M3 L* F
CloseWave();//关闭文件
1 D" B# [9 H. P, X& |/ l$ \/ ~1 b DWORD dwRecordFlag;
& `! D, `1 P$ h$ x# e MCI_OPEN_PARMS mciOpenParam;
6 J, A# v- q E" q( y5 J% u mciOpenParam.lpstrDeviceType = " waveAudio ";
2 t5 E' {4 O7 C; \( C( h0 e5 K mciOpenParam.lpstrElementName = NULL;- j* Z5 p+ v( r# X# c
//初始化MCI设备* Y c+ X; E; \' }9 S. ]8 {
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);* n' X4 v' r' }
if (dwRecordFlag)//初始化失败2 K+ W4 |0 {% K+ }4 x
return dwRecordFlag;//返回错误代码) L7 Z% h8 b) g- ~
m_wDeviceID = mciOpenParam.wDeviceID;# R5 l+ V+ I4 h! g+ F7 Q* a: `
MCI_RECORD_PARMS mciRecordParam;- N. U G7 w9 I4 ~* g2 N& i- N$ n
//开始记录数据
9 G7 |, b8 z# Y% n# C# \+ V dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);; G% A8 g ~- M& F6 {8 J
if (dwRecordFlag)//记录数据失败
: `7 P3 X% r1 h1 N8 k m return dwRecordFlag;//返回错误代码
5 q9 y4 p' `# ?; b3 } c) j m_bRecord = TRUE;
/ z# S- g& L6 {& r; B" t m_bOpen = TRUE;
! q0 T, n* ] c% O& }, k return 0;
& q o/ f+ z* S: p6 `}! B: a9 ]6 I( V; h
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件" B; m# U% R4 Z2 x
{0 x- x8 X/ K$ ]8 [
if (m_bRecord)//正在录音1 R$ b% y. U" k: E7 X
return 0;//返回8 l- K) e4 {: M
StopWave();//停止录音
4 u9 ^3 w7 a0 u5 o MCI_SAVE_PARMS mciSaveParam;/ K4 m* h! l4 l' ~) [9 Q
mciSaveParam.lpfilename = strFileName;//设置保存的文件
) o* z, N( |0 I; R" n; ], @" ~ //保存WAV数据到文件, f3 a. Z6 U3 w8 g6 A5 c
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
4 j6 s: \- k' J7 n, k if (dwSaveFlag)//保存失败
5 n2 Z, }. I0 m( T5 ] return dwSaveFlag;//返回错误代码. v* ?7 k! L7 \+ |! p5 E
m_bRecord = FALSE;
& p8 ?/ `3 e) l, C/ M return 0;
/ U5 g3 j. |( }, E}
& F8 w8 ?7 K2 @' g! \) O4 rDWORD CMyMCIWave::CloseWave()' E3 P1 M; z( x
{
" k. D. P' a. X' t if (m_wDeviceID)//有MCI设备在工作( o* o' U& F6 g9 N4 v) a0 B+ u
{
/ ?' I8 n; a/ E0 } DWORD dwCloseFlag;& s( W7 n6 p k0 q/ g6 U$ Q
mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
4 p& V2 n+ [, h5 G# j+ Z dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备4 X& |& }2 [; [
if (dwCloseFlag)
1 U% }- w* P5 r/ c6 ^ {. L2 N# I9 S/ b( b* S
AfxMessageBox("关闭时出现错误");9 n4 B% }+ F( }8 j: D
return dwCloseFlag;
" r" x# Y/ q7 X6 l* a2 ~! Z }
/ e2 A$ ^6 j" w }2 g2 ~) Y* l' F [' f! w9 q7 C
//设置状态变量. ^$ O3 t" X4 {, U
m_bRecord = FALSE; {$ }& ?& j6 o5 T$ ^6 B
m_bOpen = FALSE;' n n$ y4 `" q1 U
m_bPlaying = FALSE;& c, G: @2 ?5 Z8 B8 l
m_wDeviceID = NULL;
- m1 u8 H2 g. V$ x7 w$ u2 }& ^" B return 0;8 u+ @1 N$ k+ v/ N; W$ j- n
}
o% A. M) m8 b( g* W1 BDWORD CMyMCIWave::GetSampleRate()//获取采样率
* X; b; d# [. @{
% R0 s& c/ E7 N1 l$ u MCI_STATUS_PARMS mciStatusParam;
+ p6 {1 v* ]/ s+ e; p& B, q8 H$ D mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率& f& y2 ~. E; V& o( n0 S- Y
//MCI设备的状态信息(采样频率)& w( R2 Q9 a6 Q& s- t
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
9 I `6 m" t$ V# v& b8 c6 I if (dwStatusFlag)6 t1 C) a" s' {! N2 G! q& j
return dwStatusFlag;//返回错误代码
7 Q8 U' e6 M) N% m8 ` else2 G- p6 O& M% V) [4 k
return mciStatusParam.dwReturn;//返回采样频率" _4 I" @2 l# B, q' w
}
* x. ~) L- {# a* k3 hDWORD CMyMCIWave::GetChannel()//获取声道数1 t7 Z( L1 K4 h7 q- [
{
7 S. h9 f* q% q K1 P MCI_STATUS_PARMS mciStatusParam;
4 C. ~- q- N- _- i1 W+ A" l6 W mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数+ o% E2 i$ q$ X8 f
//MCI设备的状态信息(声道数)" _: T& P3 W: [ @8 y3 M
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);- f" m2 m' E% ]( o. q
if (dwStatusFlag)( X7 G+ \9 O& B1 Q' P
return dwStatusFlag;
! i! I1 R: |6 z- u2 t else
6 B& B( w4 a Q/ G! t return mciStatusParam.dwReturn;//返回声道数
; D9 g: n; h$ k) O: h}) x$ a V9 t2 V! I
DWORD CMyMCIWave::GetBitLength()//获取声音位长( C( T: t8 B2 P3 ?& ~( i. P
{4 B: t7 v- [8 D- }
MCI_STATUS_PARMS mciStatusParam;
5 _4 B. r# y* B' o mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
" u' D" V% V' u( H- {3 f //MCI设备的状态信息(声音位长)$ u8 \1 w0 k1 i9 z) d, ^
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
4 m) [) T8 x# W2 c if (dwStatusFlag)" R1 T Y' x. v5 d# f
return dwStatusFlag;8 w8 r! Y1 X" f: q2 _
else
7 i5 G( V9 W- q! T; F: P& f return mciStatusParam.dwReturn;//返回位长
* B! T* w6 p* E E, `}
) P) o' M; Z9 n# K& a# zDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长) t. ^+ n9 {% w8 @. w5 N
{% i9 U. [- E0 v
MCI_STATUS_PARMS mciStatusParam;
2 V' A! P% y, ~' _" l8 t/ A) O mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度; h( t1 o/ f% a5 l& W4 y5 d
//返回MCI设备的状态信息(音频长度)2 e1 m# e. E$ U" M8 S; F* |
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
$ A" i6 c* j. A* G if (dwStatusFlag); c' C+ Z# |2 m4 H7 G
return dwStatusFlag;+ E8 o3 K: Y9 z) x) l) \+ P
else
8 _4 }* U! `8 ` return mciStatusParam.dwReturn;//返回音频长度
, B. l: D5 e7 G0 W4 ^} |
|