找回密码
 注册
搜索
查看: 2743|回复: 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.( S% Q/ W6 N6 ?  N
//+ |2 Y5 k" X; a1 s# ~* h# @
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)3 B9 E6 n" n! a2 E$ v" Y5 K
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
# X% X$ C; T$ I$ ^8 \$ J' S#pragma once& k* F# V# t% |
#endif // _MSC_VER > 1000
" E0 C& U' i3 S7 W4 c#include <Mmsystem.h>   
- X2 u4 H9 Y; H% L/ }" G#pragma   comment(lib,   "Winmm.lib")   
" v9 i1 J4 Y( Iclass CMyMCIWave  ! p2 V7 I5 w& u. a+ |7 @" D
{
3 }5 _5 M% w8 ]! Wpublic:
/ B- _; n2 T9 B' n# |+ \1 t CMyMCIWave();//构造函数
- u9 z# d- z! P) E virtual ~CMyMCIWave();//析构函数+ H( O  s; w! K( ]) I) ~
DWORD OpenWave(CString strFileName);                  //打开文件: [. }/ k( `( {
DWORD CloseWave();                  //关闭文件3 C# B& |- p  D1 H* q! E8 r
DWORD PlayWave();                   //播放4 H  i2 E4 j) }  u2 Y, v3 b
void  StopWave();                   //停止播放5 S  i# `8 R) r7 g
DWORD RecordWave();                 //录制
$ K3 b: `3 M( i3 p# n6 ?6 ] DWORD SaveWave(CString strFileName);  //保存
' r- X( Q  w. ~" _0 k; l6 l DWORD  GetBitLength();          //得到位长2 e2 R& Z! z7 C
DWORD GetSampleRate();          //得到采样率
9 H$ f3 ~* R" n: F) t DWORD  GetChannel();             //得到当前声道
6 U% z& h4 N' w2 ^0 B DWORD GetWaveLength();         //得到音频长度
5 T- W4 a! a3 A" e2 f2 xpublic:' V! x' X7 f& I) d$ u6 J8 `& j
BOOL m_bPlaying;               //是否正在播放
3 X1 w0 j7 U# K& v2 n, ] BOOL m_bRecord;                //是否在录音
. z7 ?3 x$ n8 n' Y$ c; a BOOL m_bOpen;                 //文件是否打开
0 o+ I3 p( \8 ]+ ? WORD m_wDeviceID;            //播放设备ID+ m) n. w0 O3 S0 G. ^- R2 v# F
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.. w( _  C/ }# |% c: N6 q5 D
//. J. L8 E; W" o, x) o) [; H
//////////////////////////////////////////////////////////////////////#include "stdafx.h"% v7 |& a1 W" }! w. p! c& x
#include "MCIWavPlay.h"
  C) _9 x1 |4 Q6 N#include "MyMCIWave.h"#ifdef _DEBUG
( ~+ u" c4 O  S! w* c# a$ S#undef THIS_FILE; B, J+ X( o( ?3 o% f
static char THIS_FILE[]=__FILE__;* s, G) b& `& _/ c  m
#define new DEBUG_NEW& n0 O- r, C+ K* W9 c
#endif//////////////////////////////////////////////////////////////////////* U0 c( _5 a/ j
// Construction/Destruction
7 j/ ^& x9 i$ |//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
3 `, e+ k+ c% M8 f{
# u1 D9 |# ^4 n& g$ R //进行状态指示变量的初始化$ J5 G. o. q9 J4 r" O- \2 @$ C* r1 ]
m_bPlaying = FALSE;4 S$ X8 e2 [/ R" O
    m_bRecord = FALSE;1 v$ H) y/ \3 }- m" O% g
    m_bOpen = FALSE;
, u+ @8 R6 G2 g$ c& Q% G    m_wDeviceID = 0;
' b0 H) @/ o0 `4 H}CMyMCIWave::~CMyMCIWave()2 y3 C. Y' {0 G! P# X0 |  f* I  G
{
# D2 _8 y' b% R# c0 I$ W6 W/ u CloseWave();//关闭WAV文件2 K2 ?- p  K% L. s% r! }6 }
}
, e& n6 |) G6 B% ^1 J& lDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
  G5 _9 l5 B" r( {  O! @1 e{
, D1 K9 l7 q" r( B: r+ L if (m_bOpen)//如果文件已经打开
" D( S5 ~, X$ L1 j- A/ p6 G {9 q7 [! ^2 f' Z! t1 y1 ]9 Y7 S' I8 o
  CloseWave();//关闭该文件+ Z4 C- V3 O7 J8 h* `9 V6 R3 h
}
+ Z+ i0 u0 [/ a6 X DWORD dwOpenFlag;//打开标记
) |% n7 }/ c9 L" Y MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构- j' U" T7 K: k/ B* D# R
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型% k# E5 ^  r, l, e5 o3 R
mciOpenParam.lpstrElementName = strFileName;//打开文件名# A6 e6 }$ e5 ^$ p
//初始化MCI设备" L  Y) z( I2 u6 x! `  b; t2 e
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);* y; {8 l  m7 x/ l
if (dwOpenFlag)//初始化失败
3 g3 p) o- N3 t  return dwOpenFlag;//返回错误代码
7 m2 P; Y4 U9 f, R" i' Q m_wDeviceID = mciOpenParam.wDeviceID;//设备ID) q- A5 Y& v) n, }
m_bOpen = TRUE;
- d( T' n% W4 j  X dwOpenFlag = 0;6 s# ?- Q: e: a5 W- J( }
MCI_SET_PARMS mciSetParam;0 p( H  E' j. M, \5 d9 B' d7 d
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
! [5 |" Z" e2 d$ H( G8 ]2 i. c) h //改变时间控制设置
' J2 L+ q) E( P0 n( ~ dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);) q0 F8 u5 j- X, }) t
if (dwOpenFlag)//设置失败
% ?7 ?8 w; j6 b# `. g  return dwOpenFlag;//返回错误代码* g* M, i8 [! b" I
return 0;" i3 R! d- C+ T( H, `$ o
}DWORD CMyMCIWave::PlayWave()//播放波形文件
1 j2 h$ U) \6 U% x. ~& D; `, i{6 b0 J0 Z6 E5 V4 O
MCI_PLAY_PARMS mciPlayParam;
1 l# l: o$ G% j: z7 S: \  x5 f DWORD dwPlayFlag;
4 O2 W9 {) d' I/ l5 J4 o dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据" B1 ^3 W) l4 F  C/ ~0 G2 F
if (dwPlayFlag)//播放失败
% G/ S! d" R* b' f  return dwPlayFlag;//返回错误代码
; G" h3 q" L$ y4 x6 f' z else
' m( b* v' c- r( b& w0 o. N9 u. u {
$ h8 j1 O7 }. h0 Z, @  m_bPlaying = TRUE;! @" T5 w' u. V
  return 0;
( `& u- t- H2 y, u }+ w) p" o( p1 k5 h
}
4 m% v& z5 W2 }3 i" i  qvoid CMyMCIWave::StopWave()//停止播放波形文件
: S! Z6 B6 L  C- Q{3 ]* ~( Q0 u& `  ^. F( A
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放7 S2 \- N6 Q4 x  n: t, ]9 t4 @) q" a
}- t& N, S6 U8 E- h) R4 V% h2 s
DWORD CMyMCIWave::RecordWave()
% q0 @5 _1 R3 h5 ~  ^8 M2 n; ^5 [* W3 @{
# z- L* \" k6 {0 t" ?3 t8 q! U if (m_bOpen)//如果有文件打开
+ J5 s% [2 s; i) a. R4 S. j  CloseWave();//关闭文件
) I% C$ k  k7 g& V2 m. C DWORD dwRecordFlag;
* t  G% m9 C8 G2 J MCI_OPEN_PARMS mciOpenParam;  d( B; }6 O0 A( U/ b$ L1 f
mciOpenParam.lpstrDeviceType = " waveAudio ";
$ M1 M% d0 L- ~ mciOpenParam.lpstrElementName = NULL;( i& l# h" p% `) [) E: {: ~6 c
//初始化MCI设备- M# T+ F" b) C( P7 e) ?
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
& |2 e+ n$ M5 L* e if (dwRecordFlag)//初始化失败
5 ~8 h& c5 {' B, H  return dwRecordFlag;//返回错误代码6 {$ i" s4 O7 g+ u( c, I* {# F: H- I
m_wDeviceID = mciOpenParam.wDeviceID;
, K% e& A* p! g3 q4 V, H MCI_RECORD_PARMS mciRecordParam;
  W+ R( G+ o) x/ l( C; s //开始记录数据; f( ~! G2 u. Y0 i" c$ Q% e
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
' S0 H. K( [  h- ]  J. v5 B8 g if (dwRecordFlag)//记录数据失败
3 B3 j# A$ D/ H; Z  return dwRecordFlag;//返回错误代码9 Z% m, X% `$ n% ~+ U. R+ \. p
m_bRecord = TRUE;
& e5 H4 z, s( J/ n  |& m# N0 N m_bOpen = TRUE;
1 Z8 B& f, g, V. h6 j7 K1 P return 0;
$ ^3 b0 L3 M8 ], f# y2 a}* k; M2 x/ O( k$ p0 R7 H
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件" _6 ~* M/ Y4 K. @, L( T/ n! d
{) d# U6 K" Z0 D; G1 n* y
    if (m_bRecord)//正在录音
, F6 }# v  ^+ `7 t        return 0;//返回
: k  d& x$ ?  M; S( |0 b3 l StopWave();//停止录音$ B9 ?3 W; T  P, l
MCI_SAVE_PARMS mciSaveParam;
- V- K' l  O. H- L' f  Z mciSaveParam.lpfilename = strFileName;//设置保存的文件  i# q, Y% K) P6 _" q# G
//保存WAV数据到文件3 x' e$ ]4 _: X& w3 l" ~1 W% S
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
: Y" ~: w4 Y4 s6 F2 ^! O- \  `  y if (dwSaveFlag)//保存失败! W% J- B3 t2 D4 a
  return dwSaveFlag;//返回错误代码
8 P1 U- _- C  u4 U/ N m_bRecord = FALSE;
3 I+ h9 g( i6 n" I/ Z1 N- { return 0;
; b0 E1 N, p* |5 c; j9 L}
# g% u8 ~( }# U" b& k! FDWORD CMyMCIWave::CloseWave()! S# ^( q' A$ h
{$ B! o/ z7 J9 n% x" c
if (m_wDeviceID)//有MCI设备在工作* R- S5 U  ~( W$ y, I# s1 k
{2 r# M  C) A4 ~2 N& y# {& Q
  DWORD dwCloseFlag;6 b3 [9 S0 R, X' o4 X6 B3 N% g
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
2 H  z  o+ v9 c8 \5 A& I2 ^# e  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
  q- \7 v0 S; B1 J; N9 }! H0 n  if (dwCloseFlag)! h9 ^8 \: \: k# @% f: l  y
  {
3 Q5 [7 E% b: S( w, e6 `8 _   AfxMessageBox("关闭时出现错误");
4 F+ H3 E4 d/ }6 F- j   return dwCloseFlag;: L9 m  P! V  L! B
  }
1 \. y, {$ L. ]( i }
! U# C. ~+ x7 _3 M8 s  s //设置状态变量
: ?" t3 u5 Y! D" M8 J$ ? m_bRecord = FALSE;
* u, w, M) n: b7 U8 ` m_bOpen = FALSE;4 E+ Y. h% y  i( [# U1 K1 f/ k
m_bPlaying = FALSE;. A' u6 C* E* e& u- H
m_wDeviceID = NULL;& ^; }% g8 I' X5 T, e) |, M3 z/ U; e
return 0;
& h; i6 `# l9 ]3 W! k9 ^}1 q, ^$ c* e7 T. v1 o. \5 D
DWORD CMyMCIWave::GetSampleRate()//获取采样率9 t' K) h% Q% r% B% ]$ C9 m: g
{: i) F. ]$ A% r) P$ Z
MCI_STATUS_PARMS mciStatusParam;& L( N! S& W9 H! H5 ~/ Z9 d
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率% J& C- z8 N: e1 `9 ]9 T+ t% H
//MCI设备的状态信息(采样频率)+ I) c1 B; W0 _7 j7 I. [) ?; n
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);; a( ?2 u8 K4 Z8 I5 w
if (dwStatusFlag)
6 c& D/ }+ [; S" G/ x  return dwStatusFlag;//返回错误代码4 X5 U4 Z# e) r
else6 o3 G7 W" r$ h" m: L
  return mciStatusParam.dwReturn;//返回采样频率" }# @. j+ h2 J# p5 p
}
4 j& f% H& D5 e( D7 v! ^# PDWORD CMyMCIWave::GetChannel()//获取声道数2 P8 B) D8 z7 M' z3 \
{0 I5 U5 l/ w8 ^) W
MCI_STATUS_PARMS mciStatusParam;
8 }7 {4 u6 D+ x3 e mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
+ {, q8 H% c; ]; i3 u! Q+ C //MCI设备的状态信息(声道数)
" W9 k4 I6 |* ? DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
  L' W8 h" m: _! y3 L: G( n+ { if (dwStatusFlag)
+ a8 k  b  h& d4 N4 ?  return dwStatusFlag;
4 z& O% x; k* z/ H% ~ else+ F( @4 G2 R4 t3 j4 r! Q
  return mciStatusParam.dwReturn;//返回声道数
. J" N7 o7 Y: g: u0 x5 O}
+ _# @0 r) r/ T  Q9 ]9 [" x7 I: zDWORD CMyMCIWave::GetBitLength()//获取声音位长
4 g- m, R! I: f3 u: @{
  Y2 @5 e3 t* _) l( W# k MCI_STATUS_PARMS mciStatusParam;2 w9 S+ H" W1 I- B& U7 o# h
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
' c7 k; N* e3 Z9 X7 X //MCI设备的状态信息(声音位长)' u0 I6 r4 i0 c4 n3 C  l
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 X, U% V% B: Z* [! i
if (dwStatusFlag)& F! N5 s. j# a. z# ~1 r% _
  return dwStatusFlag;- ^/ u6 v' V- N
else
- z4 _; J- L* E& S; _9 M  return mciStatusParam.dwReturn;//返回位长
0 |, @: c: ?- {9 [( q( @}' k5 m5 ~6 @) I% }1 j0 c
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长2 ^) f  D  ]# H
{
! M3 e- r% j+ Q. `$ f, q' u MCI_STATUS_PARMS mciStatusParam;. _" n. _0 u0 B* }0 t- l
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度! M  e, d0 Y; [: I5 ]1 ]2 R& y
//返回MCI设备的状态信息(音频长度)
5 \8 t- V+ A  F( L8 E$ w0 X" f5 ` DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
  g) g. a! t( v if (dwStatusFlag)
+ a6 L. {2 I" j5 h  return dwStatusFlag;
  g" `" W: T4 z' T7 ^ else
3 f& K' W  g4 o- H8 c6 ^' h  return mciStatusParam.dwReturn;//返回音频长度
9 s* H) \( H' n9 P7 ~2 J1 R# [}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 14:43 , Processed in 0.020140 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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