找回密码
 注册
搜索
查看: 2446|回复: 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.5 W3 e4 r( G. e, L# R2 B" e  B
//
& K0 @, h8 ^4 J* U* L//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)# k9 T2 `, |5 \* N6 Y0 r
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000  l  P2 j# z9 O. a. ?6 e
#pragma once- H4 [" E/ z  N+ O; E
#endif // _MSC_VER > 1000
$ U% V# E2 M  t: ^: z#include <Mmsystem.h>   
9 z2 W4 W9 s/ n, x. D#pragma   comment(lib,   "Winmm.lib")   
/ c! T$ M. S' u5 P# P4 W% l$ @class CMyMCIWave    b8 z8 x% z# W! U
{
9 V8 V  i# S+ L" Zpublic:7 S- F2 y& _# B& P; j1 k
CMyMCIWave();//构造函数, d0 j4 N' }, s9 x/ ]
virtual ~CMyMCIWave();//析构函数
0 F/ |' Y$ N4 t6 i DWORD OpenWave(CString strFileName);                  //打开文件  t% }1 _+ |) `2 A) I
DWORD CloseWave();                  //关闭文件- o* g8 p6 S, x. a+ a, A
DWORD PlayWave();                   //播放! V" n4 n  \7 E! n* n
void  StopWave();                   //停止播放
# S/ x( @9 c1 k! V! r; z& M/ @ DWORD RecordWave();                 //录制, t2 o4 D5 l7 W' ^6 k7 L. H, o7 v
DWORD SaveWave(CString strFileName);  //保存1 ^" S; s2 T/ I+ A" L- S$ T. t
DWORD  GetBitLength();          //得到位长
4 m% H$ W* Z% M2 `8 z DWORD GetSampleRate();          //得到采样率8 R; T, ~2 ^4 O4 J6 V5 [, F
DWORD  GetChannel();             //得到当前声道
9 ^$ c: l. F2 f' ^- `8 y DWORD GetWaveLength();         //得到音频长度# d4 R  [; e. R* D
public:
* Z! G4 A6 F/ c7 ]( q" ]' t. J BOOL m_bPlaying;               //是否正在播放
9 S1 R! x4 [" F3 F' O& }# p2 m BOOL m_bRecord;                //是否在录音/ Q8 F  }; j* A9 z- w5 b
BOOL m_bOpen;                 //文件是否打开
5 m% O# J# M& R7 O! V WORD m_wDeviceID;            //播放设备ID8 G& B& F3 z; C$ i
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
+ v6 D+ D( C* u: Y/ W" p//9 X% ]2 x% _+ _5 a
//////////////////////////////////////////////////////////////////////#include "stdafx.h"7 t: v8 l! z% N- m
#include "MCIWavPlay.h", M& x9 ], U5 G/ A( x4 T+ e5 O
#include "MyMCIWave.h"#ifdef _DEBUG
& \2 Z2 c5 D5 H9 V) ^#undef THIS_FILE# Q# L, |$ g) S% w
static char THIS_FILE[]=__FILE__;5 C- R5 o5 t; }: ~' o6 |5 \  Q
#define new DEBUG_NEW
! Q$ ?6 q" x% ?7 x0 C#endif//////////////////////////////////////////////////////////////////////4 k5 i9 t& |3 i, H# l$ ?
// Construction/Destruction
8 M( v& O0 y3 C//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()' y, S3 I+ @& F0 F7 ~3 ^) {9 W
{& y* b6 k6 j3 X; ?2 l* y
//进行状态指示变量的初始化( v0 w; W8 u; W8 A
m_bPlaying = FALSE;
4 s9 N* ~2 e( o    m_bRecord = FALSE;
7 O) y4 r, I- d1 k7 {, N- ]    m_bOpen = FALSE;
7 f: w0 l2 i* ~; A& e2 b6 W    m_wDeviceID = 0;: E! j$ Y0 R9 D, W0 u! e& f
}CMyMCIWave::~CMyMCIWave()2 T# J3 K/ J6 ^8 F5 M1 p
{
7 `' h9 u& h2 v- `  U0 a CloseWave();//关闭WAV文件8 H1 H# a& J6 v7 K
}6 W0 x% N( Y8 N) |2 g
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件! m- j% o4 m  e; J
{0 \7 o: J7 C) O0 f* M
if (m_bOpen)//如果文件已经打开
( b! n4 S1 }* U3 L# Y {
. m" e3 q+ J$ G  t  CloseWave();//关闭该文件  a# n( {- ]$ r* E7 p6 [
}
. \6 ]4 n9 W5 ` DWORD dwOpenFlag;//打开标记/ w, |7 p3 z: ^  k- X( P
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构  o$ B' {; q; O* j# G0 l
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型! B8 q$ N' k7 p3 B" D. b5 J
mciOpenParam.lpstrElementName = strFileName;//打开文件名
# `( e& d3 l- g7 [$ G3 m& I* z //初始化MCI设备9 ~$ L, C% C4 a- _0 d/ y/ D
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
; }+ t* @) \6 y* S5 A* ^9 x( y2 O* Y if (dwOpenFlag)//初始化失败
- `, H7 d' S9 b0 J. G* W  return dwOpenFlag;//返回错误代码3 P. R1 i: l3 @7 |5 h) i( H" K
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID( f4 n- R' t6 B' C8 c$ h
m_bOpen = TRUE;3 b& s0 V9 I0 @( w- l
dwOpenFlag = 0;
& W6 {' O9 X& v0 V6 n! B MCI_SET_PARMS mciSetParam;* A5 W' p/ I9 g7 Y
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒1 F* Y; q/ ~, A. h, I3 H- r) @
//改变时间控制设置1 d! @( z$ [& ^/ R5 H" K: U
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
  u7 E1 @' j8 A4 }; a  \ if (dwOpenFlag)//设置失败
# k/ b5 n4 N, |( B" I  return dwOpenFlag;//返回错误代码
! J! ~7 D/ H* G$ x" k' d$ O return 0;
0 b$ ^  b" m( h}DWORD CMyMCIWave::PlayWave()//播放波形文件
3 P+ X3 X# }. m: e! H{
5 K$ `! u9 W$ z) Z8 h4 }+ \ MCI_PLAY_PARMS mciPlayParam;9 S' u0 k/ D3 Q
DWORD dwPlayFlag;
% T7 ~" \# p9 q, N+ b dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据* O; Y% E2 M6 B7 O( i+ |9 j7 w
if (dwPlayFlag)//播放失败
9 W' d( S6 R, |+ t( o) P  return dwPlayFlag;//返回错误代码
  T( G3 R" M) n: C5 V( B( ?6 ] else
: |. C1 A$ u2 s: D- g/ r1 L, `* J7 j {7 F2 ^$ [+ E2 K! `7 r
  m_bPlaying = TRUE;% d  ]* k6 N" Y: M
  return 0;4 C: D& T: M& H5 ]3 Z
}4 k1 V5 G7 t1 _3 \! S& c. l
}  q' S- Y9 I  k7 t! Z( D* ^
void CMyMCIWave::StopWave()//停止播放波形文件" z3 a/ a/ a. Q1 i! B1 N1 A2 R
{0 p) X8 t: D$ |; Y8 P# L: C* J
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放) E+ e' d( _9 n0 D* F
}
9 ?- y' f6 ^3 d! W1 W3 q+ C+ A6 zDWORD CMyMCIWave::RecordWave()
8 X! K; |8 G) M( s{7 D9 @& ^) ~; u( `5 F! @: }2 R
if (m_bOpen)//如果有文件打开& F' l& w" V4 f' U& W6 o
  CloseWave();//关闭文件
+ \6 z5 ]; r5 D' u DWORD dwRecordFlag;6 {, F9 [9 C# ?0 F
MCI_OPEN_PARMS mciOpenParam;
" S* g1 B" D. m5 q mciOpenParam.lpstrDeviceType = " waveAudio ";
0 q9 V! G& Z* B8 R6 j: Q mciOpenParam.lpstrElementName = NULL;
# e( \* Q* w9 \. d' x6 x% F1 v  A //初始化MCI设备7 ^9 J. G5 g* H4 }. z
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);7 k' n; ]8 ~' l3 m' }$ K9 q1 X
if (dwRecordFlag)//初始化失败
/ _  {* k, S7 q  A; X  return dwRecordFlag;//返回错误代码% D/ K2 B( X6 X
m_wDeviceID = mciOpenParam.wDeviceID;
' h# {7 J2 r  ~ MCI_RECORD_PARMS mciRecordParam;
; c& R# }' u+ E //开始记录数据1 e1 g# e% N; b2 N, h
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);4 w9 N' \9 U: a5 @7 O
if (dwRecordFlag)//记录数据失败
- H' s+ j  p( D4 y- s: G. p# w4 B  return dwRecordFlag;//返回错误代码
7 N  L. T9 ?1 T8 P: D m_bRecord = TRUE;
% t( Q4 u( Q  ]+ b% J m_bOpen = TRUE;
4 D5 f3 ?6 L' m9 d7 c; l return 0;
0 s. z/ R) e( O  Y# z}
( A! Q$ l" s- {! wDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件( S2 @6 |. f5 O" D) C% s) p
{! X+ x4 T8 @/ }3 d' l. ?1 n
    if (m_bRecord)//正在录音" r; s& Y8 x1 |6 c, E8 ]- y- W
        return 0;//返回
2 ]( s& l; Y& q+ Q StopWave();//停止录音' u; \) }& ^4 q( L
MCI_SAVE_PARMS mciSaveParam;
* o+ q, @& s0 X6 j6 ^$ B mciSaveParam.lpfilename = strFileName;//设置保存的文件
- ^. X. c# y5 ]% O //保存WAV数据到文件
" n3 ^5 H6 ?% U, N0 `* x, G, l DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
! S5 J" K' A. r' R if (dwSaveFlag)//保存失败  ?) J4 r" S! d* Y/ |6 s8 a! Z
  return dwSaveFlag;//返回错误代码
- y, {4 H  j' d- x4 M m_bRecord = FALSE;
9 [1 J1 x0 W4 r7 R5 X return 0;
# F# E  r# i0 r/ V* X) S2 [}9 g9 |6 r8 T& h0 ~
DWORD CMyMCIWave::CloseWave()$ Y2 i- X. L' n2 S; R# @' |* U
{0 S% k. R1 C: s- _+ a/ C9 F) f' k
if (m_wDeviceID)//有MCI设备在工作1 A- @( a* R) d8 F* Z' k, @4 |
{+ }( R6 ^4 Y# [% d! s
  DWORD dwCloseFlag;( I8 p2 K5 P* e" R
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
/ T9 n( C( e6 k3 D( d  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
+ y; R3 G' [$ w  |  if (dwCloseFlag)
/ }- u+ O5 s; b9 k7 E4 P  {
2 p+ e8 ~4 a: R% L/ A! n7 D4 X   AfxMessageBox("关闭时出现错误");' ?3 A- [) Y; c& L
   return dwCloseFlag;
8 L9 t/ ~% ]& x( o5 ?  }
( Y' |% {, [! [4 H! W6 J }
+ h. h( N' S/ y* R0 x //设置状态变量. w+ @- g( I  d
m_bRecord = FALSE;
( A7 A5 ~- N% H6 \7 W m_bOpen = FALSE;7 Z" l" E& w' ?& u- ^0 x/ Q
m_bPlaying = FALSE;( [2 T- x* |: W
m_wDeviceID = NULL;
0 `/ M4 t. }9 j. U; J return 0;
# ~/ T) @7 ^2 r* }}8 H2 y! m* p/ S& f
DWORD CMyMCIWave::GetSampleRate()//获取采样率* M  c3 p/ {2 @, c; y1 u. @) [
{
4 H4 e) O# i  V1 F: ] MCI_STATUS_PARMS mciStatusParam;
2 p8 u7 t5 f; H mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率, J6 v' K$ F1 R7 \9 P3 M
//MCI设备的状态信息(采样频率)
+ f7 o4 l" R" e# v" i DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);1 z' C. p5 B; u) b; I7 f
if (dwStatusFlag)$ i- X4 P! R. c5 |* I
  return dwStatusFlag;//返回错误代码/ n. g' e+ {  K) d) \0 u3 G
else/ v! V. y, L- I
  return mciStatusParam.dwReturn;//返回采样频率
" V2 M+ k- [5 Z}6 N; `$ J& l5 A/ v' Q2 o
DWORD CMyMCIWave::GetChannel()//获取声道数! o/ C  B* u' u- U1 t9 e! E
{
. R6 `* B# j: ^6 s/ G! z MCI_STATUS_PARMS mciStatusParam;
6 i& N# r7 z2 L5 n mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
$ H% J4 b" w2 m0 O9 n //MCI设备的状态信息(声道数)- y5 o+ Q5 Q( _0 }2 ~
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);/ H6 d( Z  h* h4 W, A# ^
if (dwStatusFlag)% D+ o* E" \( q4 C
  return dwStatusFlag;
. L7 Y0 G8 F% A& K- I9 {# w- K else
- |. C: ?. x  c: v$ u' U  return mciStatusParam.dwReturn;//返回声道数
& Q) K4 @8 h( B- ]}
" x: J" `' H' L2 C" a6 \DWORD CMyMCIWave::GetBitLength()//获取声音位长* e3 M! }8 ]8 x' M  ]6 {
{! j5 G1 b' \  j- z# S
MCI_STATUS_PARMS mciStatusParam;
: M# X" n# Q& M2 E mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
# S1 F5 z# a) w //MCI设备的状态信息(声音位长)
; N5 s! {) H" |. ^0 V8 | DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);# `. U  o1 x' D4 W8 {; E- l
if (dwStatusFlag)
! H, w, K' f: K( M/ }' l0 H! Q  return dwStatusFlag;2 C4 S' j* M/ o- f% r: V6 H
else
" w( {0 y2 u6 z7 E& q, i  return mciStatusParam.dwReturn;//返回位长
2 L) j9 i) Y0 b. t9 ^}
8 N4 P/ ^7 c% i6 ~, ZDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长% W: U4 a/ l( a5 x( U
{- g8 y1 D$ D$ _) c( W5 Q% p
MCI_STATUS_PARMS mciStatusParam;/ O; x- k" C% {/ _# H9 w+ ?
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
# r. K4 U  k& Z# r2 ?5 w; g //返回MCI设备的状态信息(音频长度)
" R) I- q( Y3 X* V& ~. y! K% c DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
- ~4 M  K- A# d2 M2 U1 I if (dwStatusFlag)& U/ k/ ]6 N0 q, c. q
  return dwStatusFlag;
8 w- _/ h% {8 g# v* G0 V7 Z else
: @; y, e% D% {+ A  return mciStatusParam.dwReturn;//返回音频长度6 n6 o) ^1 E7 M6 v# {  `" g  z
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 03:16 , Processed in 0.014941 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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