|
|
原文:http://www.cnblogs.com/witxjp/archive/2010/05/27/1745121.html// MCIWave.h: interface for the CMCIWave class.
% S% C/ }- j$ h6 E1 Q3 k//
" W8 B$ n7 V" {1 V7 J, ~//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)- G. T5 y$ B) c
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000. x# Y3 I6 ^; K% I: i6 [5 x
#pragma once8 O4 n% \9 i% V
#endif // _MSC_VER > 1000
' b& ]. b& Q6 y3 {5 Z2 g#include <Mmsystem.h> 2 ^8 y9 j j, P) b
#pragma comment(lib, "Winmm.lib")
( s6 j" p' d* b/ Y6 jclass CMyMCIWave
- {2 r/ X0 J) B4 Y5 U{
) I0 s4 J- s+ t4 N9 j0 xpublic:
" u3 \6 Y& m# n& Q6 O* A CMyMCIWave();//构造函数
/ C1 W+ Y+ |& s4 q8 @ virtual ~CMyMCIWave();//析构函数
' G! {/ u- X) }- A; M% Z+ U4 e7 F DWORD OpenWave(CString strFileName); //打开文件$ d: d1 i8 \0 L- X. ]3 Y
DWORD CloseWave(); //关闭文件0 C; ?" ^9 `8 T, Y: ~/ b
DWORD PlayWave(); //播放" c; Q! U3 A5 r' ^/ q
void StopWave(); //停止播放
3 \ J) N: o7 \! s, S% J DWORD RecordWave(); //录制9 t7 }( _* O) [& o
DWORD SaveWave(CString strFileName); //保存, J! V* {' M2 V
DWORD GetBitLength(); //得到位长
3 _# `- o, h$ `, k6 W& B DWORD GetSampleRate(); //得到采样率
; q1 X* ~0 Q) W X* n- U1 F DWORD GetChannel(); //得到当前声道
/ M/ z. J$ @ r1 d2 _2 G DWORD GetWaveLength(); //得到音频长度
( w" ` B$ x. w8 Upublic:. F' F5 ]1 a; v
BOOL m_bPlaying; //是否正在播放
. e$ a; l+ M2 c BOOL m_bRecord; //是否在录音
6 A2 i( {- Q; A7 @+ J BOOL m_bOpen; //文件是否打开0 \- g+ I) y8 Z. a7 j
WORD m_wDeviceID; //播放设备ID* F# \3 x" R: L9 Q0 `6 @7 V
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_) // MCIWave.cpp: implementation of the CMyMCIWave class.
, M4 V1 O1 W" P( Y( D$ j//9 o5 b) _3 ^0 Q2 `. F& M( D
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
4 {: M; b# X6 q. i#include "MCIWavPlay.h"
/ ~& J1 g# l' G2 G#include "MyMCIWave.h"#ifdef _DEBUG: j7 ~* r8 q; u( V1 ]- k
#undef THIS_FILE
/ w' V% e W1 e# R" Fstatic char THIS_FILE[]=__FILE__;0 g% x/ f8 l1 y p
#define new DEBUG_NEW
0 H. G# B" n# e( o6 }9 \( a, N#endif//////////////////////////////////////////////////////////////////////8 k5 W O7 |+ M7 H- q0 m- [
// Construction/Destruction3 x: m( r# c6 d) [* r6 G7 e
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()& K5 H2 Z( C6 O( V& C% J4 k
{
1 E2 ^5 @* k% @ //进行状态指示变量的初始化
1 _9 ~' y+ z5 x* _( s' E. { m_bPlaying = FALSE;% M" H3 d7 v0 |4 ~- n; H$ ]
m_bRecord = FALSE;* R3 a7 V: Q7 P! x( o/ p2 n/ `
m_bOpen = FALSE;1 o5 Y! j( O7 k
m_wDeviceID = 0;* r c/ s" M$ T# O8 x) ^
}CMyMCIWave::~CMyMCIWave()/ J. X2 \# [" v6 `( b
{
, ^/ W/ W0 P! M4 a# \3 g4 n8 m CloseWave();//关闭WAV文件6 a9 d, Y/ N+ J7 ?. y s' d" \
}
' k9 A% \3 n5 q& W" N2 gDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件/ F* W1 O: [% w7 {2 y; m, r( \5 t# o
{4 m- e v; E, [; x6 ~5 T
if (m_bOpen)//如果文件已经打开
6 v m l9 X' S' } {
7 T# K- I5 k8 Q$ ]* \( ]' J CloseWave();//关闭该文件3 d7 n6 o* y8 {* x
}
, K6 q- m6 _# B8 M: Y2 y) n s DWORD dwOpenFlag;//打开标记
d- {) }9 x6 b& G z4 p MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
% U5 }# G& x& S1 Q, A: K c; y8 W mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型: o% R4 S* Y" L7 i& Y% ^
mciOpenParam.lpstrElementName = strFileName;//打开文件名
" ]; G0 e: s5 i8 k //初始化MCI设备
1 L% M* @0 o2 G5 O6 @4 I( O8 V0 ` dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
) p+ k9 k$ q1 |3 ^5 c if (dwOpenFlag)//初始化失败
( a+ o; q4 ]0 O6 V3 e! ` return dwOpenFlag;//返回错误代码$ c% g9 |3 M1 u9 r/ B+ F
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
% g* b4 Q) J' P) M! N+ n3 U m_bOpen = TRUE;5 E/ [9 w. c' T9 _
dwOpenFlag = 0; F# d+ j! n+ Z
MCI_SET_PARMS mciSetParam;) n9 k6 @ G$ k5 b
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
1 g) M: P8 t p/ C( s //改变时间控制设置: A8 o7 U: G: r& t$ M) b- J
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
) |$ N: y$ n1 @. s* V if (dwOpenFlag)//设置失败& b8 b3 G: A3 ]/ i& b5 X3 c
return dwOpenFlag;//返回错误代码
% l+ v1 b% I& K return 0;
9 k( E; E Y) H}DWORD CMyMCIWave::PlayWave()//播放波形文件
0 o1 e/ H l# N- |{: i5 R* G+ Q* r- I) y
MCI_PLAY_PARMS mciPlayParam;
8 B' t+ [5 t# T% h. ]+ d4 B DWORD dwPlayFlag;2 g' U, s# }* k- j
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据" w: @# {/ L% n' b) |* R- G" h' b8 @
if (dwPlayFlag)//播放失败* H% ~- t/ h* \+ z" K2 ^& j
return dwPlayFlag;//返回错误代码
. c- S0 E' E1 t, ^# ?! U0 I else
' i" n# B) D- |: }# _1 o {
+ I, V( C' _) P( w6 M8 l( {" } m_bPlaying = TRUE;
& X/ }0 C! @( m3 O L4 E return 0;0 [6 p) V `0 o7 J6 s6 J1 M2 a# b
}, T. |8 t2 m, d9 _7 a& h' h" }" P" C
}5 U7 I1 | R ^; Z5 |
void CMyMCIWave::StopWave()//停止播放波形文件- e) s4 m! `& M3 ]# Q& ]) H0 y
{
! G5 R, R6 @+ ] { mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放2 z* X3 e- P; y& V4 Y# ~
}) M7 t( W, x9 y5 P$ l% ~
DWORD CMyMCIWave::RecordWave()
% n8 C8 v% b: S) r{2 ~9 s @3 Y2 c- }9 _: q7 Z% J
if (m_bOpen)//如果有文件打开$ R# |! E. u G* V! s. c1 D
CloseWave();//关闭文件
; V' r2 u S. E( ~- ?2 ] DWORD dwRecordFlag;
4 B- I6 O; [" M MCI_OPEN_PARMS mciOpenParam;# g8 d4 A8 N7 E! Y( L) t3 g6 h
mciOpenParam.lpstrDeviceType = " waveAudio ";* F) l& y2 J* S( e
mciOpenParam.lpstrElementName = NULL;
/ Y& _4 S. T. R! A9 C. l/ J* B' D //初始化MCI设备
( l6 T! G; o' r- R5 @, d% ~- t dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);6 Q8 p8 O; ]: U: v1 O
if (dwRecordFlag)//初始化失败; {& }$ \& [ c5 [4 {
return dwRecordFlag;//返回错误代码# u8 ^8 c L+ _' @
m_wDeviceID = mciOpenParam.wDeviceID;
# e% N3 Y7 z3 l5 |& S2 U1 ~; r MCI_RECORD_PARMS mciRecordParam;
0 h/ ~4 j7 d9 j //开始记录数据
3 i+ |/ p/ S/ h* d* l dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);2 f# ?. @. J* H( y5 }' p& O
if (dwRecordFlag)//记录数据失败" M, a0 ]* w5 g* [* s
return dwRecordFlag;//返回错误代码
7 ^2 I! b* j2 v$ c m_bRecord = TRUE;7 ?1 J3 s8 J& r7 ~4 i, j
m_bOpen = TRUE;/ ?$ p) {' H" w6 e' m
return 0;6 ~- S- m. {# O. W9 W% i
}) C* ]: G5 W* I( j% l- ~, \. \* ~
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件9 a/ Z0 v' E, m' J8 d1 n. y4 d9 L9 P
{. Q" q1 a' f+ d' ^: g7 |( t
if (m_bRecord)//正在录音
' z! q) e) H9 L/ h return 0;//返回: G$ V( z- k7 `4 ^) I0 C/ \
StopWave();//停止录音6 R" b9 U) |* r+ g F! o
MCI_SAVE_PARMS mciSaveParam;
& ^' m) j$ _8 u: q6 t1 y3 u mciSaveParam.lpfilename = strFileName;//设置保存的文件
5 P3 M& h8 g9 Q$ }8 y( x& A //保存WAV数据到文件
- ^1 D. g" t& d* G DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);5 z) C" J8 |+ C% J3 b+ _
if (dwSaveFlag)//保存失败* y& {! A1 H8 N9 G' O
return dwSaveFlag;//返回错误代码
; C1 A6 r/ F0 z6 C6 Q! |9 v m_bRecord = FALSE;
5 i' W# }/ @# t% f R+ a return 0;
) y& {8 {6 b9 R% i7 r}2 v; O! X8 l( g, J4 ^5 [1 H
DWORD CMyMCIWave::CloseWave()% C4 D. L/ g# `
{2 r3 v: ~/ Y# ]! m; U, y' {
if (m_wDeviceID)//有MCI设备在工作 T% F5 R1 B+ e' c) R1 }
{% @! r/ R9 n1 H# O
DWORD dwCloseFlag;
& r" f5 `! F. q# W, K' p mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作8 c$ i: U/ R9 H3 R& K
dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备1 C+ B1 h& @6 K( z. D: a
if (dwCloseFlag)
& V6 _8 N# d. O) W8 h8 |* E {
& @( J4 J6 m3 ?4 d8 i AfxMessageBox("关闭时出现错误");
9 n1 i! h- Z( Y, [2 ] return dwCloseFlag;
2 p1 Q; \$ b3 z3 ? }
9 t; b4 n5 ~2 p/ t1 G5 ~& t" P1 f }. `2 u# B8 V7 @5 ]! G4 X$ q! y
//设置状态变量1 H: O9 _" F8 H1 `4 d) ?
m_bRecord = FALSE;* M: J; U$ f& _/ }3 g) D ?% Z
m_bOpen = FALSE;
5 i3 T. c2 f5 d4 n4 v/ e m_bPlaying = FALSE;# ]: E8 r$ c% a5 e" `9 {1 ]
m_wDeviceID = NULL;* K0 C6 r* G) _6 h0 z
return 0;
) v D2 Y/ \# R# p}8 `" \) {8 i* \! w3 S
DWORD CMyMCIWave::GetSampleRate()//获取采样率% j5 R: M' l0 p! v' _$ H" j
{
% \$ @5 W+ C$ ?, r1 Q' m6 a: C MCI_STATUS_PARMS mciStatusParam;
- `3 T- e% v$ {' G, {# h mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
% e# t! K. C9 w8 Z+ a //MCI设备的状态信息(采样频率)" k; s* u8 }0 K* b0 A, ^! L
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
+ S) J* p2 ], m! T) i if (dwStatusFlag)+ B6 r5 m k) ]% ]
return dwStatusFlag;//返回错误代码0 D) }1 e; P, b& y
else# p' W, h2 l+ t8 [
return mciStatusParam.dwReturn;//返回采样频率" h( Q+ r' |# u( Z% Q$ ?* s. W+ h6 l
}, V' l. Z$ l" }
DWORD CMyMCIWave::GetChannel()//获取声道数7 B! u: W. i; P
{
' t/ `) V4 q/ I1 X$ g0 m5 k$ v MCI_STATUS_PARMS mciStatusParam;
' O2 s$ l0 ~5 w6 Y mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
' y# b/ a: H4 j6 {4 }' J/ I0 G //MCI设备的状态信息(声道数)! R; w h# p# o, U
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);. h1 F) f( l- Q. z
if (dwStatusFlag)9 r/ B, q0 R" R% X; E) X
return dwStatusFlag;
$ }+ d5 t. t: R4 a else
: M; b2 r6 }) W0 L& O$ u return mciStatusParam.dwReturn;//返回声道数
- A, T# i% l% |, n+ E3 H( }4 t/ F}. d5 O8 H( `6 \# q; k/ N+ ~/ K1 k
DWORD CMyMCIWave::GetBitLength()//获取声音位长
- f$ ~+ [+ S$ d6 T7 B{
T+ R1 l8 w2 Y; h; v5 K MCI_STATUS_PARMS mciStatusParam;2 ?, R5 G( O, Q# F% |# n
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
' `2 v6 S( m) c, V8 I6 o- ^6 M //MCI设备的状态信息(声音位长)* o) a2 @( I- N7 L$ i
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 b8 B# Y2 V# E, \
if (dwStatusFlag)
, p \' U; l6 P) N8 C; G return dwStatusFlag;7 P# M/ N( g4 [4 o% q6 \- B
else+ c) ~9 [) ^: X
return mciStatusParam.dwReturn;//返回位长
3 Q, x# ^. Y, d/ w}
% ]/ v2 n" ?. pDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
$ d" k- y [. S$ m% m% m{- z' ^' O! I1 P, J
MCI_STATUS_PARMS mciStatusParam;- V& r0 C* @! \7 X! S) @% x
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
6 a# L# P& Y* n/ `1 h //返回MCI设备的状态信息(音频长度)) T5 U" D6 s/ D0 y% f' [, M; k
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
5 x( t$ P- z$ f$ I if (dwStatusFlag)/ j8 N. B8 O3 M* ^/ E
return dwStatusFlag;; w v' T) T* N& [, i
else! Q9 }9 ~- a7 N: [5 W
return mciStatusParam.dwReturn;//返回音频长度
, p9 w& J- f3 ?} |
|