找回密码
 注册
查看: 3241|回复: 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.. X2 T% p8 X. x8 l$ M5 U; e7 l" d  T
//8 _: u! V* h/ o/ k0 u$ X) o
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
; n1 }% ?' }; b$ U#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
; j0 V2 O4 j# b" o) S& n5 L  u& c: g#pragma once! R1 T, G$ L! U! z9 |
#endif // _MSC_VER > 10004 S2 h# G; y* |" j; d$ Y+ \; C
#include <Mmsystem.h>   ) T" `$ c: G0 j- e, C: l
#pragma   comment(lib,   "Winmm.lib")   ' l/ `2 ^* `( ^7 P
class CMyMCIWave  
( o( _. v# e( _) r% j) C/ y3 v{7 M2 @& T! W- H! w
public:5 E" l; N. W/ y) t$ u# u5 p' Z2 C8 L; J
CMyMCIWave();//构造函数
, ~+ Y2 @" B5 K! h5 T+ D  z% F" j* H virtual ~CMyMCIWave();//析构函数
& T) c7 X4 |" }7 ?* N DWORD OpenWave(CString strFileName);                  //打开文件& I8 ]* P7 y% ?6 {8 }
DWORD CloseWave();                  //关闭文件8 Q( v" a$ Y- y+ m/ Z
DWORD PlayWave();                   //播放, \& f; Y/ F) T( D3 d% F
void  StopWave();                   //停止播放
4 Z, ]  x3 @& H; f' B0 X5 P DWORD RecordWave();                 //录制: a  o1 a. _0 e0 c* {6 T
DWORD SaveWave(CString strFileName);  //保存
' a6 W* l3 b8 h$ P DWORD  GetBitLength();          //得到位长
/ z4 T2 g" X- ?% q" B+ Y7 f! m+ S* ? DWORD GetSampleRate();          //得到采样率2 X  k6 q# c. P( g3 T8 K# L
DWORD  GetChannel();             //得到当前声道
" m9 [; t6 d3 d% X DWORD GetWaveLength();         //得到音频长度# q* [) E/ d* I& w
public:
, m, d& N, p* ^) j0 G8 y BOOL m_bPlaying;               //是否正在播放/ E( C9 r5 s, b" z
BOOL m_bRecord;                //是否在录音+ \! r$ h2 o0 L5 j
BOOL m_bOpen;                 //文件是否打开- j! P$ L, ]2 }$ Q) i
WORD m_wDeviceID;            //播放设备ID
$ h& D8 `# p: v/ K};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.: M/ L5 C* s; u; X+ Q& F6 _
/// g, }& E' i% g# b( R
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
7 e4 Z( _2 j% t# f' I; Y  q#include "MCIWavPlay.h"% Y0 |9 A8 i+ a) R8 ~* U; f; v0 H( \$ d
#include "MyMCIWave.h"#ifdef _DEBUG% m4 ^' f7 w  z. G3 |5 f
#undef THIS_FILE6 {7 v  [$ W" ^4 n/ N' }4 {$ C
static char THIS_FILE[]=__FILE__;
1 w# F. h: g7 p& C5 n, t#define new DEBUG_NEW; d$ O$ ]1 p& q2 I
#endif//////////////////////////////////////////////////////////////////////# U$ w; K" W# C! m- o4 I
// Construction/Destruction
; L8 ]' m: A' k& \//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()$ c& n6 Y) n$ O  W7 y, |! |
{& A7 m  O6 E0 G
//进行状态指示变量的初始化
# g' i) X& c5 a" ^2 m8 t m_bPlaying = FALSE;
( U2 O& |8 {6 K8 F8 {/ N    m_bRecord = FALSE;
) x! W4 k9 ?) e% V8 V# \    m_bOpen = FALSE;7 R/ J8 D- x/ m& z: _
    m_wDeviceID = 0;
3 ]. @, \1 V9 E7 |5 A+ _}CMyMCIWave::~CMyMCIWave(): G0 S' O/ Z' y9 d! L
{
2 Q. j: @, Z2 \) |' {/ n" K4 N* I CloseWave();//关闭WAV文件  Q* p- B2 ?% o1 b9 M  `
}2 s9 @) P, r& j' C2 s/ l
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
, B* z* j& `7 S  u4 }1 {{
) I( ]/ h0 m0 y' R) o+ D' Z if (m_bOpen)//如果文件已经打开
! Q2 W; Y6 r# \( ]( O7 A {
# m. r1 e' n  [9 r0 S  CloseWave();//关闭该文件
) j. |4 X9 ?& w+ w5 S }
. z1 t' p3 a4 i DWORD dwOpenFlag;//打开标记
* E8 D2 T( d4 b$ C" z* u  w- U MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
' Z9 a6 {. ?" ^' B- |. y mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
" d2 {5 o% y1 ^0 T6 |* s mciOpenParam.lpstrElementName = strFileName;//打开文件名
* R" y0 J0 U! o //初始化MCI设备
3 ]  n# t3 J  h6 _1 x% Q dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);# p* j* e. n9 e" \2 C, B; x; X+ \; `
if (dwOpenFlag)//初始化失败
4 l- ^: B9 D: z+ d  J  R: b* W  return dwOpenFlag;//返回错误代码& r3 m1 J$ l: ~. R3 H7 |9 `
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID: M" \0 \5 A  B4 T2 ^
m_bOpen = TRUE;. ~: b- u6 X+ {9 |9 V5 q+ T
dwOpenFlag = 0;
& T+ d' V& K4 T. V6 }" `) e MCI_SET_PARMS mciSetParam;
0 a  W3 W% L- q9 @7 F& {) w0 l. G. B mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
" K3 k2 U+ r$ X- K# G1 h8 } //改变时间控制设置
4 W; a- v. T' d# v dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
9 E9 u: _9 E6 q- N7 g6 n; j if (dwOpenFlag)//设置失败
; E; T' M- K6 B5 d" ]  return dwOpenFlag;//返回错误代码
/ a/ ]) W  [2 y+ R- C. O- F2 h return 0;8 \  I# i, T; z! V: p, `( m. t0 s) U8 o
}DWORD CMyMCIWave::PlayWave()//播放波形文件* L! P7 C5 }. {
{* g9 Q( g  H; D) R6 }
MCI_PLAY_PARMS mciPlayParam;
7 [& H2 u# A/ }" {+ d9 W# ^2 @, _ DWORD dwPlayFlag;
6 ^9 _5 w- F2 B$ C! ~1 k dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据! n6 d6 a' k. G3 K$ T- s
if (dwPlayFlag)//播放失败
/ t: [: l  _6 Z0 [1 t1 k  return dwPlayFlag;//返回错误代码' N! M: n! F; O2 c6 n
else6 w1 O3 K1 \" [4 X  a
{. p; b- `: P2 k  t6 p; D# a
  m_bPlaying = TRUE;
' G$ H5 Z* P6 I7 R  J# M) _  return 0;
* J2 \5 o6 ~3 n$ k1 d7 e2 u  r8 R }7 i! H$ N4 M4 w" W/ i0 Q+ I3 A
}  ]8 u& B4 f  I+ u) z
void CMyMCIWave::StopWave()//停止播放波形文件# ^$ _# G9 O8 ~# r  O
{
" y6 F$ f! X) e. _9 n mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
5 e/ ]- b' [+ Y}+ f: O9 l! J5 C
DWORD CMyMCIWave::RecordWave()
2 h( S0 |8 x' d; r" D- Y: a{
" Y1 h! g2 V6 h4 Y if (m_bOpen)//如果有文件打开# i7 Z7 ~* h. m: O/ x. G" {( u$ S
  CloseWave();//关闭文件/ Y1 z. C# Q' ?1 S
DWORD dwRecordFlag;0 a1 F$ d" c, Q* [. i' w* e
MCI_OPEN_PARMS mciOpenParam;: S- u' O6 S/ A/ s  A7 `* p
mciOpenParam.lpstrDeviceType = " waveAudio ";3 Q6 c3 q" P, j$ E* N% M
mciOpenParam.lpstrElementName = NULL;
4 n' h/ s" Q' Z //初始化MCI设备0 T( p$ i. @$ ~: G
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
" m1 s* w1 P* o% s2 N if (dwRecordFlag)//初始化失败( W: l( q7 r, G
  return dwRecordFlag;//返回错误代码1 b2 A& M' f. `6 n9 I
m_wDeviceID = mciOpenParam.wDeviceID;
4 o- D* a* Q! B' A/ |4 H; }- a3 e3 ] MCI_RECORD_PARMS mciRecordParam;& d/ `  M# Q( t4 j' G. u/ {5 d2 K  U
//开始记录数据
! N- v; j5 Q  J% @' h dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);' [1 ?# e' m! e
if (dwRecordFlag)//记录数据失败8 E2 S! U8 e% D9 ], L
  return dwRecordFlag;//返回错误代码
$ n" X4 {3 l: U. G0 p1 L0 h m_bRecord = TRUE;
" O9 E! l8 i4 v8 E m_bOpen = TRUE;
9 G9 o! {' q# \% e/ {$ z0 e2 I return 0;
# r% h+ N& b% q3 g}+ Q! d' ?! X/ l1 Z' I+ I
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件6 w+ K& m0 Z2 |: I
{- v$ S$ n; i) S6 v5 |( ^/ z* z' E
    if (m_bRecord)//正在录音" r- d  S& W1 d3 X& ]1 f+ @
        return 0;//返回; k6 h  l! z( e1 D; r, @
StopWave();//停止录音
! ?, K# b6 M3 ?0 J  b& ] MCI_SAVE_PARMS mciSaveParam;
& ~' R/ J) U. G0 @8 T' W mciSaveParam.lpfilename = strFileName;//设置保存的文件
/ S) k# z7 B: x$ y% E/ S //保存WAV数据到文件
/ l: I! Z8 l- x' K DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
1 o, I) x9 N$ I# G if (dwSaveFlag)//保存失败
! T: W: v% t+ E$ {4 c2 ]0 |  return dwSaveFlag;//返回错误代码
8 P6 t2 L8 N2 T' y8 T. Q m_bRecord = FALSE;& r( I! W% p/ r8 [
return 0;; `+ J+ r" o3 N- B9 D: {
}: f2 v& K* t) e6 `  y8 W
DWORD CMyMCIWave::CloseWave()
$ e: {- w" T" r/ c# U( \7 s+ t{
3 x& O8 k4 ]0 c* w8 F if (m_wDeviceID)//有MCI设备在工作
& H; e& l) f3 T# u {
$ K$ M# I/ z/ y/ }+ B# s  DWORD dwCloseFlag;$ D- H$ p" M) m1 a0 g* D
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
" r& [) U6 c1 V: P  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
, H* `1 ]5 E8 r/ ^6 M/ ^  if (dwCloseFlag)
3 R, U! }$ m0 D0 K  {
* b; B, A. ~/ h, r1 V$ Y   AfxMessageBox("关闭时出现错误");+ E( }. K" v1 e9 ?' n7 y# B  @
   return dwCloseFlag;& m0 p# b. c! j& E) R% L3 J
  }# F% p( X* {9 ?
}
8 K- E9 [6 {: C' c //设置状态变量6 D, ]: r0 E+ L2 z
m_bRecord = FALSE;, e/ I1 N( X) j4 V# t- `
m_bOpen = FALSE;
: B1 e) q* s" ?( D m_bPlaying = FALSE;' {3 [; ~" ^/ ?8 s9 T- m! Y
m_wDeviceID = NULL;
9 g# i8 n8 r* l" J6 h3 Q. s# J return 0;- E, t8 D9 ?' z4 b& s+ f
}/ V' T' [( w  |/ o  c
DWORD CMyMCIWave::GetSampleRate()//获取采样率/ O8 O7 g! L: I+ e9 T
{: I2 a; I5 Q9 ?* y2 V( r
MCI_STATUS_PARMS mciStatusParam;0 {0 y# k" e+ A3 z5 M% T6 O
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
/ C3 P" V1 C3 a, N //MCI设备的状态信息(采样频率)7 L- o! j0 p& _, c+ ]% |/ j5 g
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
- [9 a1 {/ u; }5 B4 B if (dwStatusFlag)
7 q  P/ P2 T% u  return dwStatusFlag;//返回错误代码
: I2 i. \; O1 ?  n. n: \ else  P- V6 p% H$ r& K- H
  return mciStatusParam.dwReturn;//返回采样频率
0 d; ], V3 B7 M' {* V2 `$ B! ^}
8 ~1 u. [  x/ Z' pDWORD CMyMCIWave::GetChannel()//获取声道数
1 `9 n' e9 c  G3 G( e' q3 C{1 B" z$ o/ {% B- S
MCI_STATUS_PARMS mciStatusParam;
5 z7 H* u  T% U- R mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
8 X: B6 @; C. t! r) V! ~) G  Y. K //MCI设备的状态信息(声道数)7 I8 L  D, u, t/ I
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
% j& L4 o2 D6 X8 N. a- L, E. n; u0 _% K if (dwStatusFlag)
  @9 M4 |& N0 u& D+ C. u  return dwStatusFlag;3 V1 @4 [' C- x* p
else' I: d8 {8 `& t6 A! }
  return mciStatusParam.dwReturn;//返回声道数4 x# D  y. l$ S. o
}/ R1 e7 O! s- M2 l$ t
DWORD CMyMCIWave::GetBitLength()//获取声音位长
4 c/ O+ K! ^; X/ z+ }" j5 z{
3 N4 n% M6 `) v- q( k MCI_STATUS_PARMS mciStatusParam;7 I* i$ i) ]4 ~2 L: j# R& p
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长/ \" ]5 q8 U7 d4 _) Z
//MCI设备的状态信息(声音位长)
* \+ r0 D4 S$ c. m% j DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);3 a5 j5 c5 s, c$ F! J
if (dwStatusFlag)5 s7 `! {! K# T( x2 c
  return dwStatusFlag;
# t, ^" O8 D  q else; e' s, j4 R3 Q# T1 |0 \
  return mciStatusParam.dwReturn;//返回位长
# d7 t7 r8 t, s. X}
. o% X% H& @* d/ k+ G% f9 DDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
" G9 J; y/ Y0 ^4 s{! i; B* X) n8 o, c6 j( ~3 w
MCI_STATUS_PARMS mciStatusParam;
. s) F2 O4 C& I% n) | mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
! o2 X& e% K( h* M. [0 r7 s //返回MCI设备的状态信息(音频长度)& M, F7 L$ M- B) X9 t& f7 J/ a
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);) P( r. f" z* w  O
if (dwStatusFlag)+ f5 [5 I, ]' t% G7 D( `6 [
  return dwStatusFlag;- u2 J7 T. m$ _# h
else
! Q6 V: u5 w7 z! r3 E  return mciStatusParam.dwReturn;//返回音频长度( z( R5 n6 C6 i. R1 h, a$ |: _; @
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 09:07 , Processed in 0.019331 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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