找回密码
 注册
搜索
查看: 2742|回复: 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.
% L# K# ]& r8 K3 x//
$ ~9 z5 j' m: J- o% |2 }* ]//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
. t6 L9 a. z( T) A: m; ?#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
$ {) P/ L. G, Z0 K3 G#pragma once. ^. N3 e2 c- j
#endif // _MSC_VER > 1000
$ {& w3 K* G3 u8 p#include <Mmsystem.h>   
: f! e% N0 r; e#pragma   comment(lib,   "Winmm.lib")   1 ^5 X5 k# S$ v0 |
class CMyMCIWave  % L) A! Q" U+ K8 m" `
{
4 X) B  N5 x: ^- m0 Tpublic:: u& f( U: c, r0 I
CMyMCIWave();//构造函数# H; z( o5 X2 l5 O; p" C3 F
virtual ~CMyMCIWave();//析构函数
; W. j' _3 g9 g3 w8 X3 D5 _- v( E DWORD OpenWave(CString strFileName);                  //打开文件
* J7 B, a' H( y/ S  J DWORD CloseWave();                  //关闭文件% B% o. i1 Q: u& Q  ~
DWORD PlayWave();                   //播放! ]4 a5 r. r& \4 x$ Z* h1 Z# p
void  StopWave();                   //停止播放
* O5 Y' s) n' l, u DWORD RecordWave();                 //录制8 y  C# m. t. Q2 a7 J
DWORD SaveWave(CString strFileName);  //保存# t& B0 G, N7 W+ ]5 v$ A$ C1 A& M
DWORD  GetBitLength();          //得到位长& f3 S5 ?2 W" d( F0 h0 F& |" P
DWORD GetSampleRate();          //得到采样率
6 I3 n7 {- T& }; J DWORD  GetChannel();             //得到当前声道
. s- t. P1 H8 R4 j- q, K+ f) a7 Q* p DWORD GetWaveLength();         //得到音频长度
- z8 J. h" e4 T$ }( c( Ypublic:
7 H! ]) I( U, u. e4 g+ {, G2 O BOOL m_bPlaying;               //是否正在播放
6 W% I0 `! C5 [7 R$ `; ^ BOOL m_bRecord;                //是否在录音% |6 S. G' Z  ?7 i1 s6 o
BOOL m_bOpen;                 //文件是否打开8 c! ^, [. z  A# j9 Y# U- [+ ?
WORD m_wDeviceID;            //播放设备ID8 t, f! {, |) ?" R  S5 l- G4 @
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
; O  B4 o: v0 F/ q7 L. V/// ]1 Q( v! s* Y2 H# n% M# H
//////////////////////////////////////////////////////////////////////#include "stdafx.h"0 V  G9 t, a, L3 ?9 ~
#include "MCIWavPlay.h", p' j6 P  X; g9 e' H1 y
#include "MyMCIWave.h"#ifdef _DEBUG! o& ]  P6 H( }$ s; T% w6 r
#undef THIS_FILE9 o6 q9 T4 X1 m9 a0 ~  }
static char THIS_FILE[]=__FILE__;2 D5 w2 Z' [6 H# P3 _5 L
#define new DEBUG_NEW; x1 \. w% v" w+ q2 V+ ]: P9 J& R
#endif//////////////////////////////////////////////////////////////////////
2 e0 x* `7 x3 M" z) j( U, g// Construction/Destruction
  ?+ U6 B7 l* e2 t9 Z% _//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()2 N* G' ]% X1 C% N+ B7 M
{  G% n# J' q0 U' b' d
//进行状态指示变量的初始化
) f% q6 f: w- s. w' r, J" h8 o) g m_bPlaying = FALSE;. W3 `0 A) a6 i! J5 o: O9 A6 b
    m_bRecord = FALSE;
, g% G6 x! L! C, @' g    m_bOpen = FALSE;
1 F6 u" s9 U% W+ u0 Y5 j9 x    m_wDeviceID = 0;
! B9 ^, a3 G+ R; j$ G1 L}CMyMCIWave::~CMyMCIWave(); h4 S8 {, a2 a) B3 L
{
# X0 A. e- E* O8 T4 B5 r CloseWave();//关闭WAV文件: ?" r% b* I( x/ ?% m) C
}
/ c5 N+ Z1 E, K' F1 s2 O5 iDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
% }0 U9 `6 s/ @{
- t' v  @) Q* J* A if (m_bOpen)//如果文件已经打开
4 V8 W; g8 q. ]1 z6 Z% A( x {! l% k  K/ H! k0 A% s
  CloseWave();//关闭该文件  Z% V: O5 W( F9 \
}
1 `2 W  u  [3 K DWORD dwOpenFlag;//打开标记- b* l2 e; A) M8 Y: `6 N; z, T$ x
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构* ^, Q' v: `8 r! d) P3 P2 N
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
! ]  _* H# N1 ^0 b9 I mciOpenParam.lpstrElementName = strFileName;//打开文件名
% m3 r; W0 Q8 ?1 t- y- F+ k //初始化MCI设备' n5 N( k( F' V. L
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
0 y2 L' l( L& E6 v if (dwOpenFlag)//初始化失败
9 O8 r5 ]! _' \+ \  return dwOpenFlag;//返回错误代码
. i& Q4 l8 L& Y m_wDeviceID = mciOpenParam.wDeviceID;//设备ID: v/ A1 V! ^& ]8 L6 I; O; c
m_bOpen = TRUE;
* d* G3 D$ _! y+ @  A  M* L) D dwOpenFlag = 0;  J) I+ c* Z2 b( W/ b& n! Y
MCI_SET_PARMS mciSetParam;
# M7 N' o2 v3 ^0 N! _ mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
0 i4 m9 B  q4 C, x //改变时间控制设置) d! I4 k% b( n
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);3 J% n+ J6 D" M% F9 Q
if (dwOpenFlag)//设置失败- @0 Y" [" d& T  W5 a- H
  return dwOpenFlag;//返回错误代码
8 L) S' r4 x1 T! @* |% ^5 d; f0 o0 { return 0;; E) l% _. o+ Y- R
}DWORD CMyMCIWave::PlayWave()//播放波形文件% J4 c( F# Q9 K# V  X, u
{- a: O- m+ @& V' c
MCI_PLAY_PARMS mciPlayParam;& H' L/ H+ ^9 e1 U0 }; n
DWORD dwPlayFlag;
( X; l; X) A( E* P dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
& O! K) a( p8 _: ~  O% c if (dwPlayFlag)//播放失败2 p0 u# J  C8 `' |( _$ W- Q# F3 |; L
  return dwPlayFlag;//返回错误代码3 K" d5 D; X$ }- H2 R( B) j* J
else2 G# q3 u. `6 ^0 p/ p# r
{0 a+ A8 [( f7 F3 E' n. T
  m_bPlaying = TRUE;  ]- |. o( D" y0 k3 D; a( ^/ J6 G
  return 0;) G' e$ q! |, V# g
}$ x7 j% x5 ^* g8 D8 e
}
( t* }  z4 {- s, d( K" m( Qvoid CMyMCIWave::StopWave()//停止播放波形文件1 A/ X! U0 J6 j! O& h
{( V7 [: q5 P- _1 T, j7 L6 I
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放4 B# P+ Z8 c2 M( H3 n
}( u- H: L; w' g# Q# f
DWORD CMyMCIWave::RecordWave()
0 W  e4 R. h7 E* d) x{. t% d) X$ n& l' U
if (m_bOpen)//如果有文件打开4 o' q3 D( u& V! j
  CloseWave();//关闭文件
. v$ n4 g! B+ ~ DWORD dwRecordFlag;
3 s. }! B- \  r" J2 `% H- x$ D" Y MCI_OPEN_PARMS mciOpenParam;
" ~3 W! B4 [. O: q9 g mciOpenParam.lpstrDeviceType = " waveAudio ";" Q7 H/ ~" T, |
mciOpenParam.lpstrElementName = NULL;
5 B; n8 k4 C: }8 a" ]* \  {* E //初始化MCI设备6 [; s4 J. H! v# i7 h0 x
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);4 ]- s9 G5 z$ c6 a! i) m
if (dwRecordFlag)//初始化失败- d8 j4 r6 s  X9 R" p
  return dwRecordFlag;//返回错误代码
$ Z+ E* c- D" |1 R( v3 y# A! q m_wDeviceID = mciOpenParam.wDeviceID;
. u3 V$ M" f! }3 P MCI_RECORD_PARMS mciRecordParam;
5 n8 ~6 P5 d! E# i/ m, l //开始记录数据
/ h% I% N+ w% _' _ dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
$ J5 q6 @) W6 N( x  N if (dwRecordFlag)//记录数据失败$ k# u& Z0 N$ }3 H; H- p
  return dwRecordFlag;//返回错误代码! R( A7 B) z) `. j8 g& m- `
m_bRecord = TRUE;( _6 ^2 t5 t5 g
m_bOpen = TRUE;1 G' B  G: k5 Z) c
return 0;
/ E6 G  y6 v3 Z( a4 X. I, z, D}
! o3 d/ H* X/ ZDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
* u& v2 l$ X/ L$ t+ {4 _2 s{9 x. T4 p) k, d: ^! |5 Y/ U' h
    if (m_bRecord)//正在录音
/ l9 e. N- z. Q1 r7 o2 S) g        return 0;//返回  X2 Z6 V) X9 T
StopWave();//停止录音8 b9 P- s9 m. P" A
MCI_SAVE_PARMS mciSaveParam;; p4 y/ c8 l- b
mciSaveParam.lpfilename = strFileName;//设置保存的文件
" A/ u' Z. I+ Q  d' z( |! U //保存WAV数据到文件
8 o! w7 O" ^$ r( J- h DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
8 a) s: ]+ X9 t' a" M/ K* ^1 f if (dwSaveFlag)//保存失败
8 z. Y- E5 K* B. e8 ?8 l  return dwSaveFlag;//返回错误代码* Q4 y+ [* m" \: u/ C& U
m_bRecord = FALSE;* A, n/ }% J) ~
return 0;% Y4 v. U) i% z9 |7 u: H
}2 j  ], o' @; Y% x8 v# g( @, @
DWORD CMyMCIWave::CloseWave()5 Q: l/ c* U! {- S$ d8 \  Q* @+ [
{
5 A' D# z+ k5 N% O if (m_wDeviceID)//有MCI设备在工作
, Y, S4 z: d6 [* `$ O) B; w/ V {
9 H* B6 `% o3 a, X! y) i0 b  DWORD dwCloseFlag;
* ]' v0 O' }  H: N- J# G1 L! [  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
* e- _- j: D: v2 N  O" W: S" M3 i  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
) J5 f3 c6 v+ d& A0 L$ W  if (dwCloseFlag), F& s) V# _: Q! O' w% z6 z: @
  {
; A4 \2 h# O) V1 K. E" M: R5 A' W/ t   AfxMessageBox("关闭时出现错误");
; ~. Z4 q& H0 O7 b; ]: C   return dwCloseFlag;
, T, h# I) W/ Q" r0 u  }
% Y" t& }6 r$ N: Z }, `) T; E6 t* M) [+ S2 Q' p
//设置状态变量- o9 V" r% F+ {
m_bRecord = FALSE;9 ^" U8 ~. |7 b/ D6 h
m_bOpen = FALSE;
; }3 B+ {" |# z' ]$ {( | m_bPlaying = FALSE;
: n7 }$ G9 ?& k; {# Y, ? m_wDeviceID = NULL;! B9 G4 x" T6 c5 B7 k
return 0;
1 \/ i  I$ |4 P7 O+ g}7 c( g) O1 a+ O5 N
DWORD CMyMCIWave::GetSampleRate()//获取采样率
* {, P8 a( H  g{: o4 ~* f' `  c$ e
MCI_STATUS_PARMS mciStatusParam;2 ]0 Y8 F8 [8 ?, b
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
! h7 Q& B0 B9 [5 T  o //MCI设备的状态信息(采样频率)
* O! k; N8 Y! b" t DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);3 E( q9 L8 E+ V  J+ M' t' B: L" o
if (dwStatusFlag)+ t, p' h. _7 d. [4 x4 e/ j. c
  return dwStatusFlag;//返回错误代码9 j; i! b7 I  R' n
else1 ]* F% T( \  p; H7 n" J
  return mciStatusParam.dwReturn;//返回采样频率7 h4 ?- |& }% s; b' h( ?' J
}
7 F0 t) f$ s+ w; }6 YDWORD CMyMCIWave::GetChannel()//获取声道数
& ~) f- p3 ]6 ]$ \! |5 e& b( J{$ g1 y: q1 |7 i2 A+ x7 v, k& E
MCI_STATUS_PARMS mciStatusParam;
9 E# Q7 W- U* M0 z  R mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
, @7 a3 `% r' I' v7 u; v3 e3 |/ Q' j //MCI设备的状态信息(声道数)4 ~) P* y; S/ ]
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
' G, b. X0 d5 f( R7 S2 o( _ if (dwStatusFlag)
7 g; ^% W; ?& _* ?# D7 v  return dwStatusFlag;
; }7 P0 [& l3 h% f else7 ]! h* n6 g+ C
  return mciStatusParam.dwReturn;//返回声道数
$ \4 g& w$ K6 D# c/ \}
) @5 Q9 u5 B' l) Y/ T$ \DWORD CMyMCIWave::GetBitLength()//获取声音位长
" D  s0 `8 P$ Z. Q9 B{3 s" F; _7 R/ Y" Y
MCI_STATUS_PARMS mciStatusParam;
, [: h9 Y: e5 w' h5 X& `# G mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
3 Y& B  r$ q. `8 t! N //MCI设备的状态信息(声音位长)2 W2 e4 V3 ~8 }: {8 I, s) H' P
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);' @% |2 B# g8 ?, h  ^% w. ~
if (dwStatusFlag)( w* O! n0 \5 Q0 W
  return dwStatusFlag;6 v5 A1 |; u( B3 d+ u. I; {
else( s( r- u. e8 i# N) k/ q' U' R
  return mciStatusParam.dwReturn;//返回位长2 z4 O& s3 G: S( }
}* M1 N& M2 _" ~
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长8 g% L1 R1 d$ V! q' [2 Z
{
+ Q! G! O6 j8 y9 m! X MCI_STATUS_PARMS mciStatusParam;4 [; Y; p4 b, M7 G( G0 h
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度; p, ^6 f3 Y% R
//返回MCI设备的状态信息(音频长度)1 Q2 P+ \1 K& p) N
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);  W0 z6 e* C! Q. k! Y4 J8 S
if (dwStatusFlag)
$ T) m+ `0 R; r6 b5 E: C* y: U  return dwStatusFlag;# n- r" L& ~( x* r$ x* W  q
else
8 M& T: _, D* P% Z- b/ P/ x  v* H  return mciStatusParam.dwReturn;//返回音频长度
, {7 w+ P. J' R/ N* y# p}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 14:39 , Processed in 0.018643 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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