找回密码
 注册
搜索
查看: 3106|回复: 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.
! `/ P  a3 }3 |6 y; G! }. v8 }//6 _; C: }0 C; l, I$ R/ Y
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)& }" ]1 [/ @5 l/ {5 p& S3 }5 n
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
, u8 w7 T) s7 {$ m#pragma once  I2 d$ B8 E/ L4 _/ |( P
#endif // _MSC_VER > 10009 w, d3 ?; L2 F! r& x+ s6 a# L9 ]
#include <Mmsystem.h>   
! P" A+ i2 B4 P/ n0 l#pragma   comment(lib,   "Winmm.lib")   
- [. N, M$ @! v2 }5 H& \" }9 p9 Eclass CMyMCIWave  
" U5 o7 {  f4 Q2 e! p: U0 ?, R% j{8 J2 N1 A" U7 h. i
public:
/ P; D5 H. t7 @8 K CMyMCIWave();//构造函数
$ p0 I$ }( P' G& f: l1 i" F2 _' p: |2 v virtual ~CMyMCIWave();//析构函数
5 m% a6 `2 |+ h) J9 Q4 M DWORD OpenWave(CString strFileName);                  //打开文件
6 G+ B- Z* g/ t- U6 Z DWORD CloseWave();                  //关闭文件
9 S/ i: ^* T& H5 H" I DWORD PlayWave();                   //播放
: x* e( A' [6 A4 V) x) E void  StopWave();                   //停止播放% ~+ J& F# @0 x: a. z0 |
DWORD RecordWave();                 //录制, y" c- k/ U( k' d& P6 {
DWORD SaveWave(CString strFileName);  //保存
& ~( u( g8 @$ p3 O* `% ]2 L DWORD  GetBitLength();          //得到位长
0 ?6 M* A  j. F% Q) T DWORD GetSampleRate();          //得到采样率
0 _% ?( W0 ~" A" X DWORD  GetChannel();             //得到当前声道
" J( ^+ D# S3 v/ D0 {7 C/ C7 i DWORD GetWaveLength();         //得到音频长度
4 w- q% p6 o0 q$ spublic:
, h/ |5 g' M0 {2 o. Q BOOL m_bPlaying;               //是否正在播放/ P8 {* a: {# |* N4 ?" ^5 P- f
BOOL m_bRecord;                //是否在录音
0 ^  J+ `+ f4 g' _$ r$ V BOOL m_bOpen;                 //文件是否打开# T/ f) e: }/ Q' S
WORD m_wDeviceID;            //播放设备ID
9 h7 t- V9 h2 s7 E! B};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
: O; v4 a) G2 Z9 E* F. ^8 R//) {1 S; G+ A, T- m2 Z
//////////////////////////////////////////////////////////////////////#include "stdafx.h"% N' u/ y0 s6 i4 Y" B
#include "MCIWavPlay.h"% u) z$ V* a3 Y. N5 K. v
#include "MyMCIWave.h"#ifdef _DEBUG
) V8 R! g6 b; ^) t- m#undef THIS_FILE1 v4 ?# v2 M4 X* a; ?6 F$ g
static char THIS_FILE[]=__FILE__;
$ v4 K: ]: a. |#define new DEBUG_NEW. \6 `1 y+ z0 f: Y+ E6 i
#endif//////////////////////////////////////////////////////////////////////
% V7 u2 Z* u  D* s/ _// Construction/Destruction
0 G/ [. W/ Z% C2 ?! u! b/ e//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
' N$ L. X) F9 N  n' `{8 @, q' g% H- M% u) F7 G9 i, x
//进行状态指示变量的初始化) J' m7 k* Y+ w" j4 }" w( A  t
m_bPlaying = FALSE;% s  q/ d6 z: T/ m
    m_bRecord = FALSE;- X, h# n3 {, R0 M/ S
    m_bOpen = FALSE;2 _3 H0 E3 G( p# G* A4 X3 z
    m_wDeviceID = 0;* F/ O+ j, _! Y6 _
}CMyMCIWave::~CMyMCIWave()) k( L) }  B* {2 z6 k& N* i
{
8 v; Z+ Z- b  n. t CloseWave();//关闭WAV文件
5 c6 |0 b# a! [1 L  {0 |}
$ X& S2 X2 e9 H$ CDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件' y4 e3 J0 A. F
{% C% g0 i, [+ G9 @: h0 Q) i
if (m_bOpen)//如果文件已经打开
/ i$ p1 b3 E$ J/ V4 W/ e {3 @, X  S; N- V' F
  CloseWave();//关闭该文件/ c9 m+ N3 m! |/ T( A
}+ B! @  p, T* @
DWORD dwOpenFlag;//打开标记
. `0 o1 c5 h* R4 n MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构0 |8 L, s: L0 [! h& W
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
# O" C8 Z7 A+ h! V mciOpenParam.lpstrElementName = strFileName;//打开文件名
. f/ n" f) s# y. O6 j' L //初始化MCI设备
: _/ Z3 }4 i6 t3 q/ t- N5 M dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);4 W$ J) w1 I. ^7 I
if (dwOpenFlag)//初始化失败% E% q7 b$ z. g
  return dwOpenFlag;//返回错误代码+ v7 g6 A- ^' Q- @" ^; Y# Z
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID4 G) N& q9 r2 Y
m_bOpen = TRUE;
8 ]5 l6 g6 Q  m' ?& J dwOpenFlag = 0;
9 U  W, x4 ]3 y& Z- a; _# T MCI_SET_PARMS mciSetParam;1 v0 p8 B! Z; q# Y
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒; w, M. H- d6 A. |$ S: l
//改变时间控制设置
+ h" ~. \8 q3 r+ q dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
/ d. U0 F0 b4 x3 P if (dwOpenFlag)//设置失败" |# R" ^3 v% G" K* N; W, L- s+ E' @
  return dwOpenFlag;//返回错误代码
& |1 r) z9 V- k" i2 m' T& C return 0;
4 j0 f9 d6 b/ ~4 H. ^1 C1 b$ Q/ F}DWORD CMyMCIWave::PlayWave()//播放波形文件
8 A9 }1 @9 w. s* V% ~{8 p6 o1 ]- M/ R" w! e7 _, u5 R- ^1 h! @
MCI_PLAY_PARMS mciPlayParam;2 I# u" Y7 m* S
DWORD dwPlayFlag;
) N. b3 A$ i* [+ Y8 I dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
( M% j( z6 X7 w if (dwPlayFlag)//播放失败* b* O5 Q$ T& z; w9 Y
  return dwPlayFlag;//返回错误代码% O$ S1 b% B/ X' y  S
else
. ?* h4 J( T; I0 z2 G {
7 d+ t$ F8 y3 w; i3 T: h  m_bPlaying = TRUE;
2 e% B" V* X* P) y  return 0;
' D5 H) D* B( ?" `5 R }
+ g: s: n. k5 g}
% p9 O1 P, b" Q* B. _; kvoid CMyMCIWave::StopWave()//停止播放波形文件2 k* H+ i; M7 i( z
{% |2 `$ K& T+ h) C1 m6 v
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放4 _! j( y7 C0 ~# B: ~5 E3 i
}
- L9 C( a, S, v1 SDWORD CMyMCIWave::RecordWave()
7 Q+ s# e8 I2 E% B{8 O6 c# _* h% H
if (m_bOpen)//如果有文件打开& D9 y- T/ A, n' |3 E: \
  CloseWave();//关闭文件5 U. ^- g% W- V
DWORD dwRecordFlag;
  H: [2 Y4 S) a/ Q9 n MCI_OPEN_PARMS mciOpenParam;
* U% I* a( D* D0 o mciOpenParam.lpstrDeviceType = " waveAudio ";
- q3 b. g) P5 [# L* x& G mciOpenParam.lpstrElementName = NULL;
5 J$ T0 q8 Q6 N. C0 V //初始化MCI设备: Z; v, I8 D3 U/ @' ]& r: T, ?
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);: Z  [0 n; E' M, y7 ^) l' y
if (dwRecordFlag)//初始化失败
0 O+ \, B5 M5 W/ r$ }& [- y- c, n  return dwRecordFlag;//返回错误代码: c7 t3 h* F1 `& I
m_wDeviceID = mciOpenParam.wDeviceID;5 q9 B3 C' R5 m! m& u" W1 |
MCI_RECORD_PARMS mciRecordParam;
7 @5 h; Y$ a' v9 k% x1 G- k //开始记录数据1 J0 K* d6 k3 R' l' E5 y
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
( H0 t0 B, C1 ?; j if (dwRecordFlag)//记录数据失败5 b0 F- s) m8 W- g8 _. X
  return dwRecordFlag;//返回错误代码
: g$ s* S" E/ i8 V2 h; H m_bRecord = TRUE;
# W( S& V3 @& F1 W1 `( h0 z% v m_bOpen = TRUE;
  V3 W9 l7 ?' s! H; K4 b3 @8 T return 0;
6 D% r. V+ M: w6 N( I$ }}
8 ?, y' }" _8 u& q0 t) Y- iDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
& A4 p0 V& @1 |{
& ~) q2 M" S% J2 b: A    if (m_bRecord)//正在录音
. w( s, w% M9 B9 y        return 0;//返回: h9 t% [$ J3 Y& i) {
StopWave();//停止录音3 x/ u+ |/ [, Z$ P
MCI_SAVE_PARMS mciSaveParam;$ y0 H) Y7 R8 x3 b; q5 `# T8 s( J
mciSaveParam.lpfilename = strFileName;//设置保存的文件& V# c& ^/ R5 Y: U  W5 x( [
//保存WAV数据到文件
9 S) p# ?% Y  j, Q DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
. o; W$ d  H& X, d( o if (dwSaveFlag)//保存失败
( W9 m) G5 M. f  return dwSaveFlag;//返回错误代码
5 G& b# Y5 Y( i. G  C m_bRecord = FALSE;9 x3 o- Y5 \1 a. K! e# u: D0 V
return 0;+ u* |% u: g0 J! a7 q' ~- _
}
% H* `2 b$ R! y4 [5 jDWORD CMyMCIWave::CloseWave()7 D% t* h: Z0 t& o$ z( `
{
/ d* o! T: _9 a4 b if (m_wDeviceID)//有MCI设备在工作/ I3 r! T* P: l: |
{
3 m( |* B3 N4 V4 o8 a$ M3 \2 @% \  DWORD dwCloseFlag;
. B8 g2 j, T9 o$ h, l; d  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
6 \# L2 b3 c$ {& X* ~  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
$ G' n3 B. ^+ r  `/ V  if (dwCloseFlag)
! N( k& D1 i4 ^% M* ~# \  {
: S& F8 {1 H4 c   AfxMessageBox("关闭时出现错误");. V+ J) P8 D4 E* F/ u
   return dwCloseFlag;3 ^- L' |  k# z. i
  }
0 j0 |; _6 i* W& L6 B! w }
: |  ?7 m( m2 m: N* S //设置状态变量! A% B1 [1 l' j; j
m_bRecord = FALSE;& g7 t( B5 n" l6 E4 n
m_bOpen = FALSE;
1 j8 W: A; k$ ~% x( H- B, c4 |( g m_bPlaying = FALSE;
1 h, }! k" d" X+ p! V. | m_wDeviceID = NULL;
4 X! J# Y- c  i; ~' P1 `: C0 k return 0;
8 ^* G9 k, V% p. j}) V; D6 P7 G. U: D
DWORD CMyMCIWave::GetSampleRate()//获取采样率* T$ I: ~* k# o
{% g- D. S: k6 y# H
MCI_STATUS_PARMS mciStatusParam;
; M# P6 i3 }7 n( ` mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
# c* U# B- d/ v6 |: Z //MCI设备的状态信息(采样频率)
$ f5 y+ h/ c$ A DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);$ A$ }) j* y5 I+ w# {
if (dwStatusFlag)
0 J" _9 m# @$ o/ o7 p1 M  return dwStatusFlag;//返回错误代码0 D( p; H  d# d  l2 D3 Z' V# [
else
3 |( n$ v  e6 k4 ^" c6 t; f  C  return mciStatusParam.dwReturn;//返回采样频率9 M5 ]$ [. u' }0 c
}
: u' f- Y, |% f( R+ r. A2 @DWORD CMyMCIWave::GetChannel()//获取声道数9 V1 B/ O5 w, `2 C
{% ^" F6 u; v! Y: F% \  q. Q; D
MCI_STATUS_PARMS mciStatusParam;
0 X; F7 }; U0 n% F  R/ E3 L/ z mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数/ y8 {" K2 Q/ O5 M6 q1 L0 H( A) d
//MCI设备的状态信息(声道数)9 M- r4 Y; e0 H9 l% x. O$ u! U0 \
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);% c. ]' [. y1 R  v
if (dwStatusFlag)
; z0 q3 y) e+ ^, W* `  return dwStatusFlag;
: O1 `9 J: n3 w4 O# F  c else/ d% S$ W( j/ q9 I: V: c4 N- D6 @5 R
  return mciStatusParam.dwReturn;//返回声道数
( {7 g: @. {( p0 F}
* X2 K' t+ {& p5 lDWORD CMyMCIWave::GetBitLength()//获取声音位长4 ?' i6 k# \' {* P; M
{! W. j& i+ C8 C, j
MCI_STATUS_PARMS mciStatusParam;5 W4 z9 K. K% m- O' M2 d7 H
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长. F; N# Y2 x) i
//MCI设备的状态信息(声音位长)
  n: J" u  b* `8 }* E# K: b) [ DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);( {/ ~2 B2 w0 ^+ O( [# g9 `
if (dwStatusFlag)
$ C. |8 N/ O; e; T& ]) L* w  return dwStatusFlag;
- h* P: N) o" C0 l; p2 e3 \4 } else7 c& w+ d! Q6 A
  return mciStatusParam.dwReturn;//返回位长' z$ L! o+ r! l3 K$ b% P1 A* {
}
3 n7 A# ^( r% h: g9 m% |% k! o* QDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长) C: i5 T9 E; s; S
{) G% O5 n2 t/ f1 |" g5 _7 p
MCI_STATUS_PARMS mciStatusParam;( l( r+ _0 q5 n2 {8 H# T
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度0 m* `: t  o5 y
//返回MCI设备的状态信息(音频长度)& C9 D: L  f8 X  i& K. m$ N) J: }5 s  c
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);3 D- _9 Y% T. k; e7 c8 P( t) ^
if (dwStatusFlag), a/ y  G$ F- ?% G( Y# N
  return dwStatusFlag;
, y1 s4 \% \% K) _9 r2 M else: y, B4 e6 M! U' f- q' g
  return mciStatusParam.dwReturn;//返回音频长度
, w" Z8 F. m1 z# }$ c}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:10 , Processed in 0.018536 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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