找回密码
 注册
搜索
查看: 3168|回复: 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.* F+ D9 y6 q  _9 g/ T4 J
//1 v$ R, p# q& x) a/ I
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
  H& G/ ]* A4 N/ w- J+ V#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
! S+ n, M  R; h#pragma once
% T) G6 U2 U  b, Q: K! ?#endif // _MSC_VER > 1000: E7 g' x) K! T$ _4 \
#include <Mmsystem.h>   - P0 I# C3 Z0 U* v/ [2 H
#pragma   comment(lib,   "Winmm.lib")   
# m; F# [4 f& t2 B8 ]. O: O8 ?: Tclass CMyMCIWave  7 \* L- v+ B" T: w: _# q# F( G
{
! B0 r/ j! |0 L0 npublic:
% K) O- m5 T! r- c' A) _ CMyMCIWave();//构造函数: Z$ ]  o  g0 V- `
virtual ~CMyMCIWave();//析构函数* G, l& R7 @; B' X/ O+ A% s7 l* M
DWORD OpenWave(CString strFileName);                  //打开文件+ E$ D4 Z# n% X2 X1 F( A
DWORD CloseWave();                  //关闭文件$ {! P& d5 _$ s" N5 r9 f
DWORD PlayWave();                   //播放
5 e( \. R# Y) Q6 |" L1 D void  StopWave();                   //停止播放* e7 G- {. E6 h- C
DWORD RecordWave();                 //录制
" p) y8 T( c; Q9 G. M; }" t& y DWORD SaveWave(CString strFileName);  //保存: B# |4 g0 D7 S. Z$ K# v
DWORD  GetBitLength();          //得到位长
% H3 p& G% M0 A5 r* K DWORD GetSampleRate();          //得到采样率/ s; _! W) {. d- q' v. ^
DWORD  GetChannel();             //得到当前声道
7 w/ o  Z6 y8 Q  S3 ~  ^ DWORD GetWaveLength();         //得到音频长度
& f% r; k5 W2 ?; K* i: S% V0 j% `public:
3 G! t# M0 g2 |! p7 ?. N BOOL m_bPlaying;               //是否正在播放
5 S5 i8 I* m/ n7 M6 m' l! q7 e$ z& U( R BOOL m_bRecord;                //是否在录音9 V6 T, t9 |3 i$ j/ s" c6 Z; g8 j
BOOL m_bOpen;                 //文件是否打开6 m9 Q" r% d  m; R
WORD m_wDeviceID;            //播放设备ID& h+ y7 J4 I* B1 i
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
9 u1 X: h# c4 ?6 d5 E//
: W3 c) P0 x0 J* n0 w1 {//////////////////////////////////////////////////////////////////////#include "stdafx.h"( v% b. |5 F$ t% ~/ u, U
#include "MCIWavPlay.h"
8 G- g6 ^3 Y7 c3 \4 T1 E6 A# V#include "MyMCIWave.h"#ifdef _DEBUG
8 y4 y- V" K" b4 c( N) n#undef THIS_FILE, ]- H, ?3 c" a& ?6 G
static char THIS_FILE[]=__FILE__;
* C1 L- ?5 Q) J+ T5 R3 U4 e#define new DEBUG_NEW
7 y* h9 X1 l+ T6 b#endif//////////////////////////////////////////////////////////////////////& z6 o9 i) G1 f6 V
// Construction/Destruction
  X4 q9 X9 W7 E. Q6 `* r" |+ R//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
$ T+ F; L2 \  Z1 m{
$ ]: L( B% k4 h1 }1 M. Q0 W6 G //进行状态指示变量的初始化0 I" N* K8 ^+ m
m_bPlaying = FALSE;
, B2 |1 {" ~# b9 p0 l' F    m_bRecord = FALSE;
3 b, S4 q: _9 e5 D$ G. c) a% l    m_bOpen = FALSE;
; J; B4 z( \; T9 w$ I    m_wDeviceID = 0;
) {3 n' t- Q# a! _0 g0 Z, P8 L}CMyMCIWave::~CMyMCIWave()
0 p" w5 Z, u* n# S$ _0 O{! Y5 I# r# A/ @$ s
CloseWave();//关闭WAV文件! H! y' X0 q- M4 V/ I
}2 V. R5 {$ c6 i
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件! M; G8 k( T! o- X: F6 D, m+ x
{( q6 ^( A* R% x4 W# I6 M0 c) \
if (m_bOpen)//如果文件已经打开# E* M( C( m$ C. M+ J3 n
{
- |2 L6 ?0 _$ c; H+ [  CloseWave();//关闭该文件$ ~8 K* o0 F7 s  j; f& |
}/ i$ h6 j/ z- _' P: C7 x% a
DWORD dwOpenFlag;//打开标记
6 X( y4 P0 c9 X1 e7 {* J8 c MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
) C" }$ K: v, d* s; G; b mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型5 H$ [# I, U2 ]6 ~1 H0 t
mciOpenParam.lpstrElementName = strFileName;//打开文件名& l$ A7 B5 p! f5 a
//初始化MCI设备
  X8 F8 W8 A% h1 u8 C7 } dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);/ r* ]2 i! W' r5 ^- |5 B  X" X; X, p
if (dwOpenFlag)//初始化失败( Z, }/ `5 H" B* C) Q
  return dwOpenFlag;//返回错误代码
: a8 q2 S- @1 ]! l$ ~ m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
; S4 @$ p# `6 g# a, y. @ m_bOpen = TRUE;) D6 H; ~" a0 w# k$ l
dwOpenFlag = 0;
) \" y  r# b0 L MCI_SET_PARMS mciSetParam;# I) Z8 X; _2 M! V0 y# N& C& K5 M+ d
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
, i: O( {3 y2 o9 o- J5 } //改变时间控制设置( X  V7 L( f$ A( f
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);  [- ]5 _2 i8 K7 P, M; Y) X
if (dwOpenFlag)//设置失败2 p( q/ I7 J/ Z2 t5 f+ P- F5 j+ m
  return dwOpenFlag;//返回错误代码8 }0 G  S9 U1 r
return 0;
; B$ [" z7 v8 c/ l# N}DWORD CMyMCIWave::PlayWave()//播放波形文件& @/ @# r0 k2 }! S, i
{
$ F# E# G7 [8 Y* m MCI_PLAY_PARMS mciPlayParam;
" E" }# N0 C: @3 |; o0 E2 Q. Y DWORD dwPlayFlag;; r' D& d) X) z) l$ T& _! ]
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据% N  ]. @2 {: J- H* R
if (dwPlayFlag)//播放失败1 U+ b! A+ Z# L6 b6 V, m9 c9 Z$ j
  return dwPlayFlag;//返回错误代码% C7 A6 Q" Y$ e2 f
else
2 j4 A" q. s( F- x {
% O6 Z- A2 T! m$ ^6 P  m_bPlaying = TRUE;
( Y/ [# J4 V' E- W* p. Q! S- s  return 0;% }; n. `+ ?& G) \
}5 \* w6 F% x$ U8 K" G4 H
}2 Q$ Z9 N! t+ L) l! r
void CMyMCIWave::StopWave()//停止播放波形文件% N7 t: b" r( A# a
{0 e% J7 p9 r  T% |* E# @
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放$ o' w: {6 k/ s, K' K
}! F8 P% j/ t5 D' v! G
DWORD CMyMCIWave::RecordWave(), Q, ]  r. Q5 T4 f7 Q4 m$ i* c
{8 `# }% [+ y) ~' L% |( X+ \
if (m_bOpen)//如果有文件打开9 E- F# @/ q8 u! u" O
  CloseWave();//关闭文件
9 b% Q% @' ~9 M8 N  X5 b% t. }* v DWORD dwRecordFlag;
9 l4 a( O2 K. ? MCI_OPEN_PARMS mciOpenParam;" J3 W9 l- d6 V
mciOpenParam.lpstrDeviceType = " waveAudio ";
# v8 _, K. m7 _; ~8 r7 W' Z% k mciOpenParam.lpstrElementName = NULL;$ Y* C: L* p+ q* O, k# F8 c
//初始化MCI设备
$ H8 V# K* i  p7 A' I dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
) v/ d5 U0 E1 H4 O% v  F if (dwRecordFlag)//初始化失败
5 t* R2 e* ?4 }8 l# ^( O, k5 o  return dwRecordFlag;//返回错误代码
! O1 w# Q2 L/ y. e5 ~ m_wDeviceID = mciOpenParam.wDeviceID;
; x& S. h& ?' o, l0 i9 w  Q MCI_RECORD_PARMS mciRecordParam;/ u% b" Q" T- O
//开始记录数据7 i- |# k5 ~9 S
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
9 @; ~8 n4 V; q/ s. t2 k if (dwRecordFlag)//记录数据失败
8 z4 l( H! }: F* h' u  return dwRecordFlag;//返回错误代码
  U- c, C* w. \  E# P$ D/ q/ n m_bRecord = TRUE;
# R0 {8 O5 c8 D& D9 b m_bOpen = TRUE;5 g: f# B- V/ l/ A6 T) L) l4 A
return 0;
9 }6 `) v" a/ F}0 n% ~4 S: _6 P* U
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
+ Q% b0 y, V, J{8 h) [* f: z$ _* h6 y. W
    if (m_bRecord)//正在录音  Z9 b$ W8 I& s! [
        return 0;//返回
& b- ^1 y* m- u+ |! y StopWave();//停止录音
6 |4 m% X, q9 p$ R9 A( p MCI_SAVE_PARMS mciSaveParam;4 T0 P# o4 {6 C$ y
mciSaveParam.lpfilename = strFileName;//设置保存的文件2 }3 v4 I6 l6 t8 k& P6 f
//保存WAV数据到文件
7 X' w9 t9 u; V9 j2 t; U, R: {( ? DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
* p4 G0 D9 N# ~$ [0 V if (dwSaveFlag)//保存失败
8 o4 I2 i' X! Y0 Z1 w7 {# e  return dwSaveFlag;//返回错误代码
" m* N: b% Z+ q* `: c! ~; x m_bRecord = FALSE;6 t& _" P' |) W: E( z. H9 L6 }
return 0;
: t  j7 @- e" B0 B+ t; G2 X. r: k}. V9 J4 J2 n3 w' M0 \
DWORD CMyMCIWave::CloseWave()9 v* p9 M1 v( ?  q( S
{
' I& Y  R) T9 a- d$ V if (m_wDeviceID)//有MCI设备在工作
4 a. P# `/ B6 E: I  \; Z {
& g; L% v2 ~) ~, i  DWORD dwCloseFlag;  D6 v% H3 {: r% m
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作+ H! ]) t' e2 y+ U
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
) z! C8 w, H5 u" E4 }; w6 G* _: u  if (dwCloseFlag)2 r. y2 x7 {9 R0 f: D7 F+ z& p
  {9 j( S  O) K3 [* A6 T6 z
   AfxMessageBox("关闭时出现错误");
% u* a0 e% `9 r, M" ^   return dwCloseFlag;' f3 `9 [& O; V" H8 }! I6 S2 h7 c, E
  }/ v- B4 m# r- ]
}
. |$ k  }, @$ F9 l! W0 c5 F //设置状态变量
0 V/ H- l% X$ |/ q5 Z* y* { m_bRecord = FALSE;
8 l+ }5 J$ g3 y m_bOpen = FALSE;
# j' k; ^+ H- B  J, s% W m_bPlaying = FALSE;
- i+ \: o1 H3 A6 w% H7 ^ m_wDeviceID = NULL;$ z# S5 v. n. Q% c
return 0;
' \8 o( k) O+ t; E5 i* Z}' G5 U9 m% ^+ E/ M. R
DWORD CMyMCIWave::GetSampleRate()//获取采样率
4 T  W$ K' [+ F  _& i  y{8 G5 l7 n5 w! q- s! {* ^
MCI_STATUS_PARMS mciStatusParam;
( g# i$ {# a! }' Q2 }% | mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
, j/ S. J6 v; z1 z //MCI设备的状态信息(采样频率)
7 c% [. G. t6 w+ A( L, L DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);/ m: a0 p1 k# B2 z
if (dwStatusFlag); C/ ?" O6 r0 m# J1 I8 t# n3 F
  return dwStatusFlag;//返回错误代码
" N6 I1 d3 H1 \  F* P else
5 s" Q) v' W$ i6 \3 N" t7 u  C  return mciStatusParam.dwReturn;//返回采样频率
+ `' h, L2 p) k, _4 J}; [. b) {5 X: _: d
DWORD CMyMCIWave::GetChannel()//获取声道数
& o" T+ A% ]" l: Y{
0 z( E; Q' P- ]( N MCI_STATUS_PARMS mciStatusParam;
& N+ X; U# }; l5 y5 R  x mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
6 o) U8 B+ u# G( W4 _ //MCI设备的状态信息(声道数)3 f$ a- w. x0 ]/ N- J5 [1 e% ~
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
% _- O! Q. L: o, L if (dwStatusFlag)( V, p/ w! h6 Y' ]5 k( N
  return dwStatusFlag;" @9 [# l; w5 x; n) B
else
) p8 F4 u' C( F& c- q5 i  return mciStatusParam.dwReturn;//返回声道数3 B2 ^  H) l$ L5 A0 k8 j
}! I/ T% X9 N+ a  |- \" t# E
DWORD CMyMCIWave::GetBitLength()//获取声音位长
7 H4 W6 M; |- w, A{  M, w6 ~) o4 k
MCI_STATUS_PARMS mciStatusParam;
7 E1 l0 i5 X4 h2 M mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长, z. J! o: \  L- Z' `
//MCI设备的状态信息(声音位长)
/ H* A+ L4 g0 |! ^& D$ O& S$ a: f, x* p DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
* i4 e/ D% s- E2 r/ j if (dwStatusFlag)6 B1 [8 M* b( ^* q. d
  return dwStatusFlag;1 i. q  r3 j/ h/ Z
else& H& Z& A$ h' p) B% B
  return mciStatusParam.dwReturn;//返回位长% E4 l# O( v2 `& z
}8 l5 B/ F3 S9 H6 D4 h' j
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长5 }9 U( u* J7 E& k0 d" A+ _- P
{( @) j7 D9 h. E
MCI_STATUS_PARMS mciStatusParam;
, j2 E; Q5 ]) K: x mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
4 }" {5 }2 a9 I( _ //返回MCI设备的状态信息(音频长度)& I7 Z  h( f" [6 Q5 H+ s" w- T
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
! d5 l( }2 O/ p0 S) ^7 I0 E5 F if (dwStatusFlag)
% M" K$ o& I  |5 M2 H! j  return dwStatusFlag;+ j, |% i* i' F  Q0 W/ S; d
else
0 T  l9 ]# V- s  return mciStatusParam.dwReturn;//返回音频长度
* g" J0 T' L' |) E, O: M+ M}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 19:00 , Processed in 0.031835 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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