找回密码
 注册
搜索
查看: 2826|回复: 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.7 I4 u) J2 f3 p! K" O2 h8 U
//
& L+ }. t* ]. {1 D; b2 M//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
% v9 T) d! B0 Z- O# J: @8 I#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10007 l8 ~; P( h8 O8 L
#pragma once3 Y3 V- f! v% f6 @# b- p1 O8 L7 s: l
#endif // _MSC_VER > 1000
" m; [+ ?6 [2 D. Q2 e$ Q6 w, d#include <Mmsystem.h>   
0 S# Y' w% o% ^, s2 {#pragma   comment(lib,   "Winmm.lib")   8 Z+ C' N8 L$ P3 |0 {- Z
class CMyMCIWave  9 p- M5 ~, @! A/ ]
{
3 H4 M# K4 e) ^( Y- Ppublic:1 h. x1 x  l/ g2 H
CMyMCIWave();//构造函数# }: d1 V& A! P. `( k
virtual ~CMyMCIWave();//析构函数
) Y! c3 q# b& }7 H, L DWORD OpenWave(CString strFileName);                  //打开文件, r5 y+ ^7 O) c% p6 F( p
DWORD CloseWave();                  //关闭文件
9 u6 l5 r) X+ c DWORD PlayWave();                   //播放
: `4 P, v. R- N) a2 i! Q void  StopWave();                   //停止播放
: q6 n0 P$ |" X5 I$ y) P" s' f  z1 H$ ^ DWORD RecordWave();                 //录制5 J7 g6 Y; w0 q# p$ k- K
DWORD SaveWave(CString strFileName);  //保存$ n6 K' ?4 G/ R+ o
DWORD  GetBitLength();          //得到位长" [+ T) Q3 |. t4 c7 d. g
DWORD GetSampleRate();          //得到采样率
( t( t, q6 t: K& ?6 Q" A+ K DWORD  GetChannel();             //得到当前声道; u$ W2 H4 Y0 }& H- a
DWORD GetWaveLength();         //得到音频长度; g8 z+ p. ]# N6 W/ y* M! p: S
public:
1 Y  l$ b) r( y3 }/ C* R BOOL m_bPlaying;               //是否正在播放
5 _7 W0 W# t, ~! B( J8 G  G BOOL m_bRecord;                //是否在录音% r* d( i; z9 m9 D% J0 I
BOOL m_bOpen;                 //文件是否打开- n% u! }( Q9 z4 h$ b" R
WORD m_wDeviceID;            //播放设备ID( B8 d+ r' B( ^0 e1 E
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
* b2 F# \& z( Z. _//
; [" b, _& t8 f9 B! K//////////////////////////////////////////////////////////////////////#include "stdafx.h"
; y  h# z; h  T7 e( s, ]. P. x#include "MCIWavPlay.h"$ a% D, ~7 a. l8 B+ z$ z. G7 w
#include "MyMCIWave.h"#ifdef _DEBUG
0 S5 f# x- I8 I. s+ Z+ ^- _#undef THIS_FILE  u5 m8 Y. C* o6 c3 ^' E
static char THIS_FILE[]=__FILE__;5 u' R8 m4 h; M- V$ [6 h3 D9 r
#define new DEBUG_NEW( u5 ^) z: a7 p7 N
#endif//////////////////////////////////////////////////////////////////////
2 B' f$ A0 L; }3 H& _- w// Construction/Destruction# l" I- R( G* t1 e' j, [
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()" C/ d) E! U, X
{# W+ V0 W1 b7 G( J# N+ h' P
//进行状态指示变量的初始化
* N. K  Z( D. P m_bPlaying = FALSE;1 s- \8 t: n: B; C& y5 o: ^' i) d
    m_bRecord = FALSE;
" F6 p' R( W, x9 X    m_bOpen = FALSE;" I  x( ~& W* S3 A' G6 d
    m_wDeviceID = 0;# M+ X0 u$ [! S0 L
}CMyMCIWave::~CMyMCIWave()
; n( U, ?9 S. z' k* }{
7 t: v  Z, ~. r3 e CloseWave();//关闭WAV文件7 Y1 A" P$ m8 R
}+ z- ]) T/ ?. Y- E2 r: I4 k
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件2 s/ }* i$ p' b" P: Y# w3 `
{$ V- Q, v/ a4 ~( V
if (m_bOpen)//如果文件已经打开
! s. G& x% r: O) C {
+ [+ C0 C6 s& P  z% S  CloseWave();//关闭该文件
' f) e. T1 [6 ?7 [* u }
1 ~) r! ~; l% r8 _ DWORD dwOpenFlag;//打开标记/ |) w& g7 O3 Z- y, R
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
1 w. C/ e6 E. r. B mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型* g/ \% h  w% m& D- z
mciOpenParam.lpstrElementName = strFileName;//打开文件名
9 P) p  b+ z+ ~2 p9 ]6 S8 A: W //初始化MCI设备
+ l' `, ]1 P- X( I dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
3 l# Q5 [0 H& O if (dwOpenFlag)//初始化失败+ `9 U  h' F' s
  return dwOpenFlag;//返回错误代码6 B$ m) G+ h% h: {! l, y
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID6 }5 Q2 Y- k0 R; Y' I7 a
m_bOpen = TRUE;
2 e4 Z# C4 i4 m dwOpenFlag = 0;' M( Y  H! g8 K
MCI_SET_PARMS mciSetParam;
8 ]3 v6 R" P# H  E1 b mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒3 L! H( Y# P/ P: a" E
//改变时间控制设置
: o& l2 k3 K" Y: q dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);$ S, z: Q1 ^, o9 O' v, M
if (dwOpenFlag)//设置失败
0 W% L/ a! H; c) r2 }+ }  return dwOpenFlag;//返回错误代码
9 Y# Y  H5 W# } return 0;
5 Y3 m+ F8 r0 ^; [9 E: r5 O}DWORD CMyMCIWave::PlayWave()//播放波形文件
7 k7 u' r3 J6 |' d{
) {3 X; Y+ v& i+ R6 _! N& p6 [ MCI_PLAY_PARMS mciPlayParam;9 j- I2 Q$ b, k( M* I) b- ^
DWORD dwPlayFlag;1 X1 ^2 s1 I& H, F* m. R, h$ A# V
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据+ y% @' b' C3 b( k
if (dwPlayFlag)//播放失败
' M9 C. ^4 L5 H& A' E5 B4 v, U  return dwPlayFlag;//返回错误代码6 T9 ~  j. Q% q" z/ V2 C( t, r
else- E* o3 a% D/ f" w+ F7 I
{
: Y8 L8 ]' N7 j, ^! M3 E  m_bPlaying = TRUE;6 N: t2 a' F- d
  return 0;
& x3 q: u! [3 D }7 N( }+ ~. l, p( s+ ~4 g. c
}7 Y0 ?6 K1 f* ^4 G" G
void CMyMCIWave::StopWave()//停止播放波形文件  \' l6 W- |3 ]/ r4 t, d  |
{
+ F) ^5 h1 l9 O mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放, K5 y' I) R- a
}
( l9 @3 i* G6 L( X1 BDWORD CMyMCIWave::RecordWave()
) P$ d9 D6 X/ p6 o4 ~, ^- }& o0 ^{: K. w9 Y  k* t6 X9 O
if (m_bOpen)//如果有文件打开
5 k4 R0 B% M2 o! ^% a  CloseWave();//关闭文件
$ Z; T6 a/ Q. q8 w8 r; ~ DWORD dwRecordFlag;9 d3 W4 g8 h! y7 |2 Q3 P6 l$ y
MCI_OPEN_PARMS mciOpenParam;9 s) _: H2 Z) A$ N! o7 y
mciOpenParam.lpstrDeviceType = " waveAudio ";1 j& W. G! k$ i5 O2 U5 j
mciOpenParam.lpstrElementName = NULL;
( z/ P- x, _" \- c //初始化MCI设备3 n1 c2 [9 G6 t5 P, G
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);; |! W! d+ [; L' i
if (dwRecordFlag)//初始化失败0 V3 a" Z% W  T
  return dwRecordFlag;//返回错误代码( d6 i9 L) R( c; e% D( r8 |! z
m_wDeviceID = mciOpenParam.wDeviceID;+ p$ z* \: P5 X9 e' o* B- W
MCI_RECORD_PARMS mciRecordParam;
' ]: n& K2 ]  y1 O; d //开始记录数据  U$ E- t% E! X. V( X. b6 h, a
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
  O* g1 }; j0 L) U; T if (dwRecordFlag)//记录数据失败, j. l! w: |$ E9 A  g0 J
  return dwRecordFlag;//返回错误代码
* H+ l/ e- X6 u& D; G  O: i/ N m_bRecord = TRUE;
. p( a$ r) G4 n+ R8 r7 B m_bOpen = TRUE;. c% ?2 N3 w% N+ k  u& b: |
return 0;$ m" x8 ^9 F* w1 R5 ]& a
}9 m3 w, a* j# `7 Q0 I
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件# G7 `# `( T( i; j; f
{
1 @0 J+ b+ ~9 p1 p  T    if (m_bRecord)//正在录音3 [  h3 y4 \( p- ~; J
        return 0;//返回
. }- b* F2 d1 u" P4 y. L% E! S StopWave();//停止录音0 w  @- U. W3 D* ?. d& m. T
MCI_SAVE_PARMS mciSaveParam;; X: ~8 m2 i/ [
mciSaveParam.lpfilename = strFileName;//设置保存的文件
7 C9 a  `+ C4 g0 f# e) x //保存WAV数据到文件7 I' h6 L% x* O3 ?. v5 F. j
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);( n" I1 Y2 x& e8 g3 D7 o0 x/ X
if (dwSaveFlag)//保存失败# S+ y  a% f( Z" R
  return dwSaveFlag;//返回错误代码% t5 c# z2 ~4 t. h3 m5 K; ]# h
m_bRecord = FALSE;
$ w. |( B8 j! q9 z; l3 T0 z return 0;2 w! k2 N& T. O
}
- G8 G* O2 [' ^; R# NDWORD CMyMCIWave::CloseWave()
) o4 m1 R8 X6 r1 N4 c7 Z( ^% F9 H  f, ]{
, H" X% j$ q$ K' A if (m_wDeviceID)//有MCI设备在工作+ j* }7 s% X* t# \5 d3 E
{
0 L( V5 t" f  v- y# k9 }  DWORD dwCloseFlag;
- p) K7 E" f+ i  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作5 X) |9 ?& h. n5 m) G8 x6 }
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备. G, L" ?  j+ Q. _
  if (dwCloseFlag)
/ }8 W2 d: h" V+ Y: x: M  {" R& m* }7 T9 I2 [! Y
   AfxMessageBox("关闭时出现错误");
4 B/ i% R& A0 ]6 p% b9 D   return dwCloseFlag;
" {. O$ B* o6 x  }4 |& w( S" a! H1 `0 b5 T8 H1 c
}
! W6 o  M9 L8 s& ^) d7 _$ C //设置状态变量1 M# X$ Z" V9 n, y
m_bRecord = FALSE;) p. [) n+ ^. `
m_bOpen = FALSE;$ X1 V9 Z' f! K$ R" x5 L2 I
m_bPlaying = FALSE;% p8 \& L5 I8 c9 y2 E
m_wDeviceID = NULL;+ ~2 s# p0 @  O$ y+ A
return 0;
* b# y* r9 _2 t; m& ]}
$ o- k7 H# ^6 i1 H- P) T, G% @( xDWORD CMyMCIWave::GetSampleRate()//获取采样率
: V! G. ]' ^0 f) T: c" l{4 W0 D" U0 u1 M) |0 Z8 x
MCI_STATUS_PARMS mciStatusParam;) `4 _% [6 k" y* `. [
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
- l. v, V& r3 F& h; O* b9 `6 G4 i, S //MCI设备的状态信息(采样频率)
. m) F) @' J/ Z3 b% N DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);& j4 C4 `- f! f6 O# n4 D  [
if (dwStatusFlag)
: x+ O7 o+ O6 l2 y  return dwStatusFlag;//返回错误代码- \7 v2 n9 v. Y0 \; ]. R
else) O" }1 W0 I0 g: x, X( ~
  return mciStatusParam.dwReturn;//返回采样频率
# \0 }) u! s) l% R}
0 l, m$ t9 W! S6 v5 i1 g: _3 T4 XDWORD CMyMCIWave::GetChannel()//获取声道数% ?* J) w7 c5 b0 _2 p* O$ Y4 T
{: p* z7 }" S6 |! j5 U
MCI_STATUS_PARMS mciStatusParam;
& K9 L' q, u& \0 M: v mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
3 a  |  f9 `2 p //MCI设备的状态信息(声道数)+ r, O9 G  y( |% a4 C! K
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);" S  j% R' f. L5 k
if (dwStatusFlag)
% }2 s6 i' o4 @4 j+ u  return dwStatusFlag;
% d9 z# B8 h$ O# K2 e else
& I( p# u! a$ W7 n, ~  H8 P7 [  return mciStatusParam.dwReturn;//返回声道数. P, i- f- ~4 d+ i
}3 y( z6 e+ {! x; Q7 _
DWORD CMyMCIWave::GetBitLength()//获取声音位长
" b7 Z$ m3 h# \4 }{
- r, d; w  \- x4 e MCI_STATUS_PARMS mciStatusParam;7 W* c. @: I  s# @4 D) C7 @/ T9 I: J, V
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
" E. d" B$ X! {8 z! c9 K  Y* Q: ], }, g //MCI设备的状态信息(声音位长)
7 p7 _  p5 ~2 J8 |. U+ B1 { DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);/ F2 ]# C, X1 i: @% p5 H
if (dwStatusFlag)
6 h, l% b5 l8 B; s" p  return dwStatusFlag;) n1 _5 W4 [$ K# B' q
else/ q# Q' Y) u  l8 g  T3 n
  return mciStatusParam.dwReturn;//返回位长$ z. K0 X4 I- Z$ ^, d7 H1 B1 F
}3 X- N6 L4 a. D/ ~( p5 T
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长3 b( _0 `  S! k
{# D2 O$ m2 R( ]
MCI_STATUS_PARMS mciStatusParam;: m/ Q% j* V7 m, L
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度; x: d0 w2 L$ ?/ }4 @0 S8 e* |
//返回MCI设备的状态信息(音频长度)$ C! f$ E( d0 b
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);; Q9 J: i- J8 ]6 z9 r' {; A
if (dwStatusFlag)$ ?2 e. T: b/ M! [& _$ T" P1 \7 W
  return dwStatusFlag;( _$ A8 s' ^* c
else7 P4 M1 [3 k6 B. G( C
  return mciStatusParam.dwReturn;//返回音频长度
0 G5 c  x% T- _# |" l% \}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 17:41 , Processed in 0.020093 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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