找回密码
 注册
搜索
查看: 2675|回复: 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.
3 ]; W) W4 I" T" p6 W//. N6 k8 _6 w' k: M! z
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)* [7 ^+ W7 O9 [
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
) n9 I! S( x* x# x9 B#pragma once
' b$ G( ]4 R. S1 X) r#endif // _MSC_VER > 1000+ L: K, d$ }" F  Z$ `3 u
#include <Mmsystem.h>   - f. @8 m9 A9 N' B, [# I; I
#pragma   comment(lib,   "Winmm.lib")   
; d/ M+ u+ A( M$ e5 w" M/ j9 S  D& eclass CMyMCIWave  $ Z8 ]* J  R6 I4 u' Y0 t
{
: n" e7 ^1 ~* |) c' d& vpublic:
# a) H# Z6 f. K9 }5 ~! R. _ CMyMCIWave();//构造函数
& H( T3 |: Y1 X, S- k; ^ virtual ~CMyMCIWave();//析构函数
' W+ a6 y5 J5 `7 j# w% V DWORD OpenWave(CString strFileName);                  //打开文件
# }! ~0 n! I' ~- n& o& W DWORD CloseWave();                  //关闭文件
' J0 {* N+ a9 _+ m  E) D& f/ e DWORD PlayWave();                   //播放% K: b$ a! \( H* }: b! }
void  StopWave();                   //停止播放3 r+ H! I* t# B
DWORD RecordWave();                 //录制
7 N( R3 u  Q' a& [" K) H5 }+ [" o! b DWORD SaveWave(CString strFileName);  //保存
- M5 b- N2 o. k& N DWORD  GetBitLength();          //得到位长
; V( C$ K5 c# {! Q! R6 W DWORD GetSampleRate();          //得到采样率
6 }5 \1 Y' e9 E& x) R& L DWORD  GetChannel();             //得到当前声道
4 a, n! F' \+ z2 K DWORD GetWaveLength();         //得到音频长度4 p2 D  @5 d+ `/ L2 f9 D
public:
  N5 a7 Z6 B4 e7 Q+ { BOOL m_bPlaying;               //是否正在播放
6 C; Z; D+ w3 K" b- i BOOL m_bRecord;                //是否在录音* b; F" k- R" z
BOOL m_bOpen;                 //文件是否打开. ?1 Y; m+ |( i9 U7 W; `* s
WORD m_wDeviceID;            //播放设备ID
! c! u2 Y6 j$ _' Y};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
6 Y, e. p& y/ _  r* I1 N//4 o7 Y, h$ R4 k) D8 n
//////////////////////////////////////////////////////////////////////#include "stdafx.h"* Q" m5 U  z+ H
#include "MCIWavPlay.h"; E5 R1 b& |" J& q$ p2 j9 ]
#include "MyMCIWave.h"#ifdef _DEBUG& T1 Z1 Q4 W/ N0 S  x/ Y
#undef THIS_FILE
$ E1 Q* i( I) N! a- P8 M/ g; Wstatic char THIS_FILE[]=__FILE__;' D& Y# Q6 G* N" V
#define new DEBUG_NEW" Y4 s% E* U$ i/ j7 I
#endif//////////////////////////////////////////////////////////////////////
6 K& n2 T8 h/ j# H  G: @0 u// Construction/Destruction# I' S! S* ^" h$ ^5 L2 f+ \
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
" T, i2 n# z2 {{
2 G! N0 E2 C6 e$ E& L/ l' u" L //进行状态指示变量的初始化0 {3 u( I5 {0 v  ~( B  x
m_bPlaying = FALSE;
/ b8 R- q' L6 [2 `+ P+ F$ a    m_bRecord = FALSE;. z2 H( w1 C3 [1 B9 z0 q4 ^
    m_bOpen = FALSE;3 x( R5 {4 w6 k. T$ C- @
    m_wDeviceID = 0;
0 N# O. _2 g' _" u8 J}CMyMCIWave::~CMyMCIWave()
$ J/ ?7 U  ?! }: e1 o% {; U; o' r0 j{
8 T) M* W: E8 J7 c! J$ ^ CloseWave();//关闭WAV文件
: f1 V2 i8 i, `& x}
; N" G6 U# w$ V7 `) |" C8 lDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件# f. b9 b  W, ?% ~, o! e
{* o; ^) d6 Q% e' v$ y
if (m_bOpen)//如果文件已经打开9 |, [+ S% x8 D, b
{# u3 ]1 D9 s+ M* ]
  CloseWave();//关闭该文件
: h' l% l; V! h0 K+ g& [6 E- y }, I, S. @1 N( W$ A. Q) ?9 c
DWORD dwOpenFlag;//打开标记! G% V2 S8 B5 S& v
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
4 {* G8 D/ D7 A9 `0 f4 B/ V$ o mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
9 |* G5 ?5 n& k  T- q6 u' v mciOpenParam.lpstrElementName = strFileName;//打开文件名
7 B4 q3 T. g& q4 a9 O% \ //初始化MCI设备
* f6 k; H; p8 z dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
4 n4 ~4 A) a* i if (dwOpenFlag)//初始化失败
% b- W0 W- W% G+ }. R: y. T  return dwOpenFlag;//返回错误代码* A) b: r. B5 C& r1 q* V; Y3 L
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID# A" B9 D6 h9 b/ L% P) f  R- R
m_bOpen = TRUE;
2 O4 I2 N/ Q3 B8 Q$ l4 v dwOpenFlag = 0;
1 d9 `" _* ?7 B. f! ^ MCI_SET_PARMS mciSetParam;3 X9 I! a7 ?: q" v
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
, J" o0 j) x8 s& ]+ S4 M  M2 C //改变时间控制设置
: K- k( x, k4 q dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
+ |2 f+ O* w, C& k4 O% b4 L if (dwOpenFlag)//设置失败3 X5 q* D$ H7 ^  {3 ^, Y
  return dwOpenFlag;//返回错误代码  N3 N4 B$ O9 J/ A; e4 M
return 0;% }( H( ~) z$ {8 @( C$ J* L; C
}DWORD CMyMCIWave::PlayWave()//播放波形文件
, L0 {3 B8 h* K+ M! d, b{
8 Y' z! J% D2 p MCI_PLAY_PARMS mciPlayParam;
" p7 x: E  y1 C DWORD dwPlayFlag;
; J. D- F  H% g$ \8 M: g. b3 q dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据- Q8 a8 I% {9 T. `4 {4 g
if (dwPlayFlag)//播放失败
! g9 a5 S! R( i9 U" e# [' E% O3 ?  return dwPlayFlag;//返回错误代码& A$ Q# J% F4 M5 v# \; K  h7 b
else
* H, M' P( u9 ~7 N9 u& a {
7 `, M2 X5 P" z# B2 d" L8 N  m_bPlaying = TRUE;
# A1 }. [0 u* A: l9 k5 O. Y" C9 ~  return 0;
3 [0 o9 `7 ]1 \% d& M }
( }& d* N' T- e4 Q5 g; k. U}
) n0 @; R) z/ Evoid CMyMCIWave::StopWave()//停止播放波形文件
2 w8 }8 J9 h2 z( d( h1 U- z{
+ F6 u. g7 P) U# \ mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
4 H/ z) h, q# C# C2 I) ^2 _}" y! B( z9 @+ E  M2 [
DWORD CMyMCIWave::RecordWave()# o# [) z1 ?0 L& A8 w/ y
{
+ @" c$ V  D1 W9 x if (m_bOpen)//如果有文件打开7 T( ]1 s2 p, r) A
  CloseWave();//关闭文件8 w$ A- Y- T. E8 ^
DWORD dwRecordFlag;3 n2 S9 `( ^; J  E* P% ~. ?
MCI_OPEN_PARMS mciOpenParam;
- T5 y, R2 d) e2 }7 o9 Y mciOpenParam.lpstrDeviceType = " waveAudio ";
1 `. o- f: f0 C mciOpenParam.lpstrElementName = NULL;
2 M: E6 r' l2 n1 i //初始化MCI设备
/ L' b3 |% L; Z6 G! T dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);5 U" ^8 `8 [: R9 {  }' }  o
if (dwRecordFlag)//初始化失败" U( D' K3 |- M% q: |( y4 Q9 x
  return dwRecordFlag;//返回错误代码
! ^: R6 ]* |  D6 }& o m_wDeviceID = mciOpenParam.wDeviceID;
4 n( |- M) {9 `2 i MCI_RECORD_PARMS mciRecordParam;* a" W. V  x" V6 r2 a7 ^$ [
//开始记录数据
0 \9 I3 d" m4 k0 ?& C dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
' U5 ^1 I* s& w) M5 a  P if (dwRecordFlag)//记录数据失败0 h! d* Q, B* T% k( x* ^
  return dwRecordFlag;//返回错误代码4 u# R; |8 ~, L# d/ |
m_bRecord = TRUE;/ g* q; T* P* h% I' i$ `* U9 F
m_bOpen = TRUE;9 q6 L8 q# v, N' e4 k- y
return 0;9 Q- d! e" f5 o9 K: Z& k
}
2 V- t% E$ l4 ?DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
3 ]- ^5 M8 S+ V, H- S! @{- g+ q% f, T5 U2 O6 }/ Z
    if (m_bRecord)//正在录音
1 `( E9 k) W  _% J8 E: F! A( ]        return 0;//返回+ V; O3 g/ Z3 T* L3 J, I( f' z
StopWave();//停止录音2 N% C9 d0 N1 N* @1 t
MCI_SAVE_PARMS mciSaveParam;
3 o/ B# o" l$ I" {" ] mciSaveParam.lpfilename = strFileName;//设置保存的文件5 H- i8 e# X5 j: U. p' @
//保存WAV数据到文件
, [3 H$ l3 ?+ A* E DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);7 V, S, \7 p7 T5 |2 [
if (dwSaveFlag)//保存失败) i6 U  u' C' e, \' h) e* Z) a# ]
  return dwSaveFlag;//返回错误代码) z3 d7 p& O* ?
m_bRecord = FALSE;
3 W- [% G5 z( x return 0;- P4 b2 k; z  c1 n
}
/ B+ o0 s' R" O0 xDWORD CMyMCIWave::CloseWave()
6 u. B' p- C8 G/ t- ^{
/ ~* Y3 A4 x0 X5 y& A0 i6 P% @ if (m_wDeviceID)//有MCI设备在工作" h" a, O5 n  T2 Q
{; G  F5 o  j. m6 `/ h* Y0 A  ~
  DWORD dwCloseFlag;
4 K5 r4 j! {. R6 B$ \% ^  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
, @0 [' P  d2 z) t, e  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备5 d- h2 L) x$ V" f0 A/ k% b
  if (dwCloseFlag)4 ]% G+ m( |/ S: ?; O& N1 b
  {! Y* _- D3 _. S) M
   AfxMessageBox("关闭时出现错误");
' R% c# G- l- g: x/ I( o   return dwCloseFlag;5 b9 c, @2 E7 M% g2 R0 b. [7 q
  }
/ F! S8 L$ r0 ` }
. G% w% L2 E+ l( T7 [& s# _) }$ R //设置状态变量
2 m3 n2 U( C0 r# w' d m_bRecord = FALSE;
5 x/ V" M; _% y$ N* e m_bOpen = FALSE;$ \% Q+ q  _+ y2 a) h+ q, e
m_bPlaying = FALSE;  c8 m5 e7 N3 Y  U. @& y2 F% c
m_wDeviceID = NULL;
+ ^' B, y7 Q; e: `, a3 T return 0;+ k0 ?+ e7 d/ P1 A% O" F( C
}
  m$ J1 |/ H7 Y  q" u, kDWORD CMyMCIWave::GetSampleRate()//获取采样率
1 g$ I4 w+ i, s' C* `{
: H, x" M9 c$ C: d MCI_STATUS_PARMS mciStatusParam;
, X- A2 A  l% j mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
; c! p% v; J" T //MCI设备的状态信息(采样频率)8 }( b8 G9 ^' H& O
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);: t, E: ]$ q) n0 y+ g
if (dwStatusFlag)
! U1 s, w/ S* K- i  return dwStatusFlag;//返回错误代码) J0 b: E' }! v: {* n  ^) Q
else$ I# B; m% x4 r% r6 Q: M6 q
  return mciStatusParam.dwReturn;//返回采样频率
! o# ^0 D& ]  v1 m9 W}
7 o& M) e" b! x3 Z8 B! L/ q! zDWORD CMyMCIWave::GetChannel()//获取声道数
% o0 ~3 W7 u$ T, W{" {2 K: y; ]8 M( A5 E% m
MCI_STATUS_PARMS mciStatusParam;0 Q$ k) N7 T9 Q7 @
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
: \# g8 h' D6 B7 P/ I5 c9 b$ I //MCI设备的状态信息(声道数), ?5 y, S: @4 j( D% ~$ @) r' I
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 ]( o: E% f) X" |( u/ z; o
if (dwStatusFlag)  b% O% }3 T# L
  return dwStatusFlag;6 Z( ]7 d9 `" ^3 L8 y
else
. \' C# ~; K7 N& k# C- w( \, L; x. P% s  return mciStatusParam.dwReturn;//返回声道数( `6 v' d7 i3 a$ Q$ h5 @3 G' I) D# F" n
}8 y$ t. i+ E" c: \- _5 I5 H# v$ G1 ?
DWORD CMyMCIWave::GetBitLength()//获取声音位长2 W- p- Y7 }( r# g4 ~& e! v% c, ~" N
{
. @  y$ O+ m4 T# [( M; m MCI_STATUS_PARMS mciStatusParam;
7 W3 E# ]6 H" f/ `9 q mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
+ F: z; b! _% h# v) m4 ] //MCI设备的状态信息(声音位长)
6 s4 e, X; H3 q. P0 S+ A9 W DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
# |0 j8 z  N* X5 i9 i; }# u if (dwStatusFlag)
+ G6 c2 c  b2 t  return dwStatusFlag;
# K9 h6 E; O1 `1 f( L) ~ else; ]1 U* C, l5 a! H3 A7 m
  return mciStatusParam.dwReturn;//返回位长
9 E7 i" `4 L% J1 |/ K. ~2 D8 O1 r}. a' @: ^7 y6 _2 k
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长9 n7 C1 |: d; B) e3 V0 y7 }
{
0 N7 N: w# k3 B8 { MCI_STATUS_PARMS mciStatusParam;& t; ]6 B: g/ C
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度+ g: p. \; S! \8 ~0 C' \
//返回MCI设备的状态信息(音频长度)
, D) G, B9 f6 \  f' r" N4 U DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
6 h2 C1 b" j5 P# L( r, F if (dwStatusFlag)
/ m  ^3 o7 R$ W4 a% }' w+ P$ G  return dwStatusFlag;" @' t8 Q# k  }! {' L
else
& J* K. H$ _' P  return mciStatusParam.dwReturn;//返回音频长度) O9 O+ D3 s9 I% A
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 08:58 , Processed in 0.034044 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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