找回密码
 注册
搜索
查看: 3170|回复: 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.
: R" E2 _( Q( c0 j/ m% O7 @//5 U7 t1 z6 O+ F8 K
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)/ j7 |" m2 E' x
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000/ l+ c) ?$ G3 \0 m5 d7 ^2 X
#pragma once1 s( ^5 E/ ^$ }8 x4 ]# {% e
#endif // _MSC_VER > 10002 l  z5 M; {9 A. V. X% M, z
#include <Mmsystem.h>   
+ t) F0 j/ D' v6 g" A#pragma   comment(lib,   "Winmm.lib")   
+ M. V% j$ \1 X4 J& fclass CMyMCIWave  
2 G  ~  Q' I( L; H9 u" Z/ y{  y) C* f2 Z0 _7 t" F) O
public:
1 E5 B+ o9 N% n& V3 n CMyMCIWave();//构造函数
' C4 u/ O2 M, T virtual ~CMyMCIWave();//析构函数
4 [% P# x, Q* N# U5 e: } DWORD OpenWave(CString strFileName);                  //打开文件
; e( ?  n$ j9 \7 q2 Z5 V5 G DWORD CloseWave();                  //关闭文件5 @* |: @7 t( _5 V; {) s
DWORD PlayWave();                   //播放. S8 [2 l) B# z6 W& u) u
void  StopWave();                   //停止播放
- a+ c& Z2 |" V' c, C/ H DWORD RecordWave();                 //录制
- Z; S6 c* M7 k5 j DWORD SaveWave(CString strFileName);  //保存
9 V2 |! E0 J. G9 o; C' H DWORD  GetBitLength();          //得到位长8 B" b+ ~; w% E- ]
DWORD GetSampleRate();          //得到采样率% s) O% x# E9 g  k" S5 X0 F. _' k1 ^
DWORD  GetChannel();             //得到当前声道5 e0 y. e0 [  I% i! U. U- j) ~
DWORD GetWaveLength();         //得到音频长度0 C8 v) C. c  d0 j  w2 N$ I
public:! W1 e% o. J9 u" |3 }
BOOL m_bPlaying;               //是否正在播放
7 S! m7 w3 w: L4 L: A BOOL m_bRecord;                //是否在录音
( X  v- q. _! K7 }9 V2 s1 k" R BOOL m_bOpen;                 //文件是否打开7 {/ }/ m5 j/ `* L1 o
WORD m_wDeviceID;            //播放设备ID
' z; r1 C; w' ]7 z};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
) s/ `# O* D, N, ]//% S  ?7 D4 K; |. h, L+ H% V
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
: `0 n. V: t1 H: [- P& c$ R& S5 R3 z8 N& o#include "MCIWavPlay.h"
( O* g0 o0 ]4 j; ]0 c- Z) g#include "MyMCIWave.h"#ifdef _DEBUG  m0 \9 R0 x+ C) X4 p
#undef THIS_FILE3 v9 N" \' y  z; c
static char THIS_FILE[]=__FILE__;
4 ~- c3 L! W+ _#define new DEBUG_NEW
1 c0 u. h4 i2 P" E, C+ e, Z#endif//////////////////////////////////////////////////////////////////////
9 p! o) i" U: e  Y// Construction/Destruction
, h/ s1 U' L8 s' c7 W) H. f: v& G//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()' C. w$ e7 H$ ]3 I
{
" v7 U1 `/ {" e; I0 i, Y- A9 M //进行状态指示变量的初始化9 K9 r4 N5 x" S* M' B
m_bPlaying = FALSE;) k* B' t! L+ @% `  y& e
    m_bRecord = FALSE;$ A$ e1 ]+ [  t; X/ B* ]: s
    m_bOpen = FALSE;+ y# D# g$ l% ^- R4 _8 |3 S
    m_wDeviceID = 0;
, `; a% W  W" K2 o}CMyMCIWave::~CMyMCIWave()
) r: m$ x! T: E: {0 d& r) `{
' w' u3 n+ ^% x% B8 N CloseWave();//关闭WAV文件' a9 L9 ]: ~/ Q" w3 Q& A! x+ h& Y
}' h* b- e; j1 }
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件0 [! b1 B5 s1 [- g
{
" j5 }, ]- O1 q  S* P) I if (m_bOpen)//如果文件已经打开
5 x" T9 e, H' P" U( b {
: {- Y, W& \- l$ b  CloseWave();//关闭该文件
  A2 s. ~( N/ z1 ^% Q, ` }
9 W" ]: [0 u) W, W DWORD dwOpenFlag;//打开标记5 ]3 b$ d: G4 m) b2 l9 ?
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构. Z5 h9 G, d  {% G2 X9 i
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型/ h; A. o6 d* j& A
mciOpenParam.lpstrElementName = strFileName;//打开文件名+ u3 b7 k5 b% S% x& J
//初始化MCI设备) O: Q) _; ?4 }0 a- N' ?
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);* U: `9 G1 v1 V1 u% e7 U
if (dwOpenFlag)//初始化失败
  p, s' V6 {# U3 ~  return dwOpenFlag;//返回错误代码
! [, q. H: K8 T5 ~( O m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
; ]% p+ ]* y+ J' p+ A* k' B. P3 ?% z m_bOpen = TRUE;
3 p* _) K1 O' \8 l  W% w. R7 b( l1 T, c dwOpenFlag = 0;
  a; K9 l9 J/ K( b/ e) R MCI_SET_PARMS mciSetParam;! r, o( G: s7 }, u8 j$ B9 Q
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
. T* I1 n+ N/ q% p //改变时间控制设置* S  @8 |$ y4 L2 a8 G
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
4 _% ~2 i7 S  k6 e3 f) L; O/ I, v if (dwOpenFlag)//设置失败6 z* P: f. s& N  O" S3 _
  return dwOpenFlag;//返回错误代码3 c; Z4 }6 }/ \
return 0;, |$ {, `7 P2 ?
}DWORD CMyMCIWave::PlayWave()//播放波形文件( b; @# t& u- v1 M( [% x
{4 C7 s$ y& O/ e+ M! T
MCI_PLAY_PARMS mciPlayParam;$ m( v9 s" M# M9 U2 U
DWORD dwPlayFlag;& }6 o' K" i, I& _% @# W. B( L+ L
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据8 y, Q7 b0 {7 ~2 Z2 z, w
if (dwPlayFlag)//播放失败
; l* B4 z, e8 F: d, L  return dwPlayFlag;//返回错误代码6 @- m3 I8 |* e, S
else
4 k2 J+ p7 {& C {
2 p1 j; l& g* \' s. e  m_bPlaying = TRUE;
) t5 }$ M) S! [, I  return 0;3 j3 b- d3 `, ?
}1 _* I3 n" b' U- e  \' u! ]
}* X5 k9 A+ ?; Z* w! A9 P
void CMyMCIWave::StopWave()//停止播放波形文件
/ d$ M5 l- M/ G{( g- ?. M" l) a8 ^! X/ u# `
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放1 l- Y9 y! g  ~- Z3 D1 i: Y
}5 R7 p8 d: j" b9 }% F9 W" }
DWORD CMyMCIWave::RecordWave()1 E4 _+ @' I8 z! J
{
: K: Q9 w# m8 I+ T9 W if (m_bOpen)//如果有文件打开7 ~1 X% s- n+ j* Y0 ]# H
  CloseWave();//关闭文件
4 ~$ V( ], \* e DWORD dwRecordFlag;# \3 v/ I& U2 z: ]' p' B
MCI_OPEN_PARMS mciOpenParam;# ]. y% p/ e& C
mciOpenParam.lpstrDeviceType = " waveAudio ";& R6 P5 r. F8 r- H' x& }' b% d
mciOpenParam.lpstrElementName = NULL;/ @2 K4 p5 o  K3 f) G# C# T/ p
//初始化MCI设备
$ _! |. Y; V, ?5 n2 O8 X& J/ B8 t dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);3 c- l: l% @8 U, |# S7 O3 V
if (dwRecordFlag)//初始化失败
7 P# H) j, c8 Q+ a7 p) @% B  B  return dwRecordFlag;//返回错误代码
5 Y7 \! \1 C+ g8 t m_wDeviceID = mciOpenParam.wDeviceID;
" @2 F" D1 Y# {$ W# W+ Q! G MCI_RECORD_PARMS mciRecordParam;
2 G" ~7 y. l, {, E8 { //开始记录数据
) q( q( t( C$ g& J" I. O: c dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
" i9 y! b7 T* H  M4 V) W; h if (dwRecordFlag)//记录数据失败
. I7 x- l: j0 N  return dwRecordFlag;//返回错误代码
# k5 K: Q0 v. | m_bRecord = TRUE;0 |9 X: E: n& @) `
m_bOpen = TRUE;; e$ s7 Q, o6 |
return 0;
8 M  Y0 z2 D' k* y}
/ o. w  e0 L  BDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
8 C4 x. p8 o, m{$ K- ~" M  L, E+ q
    if (m_bRecord)//正在录音
+ p. w' l, i# {& y5 C/ u        return 0;//返回8 H% t# v+ k, d- G$ R
StopWave();//停止录音1 e# B& k2 _0 G9 _  p: l
MCI_SAVE_PARMS mciSaveParam;7 T0 x" t0 T5 h* E( x% _$ ?
mciSaveParam.lpfilename = strFileName;//设置保存的文件
- r2 y* H2 q  N" c( u# F/ w* } //保存WAV数据到文件
% {  L& e# \, D, e! f DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
# r- C$ w9 J& ? if (dwSaveFlag)//保存失败
* y* S' n8 t( U9 r# a  return dwSaveFlag;//返回错误代码+ _: D7 M$ f! j
m_bRecord = FALSE;
' _" Z) Y. ?% T return 0;' q5 f0 F; x7 k( S! M) }
}
- m2 n# k1 t/ ~: xDWORD CMyMCIWave::CloseWave()7 {! T% ]9 t4 x9 g0 R, p
{5 q' L# S: K! E9 n' N
if (m_wDeviceID)//有MCI设备在工作
8 a2 p' a- t6 ]0 U* O {
3 R0 y+ C( V- Y5 L; T# t7 z9 H  DWORD dwCloseFlag;
9 m. ^$ a- ^/ p, h  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
0 n) Q5 \' R$ v* a  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
; s+ `  {1 i$ c. z  {" X( i  if (dwCloseFlag)
2 p+ b$ y+ Q, h0 `: Y3 X' O* e0 f& k  {
* k6 j. T9 @0 K8 ~/ o   AfxMessageBox("关闭时出现错误");5 f8 H+ }. q7 [8 q  V9 z
   return dwCloseFlag;& u6 t0 Z* D% X; d% ?$ p% x. ?' Q5 r  K
  }
. {9 [5 A& z: s( H% e }$ D9 Q& k1 Y5 y! u
//设置状态变量5 }3 \, I. c: [; w5 k+ _
m_bRecord = FALSE;
1 K1 ~8 P% P2 }$ D5 @6 p m_bOpen = FALSE;
; g" Q, i* U6 e% |( d( o m_bPlaying = FALSE;. F2 u9 A5 s' ], O- E1 Z: C
m_wDeviceID = NULL;) L& j% }9 L, \- A, B4 A% p0 R
return 0;
, u: n3 }8 R2 ]9 f% U% }}
% N6 ?- K1 d! W/ ?) gDWORD CMyMCIWave::GetSampleRate()//获取采样率
" a: h0 u# A8 t2 }8 k{
6 [, V4 Q  ?& V. {6 P MCI_STATUS_PARMS mciStatusParam;  T% t1 j+ ?" M
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率2 S4 s+ U; T) P0 X
//MCI设备的状态信息(采样频率)
1 ~  R; C" B, ~, Z' L  w DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);2 U$ q* q% w* [( v5 T3 \# ~+ n5 u
if (dwStatusFlag)
8 |# p; h" }5 n& F3 u  return dwStatusFlag;//返回错误代码
/ m4 i5 X' _" T+ E- R; X else3 A6 ?, z7 V) j. B9 }1 c
  return mciStatusParam.dwReturn;//返回采样频率0 D8 Q1 ~4 H; q; ^
}
* ]( |$ S* a* s  U5 t! mDWORD CMyMCIWave::GetChannel()//获取声道数4 X( i1 N/ L* I9 U
{+ [, m& s" G9 D# |  }+ @& x
MCI_STATUS_PARMS mciStatusParam;
+ q; b# M7 S$ j. L3 G mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
, H, v# B  v* }9 g //MCI设备的状态信息(声道数)3 S6 K5 m5 w( d6 d% j
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
' h7 P1 W3 b: Q if (dwStatusFlag)
8 G: X' G" ~$ j  h: y6 I8 W  return dwStatusFlag;) N# f9 e7 b$ i! l6 \- j
else- v& t' ]( [' A
  return mciStatusParam.dwReturn;//返回声道数
; E0 H  s5 o' L6 R3 \7 y}+ r9 ~+ T5 o, c1 ]' A  J& w4 q
DWORD CMyMCIWave::GetBitLength()//获取声音位长
) d) H2 w) H6 u! J1 {5 v/ M; ^{) d* Z' x, g! Z  ~2 F3 ?
MCI_STATUS_PARMS mciStatusParam;
% r  g7 W  x) ~1 Y- ^" j. y% S mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长$ T* d8 W6 ?( d7 P
//MCI设备的状态信息(声音位长)$ k) K/ ^. b/ Z, E9 M# n3 M0 d) k
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);% P/ h: {3 ~6 q, L
if (dwStatusFlag)
# c9 ]) f) X+ N& X: b9 y0 `  return dwStatusFlag;
0 T9 ?" ?! X- U& l! x* m else3 w" f8 `. p7 \* ~
  return mciStatusParam.dwReturn;//返回位长
# g+ n9 t( U- h' b}
2 W+ f$ [! z0 @5 i# |7 @) QDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
$ ?0 V3 V4 [' p{0 Z" M" B) t4 n5 _- ~: a2 \
MCI_STATUS_PARMS mciStatusParam;% _7 m1 D6 \2 [
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
* ]0 P: w9 T5 v% q4 z //返回MCI设备的状态信息(音频长度)  {" q% n7 T0 I+ M4 n; v* w
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);" [' i6 W! i+ C
if (dwStatusFlag)/ j7 Y6 B' p9 p: J1 n4 K# ~, ]
  return dwStatusFlag;6 ^+ M  K8 c- Z9 V( @' T1 e
else$ m) F+ F0 o7 E6 f6 f3 ~
  return mciStatusParam.dwReturn;//返回音频长度- m* M; W( o8 R
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 20:17 , Processed in 0.021435 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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