找回密码
 注册
搜索
查看: 2673|回复: 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.- d" T2 E+ i$ [( z' H' e7 ?
//8 [* E2 s. w" @
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
, G; d; L8 L  m6 P) i9 p- p#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000* C7 |# X5 B6 x$ K1 H
#pragma once
; y# N- y1 I) v" V: D3 n% t#endif // _MSC_VER > 1000( |2 |( |- }) u( U% T/ i  e4 m: l
#include <Mmsystem.h>   
) y* f; z! |( w, k#pragma   comment(lib,   "Winmm.lib")   ( r- l3 f) H) [) h0 W9 }
class CMyMCIWave  
9 O6 `0 Z/ l: @6 i% _0 Q( T8 j{
/ J4 s7 c" i7 k9 z! F$ `+ B% ypublic:
/ j" D0 M) J! `& d8 l, V CMyMCIWave();//构造函数+ \, m  P4 n  e8 G: d" X+ B
virtual ~CMyMCIWave();//析构函数7 V3 K+ S$ Q, @- ~
DWORD OpenWave(CString strFileName);                  //打开文件$ E: i( K! _, [5 C+ ]2 I) y
DWORD CloseWave();                  //关闭文件
7 ^" v/ w2 M' ]4 w; B$ ] DWORD PlayWave();                   //播放; h  H* x9 F% Y1 S! }
void  StopWave();                   //停止播放
0 O8 Z% X& {1 n. q5 [6 N# k3 {9 Y; E DWORD RecordWave();                 //录制% R& K0 a, {, H
DWORD SaveWave(CString strFileName);  //保存
( l4 q3 M2 i7 e: _3 Q$ D$ \ DWORD  GetBitLength();          //得到位长
2 [3 Z9 d4 P4 p: v( Q DWORD GetSampleRate();          //得到采样率) Y- E  G0 e6 Z# J  C* Z5 q) {
DWORD  GetChannel();             //得到当前声道
. ~; N- F6 W5 d+ F; q0 M5 R DWORD GetWaveLength();         //得到音频长度/ W& t" X# v0 g& d5 m. b! X
public:
9 B0 g* a0 P, v& r( H BOOL m_bPlaying;               //是否正在播放1 B  d4 Z1 z" l
BOOL m_bRecord;                //是否在录音
: C4 k; P  W/ r& W BOOL m_bOpen;                 //文件是否打开
" m5 n0 I& r" x3 J2 S* U WORD m_wDeviceID;            //播放设备ID
* A5 I, N4 U1 H3 W" N" `  }};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.0 ?* j# W; o- Z7 I) o
//
& h% Z( S* y# X& _$ V//////////////////////////////////////////////////////////////////////#include "stdafx.h"/ B; G" ]: i- C+ J
#include "MCIWavPlay.h"
9 Y! R1 A5 c# ~5 Z+ j5 z) e#include "MyMCIWave.h"#ifdef _DEBUG3 a0 {" ?7 I  H* s( k) _, [* y
#undef THIS_FILE
7 `& q5 |) i' V5 cstatic char THIS_FILE[]=__FILE__;
" I  _3 ~4 p- z! i' G3 i#define new DEBUG_NEW; Z, {/ v- ?- c+ w- ~
#endif//////////////////////////////////////////////////////////////////////
* m. Q" w/ h( h+ ?& F# H// Construction/Destruction. {; O1 c, u1 \- ?  z
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
8 w$ T0 c' x/ `# n: b/ J# U{
1 d! ]- ~$ g/ \, s/ F4 D* b$ E' O //进行状态指示变量的初始化: `  l9 p% p! j! m/ L3 y2 P8 L
m_bPlaying = FALSE;6 h. Y: k& c+ n) S( Z( ]
    m_bRecord = FALSE;. [, `! M& H' S/ C  s
    m_bOpen = FALSE;: w  N" q( u8 Q$ Y/ n: L. V
    m_wDeviceID = 0;8 c7 i. \& r8 g' a: ?- P* N
}CMyMCIWave::~CMyMCIWave()
/ i& N; u6 S8 {0 ?; x{( R- ?9 _' u# ^8 B$ S2 Q& [. L
CloseWave();//关闭WAV文件/ b* S; H: l% ]9 i# t
}% _, r% `9 ?! p
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
$ y' }4 `" e6 `{
1 I* o7 v: v6 m if (m_bOpen)//如果文件已经打开* U: c. ?& V+ ^3 `* x
{+ ~6 ]: j% I. r
  CloseWave();//关闭该文件0 j6 @/ r- v8 C# I, P
}
  V' P$ D2 j: N' R DWORD dwOpenFlag;//打开标记- Y! z7 J8 {- o( J
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
7 Q9 A8 F* W- e' d# U mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
7 G. d6 {% Y5 ~! A mciOpenParam.lpstrElementName = strFileName;//打开文件名
% L- h/ I. ?0 D& @2 O6 f //初始化MCI设备
5 U' e  q8 \1 c* x- Q1 I& X2 p) O dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
; W" L- s' J: [) Z; u1 f if (dwOpenFlag)//初始化失败
5 x) B2 o9 b, y" S: g+ J- Q' h# ~9 W  return dwOpenFlag;//返回错误代码$ e2 q* V- \! G
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
) U7 |8 p) v$ s. B( g% D* N m_bOpen = TRUE;
7 z5 U" q1 p8 a0 B dwOpenFlag = 0;
( E4 e8 R# s" N' C( @ MCI_SET_PARMS mciSetParam;
/ [5 C& ~0 L1 g4 b0 A3 p, Q mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
/ X' Q/ E: Z- B# D //改变时间控制设置
0 d6 Z. Z* n- \0 T# B3 b dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);1 s; a0 y; \1 ^
if (dwOpenFlag)//设置失败
, g" v- z  D( E# u* k  return dwOpenFlag;//返回错误代码; j4 I, f, T7 h/ j; X
return 0;
% y# Q0 O) f' l# I1 E}DWORD CMyMCIWave::PlayWave()//播放波形文件- e" @; A' E- l. B2 d
{
/ P  A  {8 h* r/ J3 o MCI_PLAY_PARMS mciPlayParam;
9 C9 [9 a5 ^! R% C/ l5 e# a/ Q DWORD dwPlayFlag;* d2 Z% G% i) E
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
% f$ U! }( i4 @, w: R. l if (dwPlayFlag)//播放失败4 L5 j# d: @* ?% Q
  return dwPlayFlag;//返回错误代码
& M# e/ I$ k  U2 c9 H) u else
) V3 L8 c, T1 F {; v& d+ I' U! G" a: v% U3 ?
  m_bPlaying = TRUE;
9 c+ G- H, N3 E2 V7 [) B  return 0;# Q3 j# ^& h  I5 d: T
}
# N& K5 _( g0 s: c/ H2 L}. E6 a$ Y+ R( Y$ N: B
void CMyMCIWave::StopWave()//停止播放波形文件) r. d. K5 o+ b1 a) ~
{
6 z) Q- ]; G" ^0 Z. ` mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
* [3 V* n6 V& J) R  t}
5 f* X4 b- W2 ^3 o3 x3 M  ]" lDWORD CMyMCIWave::RecordWave()' U3 s" M  `! ]5 }# q
{. x3 F: q7 E- X( l4 ?9 o
if (m_bOpen)//如果有文件打开
. `5 {: B7 u/ y  CloseWave();//关闭文件1 q. |( s- \+ F4 Y1 }! {) x5 T& b
DWORD dwRecordFlag;
4 Q& D8 ?/ X+ ~2 T* T7 R) q2 { MCI_OPEN_PARMS mciOpenParam;" e5 ]8 {0 X  b) b8 w( ~/ a
mciOpenParam.lpstrDeviceType = " waveAudio ";
$ d! j& T, P. Q$ o! k5 V mciOpenParam.lpstrElementName = NULL;
% m4 F3 v' Z% p9 k! J$ j! a3 S //初始化MCI设备  ^1 @5 p; q! S. c
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);" e5 ^+ A, \( @$ v0 W& C: ^
if (dwRecordFlag)//初始化失败  C$ D7 D# b) e+ [3 {- F' T: P
  return dwRecordFlag;//返回错误代码4 s$ ~! e  u: C" B9 R& ^) j& R
m_wDeviceID = mciOpenParam.wDeviceID;* n5 a3 h5 R8 M' ?6 R
MCI_RECORD_PARMS mciRecordParam;
: O3 h% T% b+ g3 j$ x3 t! x8 d //开始记录数据
' B% \8 N6 j9 l3 h8 ]$ A dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);! ~( r% ?/ r/ C' y
if (dwRecordFlag)//记录数据失败! x- f$ x  k1 k! j' V" `5 Y
  return dwRecordFlag;//返回错误代码
9 N- W& O0 p6 p. _  t' Z m_bRecord = TRUE;
5 A2 q0 \" s( T; G; _2 ] m_bOpen = TRUE;
8 j; ^8 H7 k$ |8 I return 0;
$ @( w& u% G& s}0 b" a; @  L$ W# H& ?( i  Z4 ~0 M
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件' u4 o* N# L$ j! p5 G
{2 N7 W( L( `  m6 y/ F8 u
    if (m_bRecord)//正在录音
9 Q+ n1 g8 B4 B8 G7 m0 g        return 0;//返回3 a8 b7 y: t$ J0 l
StopWave();//停止录音
4 @) c/ z9 a0 D MCI_SAVE_PARMS mciSaveParam;
6 F% [8 u3 L  m' x- p, E: d mciSaveParam.lpfilename = strFileName;//设置保存的文件
$ W4 J( y9 ~9 [5 k+ y //保存WAV数据到文件
: N+ W3 U8 h/ P. i DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
( Y' Y& X7 i  g( J, b9 k$ D/ I if (dwSaveFlag)//保存失败$ _3 x: t: B5 {6 Z# E2 J+ [
  return dwSaveFlag;//返回错误代码% u$ a% G( A: t& i  c. T. d- T
m_bRecord = FALSE;8 V  a, W3 f* L
return 0;$ K; F) R7 A) f
}& n  x  T8 Q0 ]! B! \
DWORD CMyMCIWave::CloseWave()
- ^6 y0 l% @0 O. I  E" D6 c  T{) o" t  Q7 U- ~8 ^0 F, [
if (m_wDeviceID)//有MCI设备在工作4 B, x5 E8 D$ r: u% p
{3 s" P: k1 [5 q
  DWORD dwCloseFlag;/ u) d3 |' P0 b5 u1 z4 ]7 Y
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
8 O; n1 d: q) a/ c2 Y) \7 Y* \: g  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
# v  W# Z6 O5 ^7 [- c7 [. l  if (dwCloseFlag)& W) q; y; [8 }7 H/ X' s. J8 U
  {& y" v, J  C  f6 D
   AfxMessageBox("关闭时出现错误");. Y# s6 @* g: _: M) S
   return dwCloseFlag;
9 m' Q" N* u" V! K( l  }
" j- b9 ^; G! b) S& a( @ }
% w1 l' N- c* f5 v  r: } //设置状态变量: {! B; V: |) r$ K5 G
m_bRecord = FALSE;( l" ]1 H7 f! Q/ N' M
m_bOpen = FALSE;
6 }7 Q% F- h; u1 o4 p8 z3 |7 ~ m_bPlaying = FALSE;
' q. Y  c8 L, u5 ^0 j# ? m_wDeviceID = NULL;
% R1 Z5 q9 [: G return 0;
. S* h2 X9 Q% ~4 U9 x}
8 I6 o4 c5 s2 F) }4 b( [4 I( SDWORD CMyMCIWave::GetSampleRate()//获取采样率
( C  x- J+ X" d, X# W  Q{5 V& N1 o5 O5 v5 C0 c$ |( ?( }
MCI_STATUS_PARMS mciStatusParam;
# A) U0 i  o8 O1 y- n mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率9 W& \) \8 F, ^. E" s7 |) e* i# \: a
//MCI设备的状态信息(采样频率)8 I  P$ F7 P1 Q5 B, P2 B8 U# ^$ U
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
9 F' K% r0 K1 E" n% a if (dwStatusFlag)( ^- D+ \0 r" b" n
  return dwStatusFlag;//返回错误代码
( X5 M& R: l2 y6 | else# s  d0 R3 M7 }/ C' r) [) s
  return mciStatusParam.dwReturn;//返回采样频率" N% `- N+ \4 ^( U% N
}
# @3 U' u- z$ K% E- T4 f6 J' |DWORD CMyMCIWave::GetChannel()//获取声道数3 N% b+ P2 \1 {. S+ F
{  L, e  ~+ P7 }: N6 q  i
MCI_STATUS_PARMS mciStatusParam;
. `' j9 ^; }6 V" l mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数  N4 \( h; N( g; y
//MCI设备的状态信息(声道数)
1 t7 I; y% f  U DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);+ S) P. s, G$ t$ b, D; i; b, `2 D$ b
if (dwStatusFlag)
, J% ]4 q7 p* H* d. N- ]- X9 S  return dwStatusFlag;' O+ ?8 y' W) m0 N
else5 A$ w. I4 S( ]/ T. k
  return mciStatusParam.dwReturn;//返回声道数
. C& u( Q. A% _* `# I}
0 M4 l* L. q7 n! T. ]# O- @& D/ iDWORD CMyMCIWave::GetBitLength()//获取声音位长: y+ y% _6 R' A# v2 |5 r$ p( o
{1 h  m% t4 B& q  }4 x
MCI_STATUS_PARMS mciStatusParam;
; |$ b# M4 D+ v7 N mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
  l3 V& D( M$ k3 B$ M+ u //MCI设备的状态信息(声音位长)
% \# }0 l# D% H DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
8 f4 _! C( n- P' K5 \  z% B# C) X if (dwStatusFlag)* M4 P1 {4 \2 K) q; w5 W; M4 b
  return dwStatusFlag;$ A2 f3 Y& g1 i: n0 ~2 F1 n1 [3 |
else. j: s# u6 v3 C: q
  return mciStatusParam.dwReturn;//返回位长6 b4 Z! ]% V" ]- f
}
; O2 d& t. d( {3 s& M% Q, N/ W  BDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长" w' @: I0 `0 l0 {, K  t
{$ k1 O6 h$ ~2 b5 b- S
MCI_STATUS_PARMS mciStatusParam;2 v" x6 b; v8 l. V
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度( e' _: s9 F0 ?, {4 M5 O& r
//返回MCI设备的状态信息(音频长度): e7 O6 S% ]/ @/ Q6 D. @  o' w4 ^' S
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);+ _/ g$ N$ _+ n2 l1 Y% v. e& v2 \0 A
if (dwStatusFlag). W1 @0 e+ `: H6 P! V$ u
  return dwStatusFlag;
9 b6 Q+ Y7 J9 j; c$ S6 ~! g! J2 _ else
6 @& [% }0 F) @5 v$ X0 t, F. }  return mciStatusParam.dwReturn;//返回音频长度
5 b$ O- |/ A) W}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 06:30 , Processed in 0.048124 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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