找回密码
 注册
搜索
查看: 3054|回复: 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.& j1 p5 |5 P0 \1 k! }3 h) Z! ~
//
4 h2 y9 o' S0 L. F//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)( z: c2 L5 i: Q: w, |, s/ l) J
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10005 V$ R1 j* g+ |4 {3 K5 p8 U8 A
#pragma once' q5 B' B6 L' }$ r4 a
#endif // _MSC_VER > 1000
  c4 M+ P8 z3 H  X, ^#include <Mmsystem.h>   - v! q) K# t, {' ^  r
#pragma   comment(lib,   "Winmm.lib")   , R* n; ~- v5 I' c0 L
class CMyMCIWave  
1 X  E' }+ H. r* B8 e2 O{9 b2 o$ U3 ~3 K) j, V; k7 {- `
public:
+ K& Q( J! i8 x# E4 k8 @' s3 c* N CMyMCIWave();//构造函数* w# i# t) b# }. |
virtual ~CMyMCIWave();//析构函数
4 w0 s1 Y; E' Q5 h* c DWORD OpenWave(CString strFileName);                  //打开文件, C3 Y) D- h( J7 O0 W, L& |" C  s
DWORD CloseWave();                  //关闭文件. @. v: Z1 f& @" m8 y7 S6 t
DWORD PlayWave();                   //播放
0 I3 a* Y! H- O& o9 s% b void  StopWave();                   //停止播放% t* S( p) T2 T6 ?
DWORD RecordWave();                 //录制
! b- L  M7 D$ C. x' H& ?$ V DWORD SaveWave(CString strFileName);  //保存  U% f9 q$ G* r) d, Y) E# @
DWORD  GetBitLength();          //得到位长# m. l1 d4 B0 P8 n( o: N
DWORD GetSampleRate();          //得到采样率- O+ k! g8 c. c, A
DWORD  GetChannel();             //得到当前声道
! p, Y+ K/ ~$ b- C7 ^ DWORD GetWaveLength();         //得到音频长度( T8 m2 j" [( A" j4 R5 g1 k
public:
4 {# J% Y$ D, j1 l BOOL m_bPlaying;               //是否正在播放8 K2 x+ Q# a* }+ W& z4 K' U
BOOL m_bRecord;                //是否在录音/ h$ Y( d8 W" u: E$ d. i
BOOL m_bOpen;                 //文件是否打开! t$ v+ ~. W* j! L* V8 B, @' x& ^
WORD m_wDeviceID;            //播放设备ID0 K1 t( v! p+ j$ H9 o
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.4 j8 D% J6 a4 I
//
% N' p/ {6 q/ Y- Y* u" `* d//////////////////////////////////////////////////////////////////////#include "stdafx.h"$ G6 s7 t$ |& v4 i6 G! f
#include "MCIWavPlay.h"! Y3 `% V1 z* K3 _7 D7 i' w: H
#include "MyMCIWave.h"#ifdef _DEBUG
5 i# q8 L% Q7 H, r, P! W. q#undef THIS_FILE2 j7 s# C. H! u7 p
static char THIS_FILE[]=__FILE__;
& z# K. }" l; u; a' l* t#define new DEBUG_NEW
$ G$ {/ t" ^' N7 @; X1 ~#endif//////////////////////////////////////////////////////////////////////
7 k8 I" q% F  P// Construction/Destruction9 }% a- @. R( r  r4 e5 S5 f
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
  R2 R1 W  T. P+ z  U9 {{, P' V5 n5 v! Z6 j) c" k' \
//进行状态指示变量的初始化
& D$ v* h1 _! z) [3 C m_bPlaying = FALSE;2 o' ]: m& b9 M+ |1 C
    m_bRecord = FALSE;7 C- }: X" d9 y) T) C( l9 @
    m_bOpen = FALSE;
- F: a: o* N# V/ u, K; G* v    m_wDeviceID = 0;
) ~* n! W) |. Z3 \4 r  [: `" [}CMyMCIWave::~CMyMCIWave()
/ z7 u2 K& i8 L7 v8 J{# V6 T+ K, g* x( }1 k. }: U, q
CloseWave();//关闭WAV文件+ t  l+ O. g7 J; X  D" }
}6 |; h) l1 g$ N
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
+ q/ x  O# A7 i7 X) \8 n{8 t( K+ x" l$ h+ d4 g$ d
if (m_bOpen)//如果文件已经打开
  }2 Y$ N* L3 }$ k! S4 w1 G2 b3 X {+ O& e- t) D& C- [
  CloseWave();//关闭该文件" c# i+ K) N; k4 @" ^
}; n; h6 i, G+ z  C2 |0 m9 }
DWORD dwOpenFlag;//打开标记0 n+ l; b- T( y* h
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构3 M3 x: v6 N( j5 j. h9 N
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
0 O1 y( |  T, A& o& }( g" s mciOpenParam.lpstrElementName = strFileName;//打开文件名: r) f6 r; b8 O' v, d/ Q) B* S- d
//初始化MCI设备1 u, s, c9 M" A. M1 w
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
9 t* L" {$ J0 e8 t if (dwOpenFlag)//初始化失败$ A, Z9 b+ A5 e) E2 V2 x
  return dwOpenFlag;//返回错误代码( j, r9 v4 C5 x7 x( A* U
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID5 S7 H" A% z3 l- h
m_bOpen = TRUE;0 ]' Z% _& R" Q2 Z5 d
dwOpenFlag = 0;7 S# V- a. J! X2 Y/ T: T
MCI_SET_PARMS mciSetParam;0 I; {3 ^/ S4 D. P9 U7 y
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒; V5 C$ [! q) e5 i( _: ^$ N
//改变时间控制设置
# m8 Z" r2 H* ~5 F  M* P0 V8 _7 Y dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
; S$ W  F: S% V+ t0 p8 i! s7 u* t if (dwOpenFlag)//设置失败& G, G& C. D5 ], k2 ^4 I
  return dwOpenFlag;//返回错误代码: N1 g8 @, }/ C9 Z5 ]* n
return 0;
6 }! h: f( K2 q}DWORD CMyMCIWave::PlayWave()//播放波形文件
. l/ \) x( K2 V, X{
5 @8 S! O# v5 Y% @- k MCI_PLAY_PARMS mciPlayParam;
2 G- y2 R* {5 C* r+ P: g/ D DWORD dwPlayFlag;; X. N; f8 P7 ~# o8 s
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
6 |" V; [2 I. U  X4 Z if (dwPlayFlag)//播放失败! o4 P' A0 x- h
  return dwPlayFlag;//返回错误代码
: B8 {: y2 Z$ N" {" D, K  G. ~ else
9 u/ J! ?" D: o {
4 j! S2 v* p; [! y  m_bPlaying = TRUE;/ I2 B  h! B; o: T  R0 |
  return 0;, B7 F  \# _! p: ]1 W: ?
}
7 _- y+ ?2 H% Z- |& m% X}
8 b5 O2 |% V$ V  Q, }5 G; Pvoid CMyMCIWave::StopWave()//停止播放波形文件
- z0 F, O0 y6 B{- G* C+ ?# d9 O* J% ?
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放& F" B1 e& O, q+ e% ]& _
}
3 \/ C1 i' m" W" M7 {DWORD CMyMCIWave::RecordWave()
8 ~' \$ T8 H. w{
, X# b$ P6 m2 v. g if (m_bOpen)//如果有文件打开, w: \  Q, w% s% R. p& G6 U
  CloseWave();//关闭文件
  N, v0 C) m7 ~$ S: F/ b* a7 ^ DWORD dwRecordFlag;: S$ h4 B0 q. ^3 o7 [* |
MCI_OPEN_PARMS mciOpenParam;) `1 E) V* Q  O6 f5 p1 [
mciOpenParam.lpstrDeviceType = " waveAudio ";
3 d( I! x6 X  ~ mciOpenParam.lpstrElementName = NULL;
  Q0 \* P3 u' d //初始化MCI设备
+ H; z+ T% G) {/ K; e% I dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
: Z* B& j: P! v# ]2 } if (dwRecordFlag)//初始化失败/ g+ c) m- H  q! T5 h, P3 K; M5 t
  return dwRecordFlag;//返回错误代码
$ F% v* X5 U# U  f$ S! {4 D m_wDeviceID = mciOpenParam.wDeviceID;! K1 t0 `0 z0 A; M4 R8 P3 }4 p5 d
MCI_RECORD_PARMS mciRecordParam;
; Z0 z* K9 z& H5 P //开始记录数据7 I3 ]0 h& M8 [0 Q$ L( g" _
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);9 u& O4 w3 @* J  |
if (dwRecordFlag)//记录数据失败9 f, x& E2 H+ b- x8 q; G  o; J& Q
  return dwRecordFlag;//返回错误代码
& o) c* O: B$ q# a' Y m_bRecord = TRUE;$ A  U4 V0 i/ d# b" B2 @: I5 d1 }2 p5 x
m_bOpen = TRUE;/ g' _, {- _; P9 v
return 0;, f6 v+ U/ r  m6 P6 A
}+ f+ n- v1 w$ |! _: \
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件9 J+ w; m) y- U) {7 m
{
, Z: `( g4 Z* L+ @7 X- {6 @    if (m_bRecord)//正在录音( f  I2 Q5 m3 h5 v/ [
        return 0;//返回" }2 p9 n: o* \9 }' A
StopWave();//停止录音
) d" [! u$ K+ b MCI_SAVE_PARMS mciSaveParam;
) Q9 o  i6 A, o4 Q$ f6 ? mciSaveParam.lpfilename = strFileName;//设置保存的文件5 v. q& Q7 w! }' W; t2 a% ^( w
//保存WAV数据到文件9 z4 Q* {) D8 v' T
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);0 J& g. n5 |4 i7 b0 l3 G. J
if (dwSaveFlag)//保存失败' L1 Y: Z, V) ^' O
  return dwSaveFlag;//返回错误代码
. P6 [: h* K! Z m_bRecord = FALSE;
, m: V$ P; u: K9 F return 0;/ G" s, _) g, [! t! ?4 e0 |" V0 W
}3 V5 R# ]% @: {% k
DWORD CMyMCIWave::CloseWave()+ c. X! U/ m! B+ F4 Y# B* C
{
! C/ `& w, D) @1 j if (m_wDeviceID)//有MCI设备在工作
6 E4 t" V' y' J/ ~ {" \' C' ^2 p; S& v! \( c" t
  DWORD dwCloseFlag;
. \/ `" P0 n) L; t  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作# j  u+ x0 j/ r
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
% \5 g8 C* L$ k1 T& j& W& |  if (dwCloseFlag)
8 r5 `& x0 s7 ~- F0 N5 e  {; h; \9 J, i. K3 f7 U% v; W! H. b0 M
   AfxMessageBox("关闭时出现错误");
9 I* [3 [+ i0 }" e4 C   return dwCloseFlag;
) Q9 c2 D8 V7 z8 r" V5 }  }
* }% v1 p6 A* l) S1 [ }) Z- x- m) S: z, T7 u6 K! R6 M& }
//设置状态变量
" y2 D3 f/ i: {4 ~ m_bRecord = FALSE;
/ n, _& M9 v  V6 J5 h3 s m_bOpen = FALSE;  @$ `! j0 p4 y
m_bPlaying = FALSE;
, S& s) N' r. g# }! Y m_wDeviceID = NULL;- e( z2 M( U4 _% D7 R5 N# a4 E
return 0;$ Q4 l# D) }% e+ j: k$ h: I; a/ }5 i- |
}
" a! n. x4 H$ b8 ~( EDWORD CMyMCIWave::GetSampleRate()//获取采样率
% u; ]4 \# i% R/ L/ @' m{
! L7 [" z' y5 T- ]& { MCI_STATUS_PARMS mciStatusParam;
- [, B' {) |: D4 W9 u' K1 D mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率8 A2 w& Y& J. G' I
//MCI设备的状态信息(采样频率)
! R' B0 m, [  ^: X/ u* r4 q  j DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);' p8 E% k2 d# r4 b, {# b
if (dwStatusFlag)
% Q5 \) `) m$ K& h- y9 n, \  return dwStatusFlag;//返回错误代码7 s* M$ W, j& H' i/ @' k2 I4 U
else
+ b1 I* E4 X' n0 [% _  return mciStatusParam.dwReturn;//返回采样频率
7 {7 F; r& A2 F- ~* ~}
6 k. P$ R* m. n! @  ODWORD CMyMCIWave::GetChannel()//获取声道数
* \/ S* |1 b' W( h. e9 C' |; D, `' G{) f% v2 F8 s6 K3 L. q
MCI_STATUS_PARMS mciStatusParam;% d! P. b: ?+ y" ^8 ~: ^
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数4 ~4 t& O* t# X/ h# a& O
//MCI设备的状态信息(声道数)) Y: ]- ]8 j- ?) w6 D& h
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);7 O, B) z1 L( Y3 O9 L$ A9 h
if (dwStatusFlag)
3 e  B" ?+ j: c% t: L  return dwStatusFlag;
0 [& t: R! Z1 j# {# |/ R else8 R) q3 ]1 s9 O3 E7 M5 y
  return mciStatusParam.dwReturn;//返回声道数
4 q& a2 r# J! L9 p/ v}! ?5 Z1 I& r/ F
DWORD CMyMCIWave::GetBitLength()//获取声音位长! X# ^( e0 }" }" ~
{$ n# W  i4 O/ W8 R2 n, s& h9 A
MCI_STATUS_PARMS mciStatusParam;
1 Z- g5 W/ {% _* C' Y1 A) H6 } mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
. `$ O% W5 i+ J9 ~& i! S4 ? //MCI设备的状态信息(声音位长)  p4 V5 v" E2 j
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);! S- O. C0 R0 }& d0 Q8 A
if (dwStatusFlag)0 E) ]; W1 z& ]6 X7 V
  return dwStatusFlag;
* |( _+ c( ]6 z. z, G else
  @% R: b7 ~/ f% Y/ Q7 {  return mciStatusParam.dwReturn;//返回位长. D1 J& a7 X6 x3 e
}/ _& t( Q0 K* k" J3 l
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长2 y) M$ f& z0 y
{
! \5 t" R8 h! U  o MCI_STATUS_PARMS mciStatusParam;
! k% L9 l9 P# V9 g" n5 P5 K3 d4 v mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度/ S% I3 ~1 _( V! V# r& M1 e8 [6 m
//返回MCI设备的状态信息(音频长度)7 r: x7 I/ n5 {" o) r2 R( B2 b
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);& J5 |' i) o1 K" f) F
if (dwStatusFlag)
7 h) v6 f, h+ h. X  return dwStatusFlag;
& c; o8 n% {0 S# Q  B8 ` else, \, n$ A' C% f- B' D2 V$ z1 s
  return mciStatusParam.dwReturn;//返回音频长度
) e# O- `# ?3 T  v& w: S}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:53 , Processed in 0.018593 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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