找回密码
 注册
查看: 3239|回复: 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.0 j. Z* o5 ]4 L3 H; Z( x
//; F# g5 @/ R: g3 P
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)3 k2 O8 S1 ?' K- k
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
$ B& m- _& B3 n) w+ Q5 j4 R#pragma once
# \% Q6 g- x) n% l$ x5 a' O& I#endif // _MSC_VER > 1000
" M  r2 n; {& r#include <Mmsystem.h>   & ~0 F- c7 }* d3 W* ^0 V- R4 X
#pragma   comment(lib,   "Winmm.lib")   4 \2 k( `/ |9 V5 r/ j3 j5 {8 ]- o
class CMyMCIWave  
2 O5 j! c  T; C/ R. H; E  ^( O{# J% i9 t: A. U; D2 E6 T
public:
8 X( X9 t7 g7 T! X CMyMCIWave();//构造函数6 e0 t- g0 i& _# ^) C1 t
virtual ~CMyMCIWave();//析构函数8 R9 [5 x6 N0 F" T+ K9 C$ E; J8 }
DWORD OpenWave(CString strFileName);                  //打开文件$ _( O! b9 s$ u: o
DWORD CloseWave();                  //关闭文件/ j1 l6 I9 e# ?
DWORD PlayWave();                   //播放% D# ~' X5 c. L" N
void  StopWave();                   //停止播放  Z* C2 Z! W9 X* O% Y' @
DWORD RecordWave();                 //录制! N$ y/ [+ T$ `. ^, o" L% u
DWORD SaveWave(CString strFileName);  //保存
4 r4 r, {5 _1 e, Q& e- k- g DWORD  GetBitLength();          //得到位长% f  C8 r. o# {$ ?, K4 T
DWORD GetSampleRate();          //得到采样率
& b7 G2 a, f* F) E6 `. Q DWORD  GetChannel();             //得到当前声道
! w& x' @$ g' u6 o! j# L DWORD GetWaveLength();         //得到音频长度: t! ~) A6 x: T, f7 ?
public:% ]. r: e6 J3 n( K$ k6 |
BOOL m_bPlaying;               //是否正在播放- q6 l; a7 G" H2 A* r# C
BOOL m_bRecord;                //是否在录音6 w' e, Z9 k# R0 d5 u4 a
BOOL m_bOpen;                 //文件是否打开# Z  B, ^, e$ ^
WORD m_wDeviceID;            //播放设备ID
* A2 _' w& ~9 |* Y; i# J5 l' s};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
# F6 C8 d& x5 Y0 h! z//  V0 Y3 j& f& I4 @  j8 z7 N, `) ~
//////////////////////////////////////////////////////////////////////#include "stdafx.h"2 C) i- R! n$ r" O
#include "MCIWavPlay.h"
5 `9 x. Z6 t7 k$ j' g- `$ F) B#include "MyMCIWave.h"#ifdef _DEBUG
2 f2 U* ~( e2 L5 Y#undef THIS_FILE1 i: N6 d6 U0 ?6 I
static char THIS_FILE[]=__FILE__;7 Q- j* w( w( s1 c! p5 w/ M2 w$ u* r' t
#define new DEBUG_NEW
& R6 f' c+ B% _6 g, z( Q. X#endif//////////////////////////////////////////////////////////////////////
2 f# [6 ?- q9 B( X// Construction/Destruction
3 o- i. }0 u! R//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
, Z8 C# Y+ w  {/ ^6 O1 `4 ?; z{
  x6 J. K- p4 g( }; d$ A //进行状态指示变量的初始化4 k0 ]; {6 _! N3 j: k- `; n1 ]
m_bPlaying = FALSE;
; ?, ^: g& `% B    m_bRecord = FALSE;
2 N) g" ?8 r3 P/ ~! X    m_bOpen = FALSE;
% C3 C6 E9 O" P- ^; }, H    m_wDeviceID = 0;+ I, |8 N/ n" s
}CMyMCIWave::~CMyMCIWave()
2 T$ e! ]; k; m{& |2 P4 j' v; Q# ]* a$ z
CloseWave();//关闭WAV文件
' \1 \2 K5 ^! ~. z( L}- u* i, A$ b9 e! `* l
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件/ S9 R9 {% A7 r- r" m& f* d* ^  w
{
2 Z4 x. E* m1 P' ? if (m_bOpen)//如果文件已经打开: c0 c* [5 e7 l# H/ w# n2 M; c+ v1 _  K
{6 A  N: d/ \# ~5 h8 i" B' i
  CloseWave();//关闭该文件
4 i1 _& g. s; f/ Q5 x1 Q }1 N1 X2 ?/ u" |& e
DWORD dwOpenFlag;//打开标记% Z2 y9 u+ _: K
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构$ A, ^% d. A- u6 F. Q2 ^
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型5 i$ U# o: x1 f: c
mciOpenParam.lpstrElementName = strFileName;//打开文件名
( a# k2 C! ^9 y( _% c2 I //初始化MCI设备6 l* ^" z( c# K* G( u
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
' A, @$ R' Q0 l8 C* d$ A) [7 z$ M if (dwOpenFlag)//初始化失败+ W1 W0 X1 I( w1 F  \& J# f- L% ^
  return dwOpenFlag;//返回错误代码5 `0 i3 N# s1 Q* @. r
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID5 S% k( H! h( X+ W) ]4 s
m_bOpen = TRUE;; }5 J: [& n8 s0 d
dwOpenFlag = 0;
" W. `4 }- o( B MCI_SET_PARMS mciSetParam;: U! x6 [7 X% ~# }4 x5 k$ h0 G
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
8 n; i3 d( C2 m! g& G( @. p //改变时间控制设置2 }. k& D- r! K# Z* n
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);  _4 m7 V- ]( z1 d  H
if (dwOpenFlag)//设置失败
5 f7 u9 x7 n. J2 U  return dwOpenFlag;//返回错误代码
% ^6 m2 J0 P5 N" S; u9 v# [3 m return 0;
1 \, j$ {8 m5 t}DWORD CMyMCIWave::PlayWave()//播放波形文件" y* I/ r, F# a- A& }$ N" R7 P
{$ c  i$ j" ~% e% P
MCI_PLAY_PARMS mciPlayParam;
( T- E9 k; F1 P9 H( e DWORD dwPlayFlag;- y) B8 C1 G  |+ E
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
/ T! e, S: y! I0 A$ S if (dwPlayFlag)//播放失败
7 P/ A  m( ]4 N6 z3 e. {4 S  return dwPlayFlag;//返回错误代码
) C# Z! I2 `" e9 v else4 o9 D# J0 E" |
{3 N8 [- o% L$ Q( @8 c5 k5 n' {
  m_bPlaying = TRUE;2 s% e8 e9 e, J7 O  w4 R8 R( g# `
  return 0;0 V% n  S0 p; s  C7 h
}
- p! m; e# u$ Q}
: @$ |" c! k# i% m* Jvoid CMyMCIWave::StopWave()//停止播放波形文件. C8 o7 \. q' D
{
6 }1 F" J$ D9 D! x) q mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放6 b, d& F8 a: p! v2 I' ~1 [5 L
}
6 K: R5 ]6 r. ]9 ~$ x9 ~DWORD CMyMCIWave::RecordWave()
! U1 ^6 g3 B1 V! N! y9 e{
4 D$ ?6 X1 Q- @3 {9 {. p; {9 R if (m_bOpen)//如果有文件打开
* i; c; B9 e1 e" `% a' p  CloseWave();//关闭文件
; o' s2 f: }2 _- o DWORD dwRecordFlag;
4 l* k# P0 p( ]8 ~4 |# W( a; } MCI_OPEN_PARMS mciOpenParam;
- S/ L3 Y0 d9 c mciOpenParam.lpstrDeviceType = " waveAudio ";
" d" S6 y0 g2 [! a, k7 M mciOpenParam.lpstrElementName = NULL;( u) D9 P& {7 F1 Q$ @( H! |
//初始化MCI设备+ A2 Q) W* ?# m
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
0 g$ D! `5 ]( {4 Y9 Y- {7 @ if (dwRecordFlag)//初始化失败2 l3 d! O1 T, ^9 j6 ?* P# H
  return dwRecordFlag;//返回错误代码
3 N2 J; ~+ y; u% q6 N. s( } m_wDeviceID = mciOpenParam.wDeviceID;
4 @/ S  \- t  N+ w7 b MCI_RECORD_PARMS mciRecordParam;7 {: m' x* w8 y: L6 ~+ {9 _% |! k" ^3 T
//开始记录数据) A8 {$ w8 P9 c. W0 q
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
, t/ u# L* v4 v+ @" s0 } if (dwRecordFlag)//记录数据失败& _$ R0 B( l; k8 {
  return dwRecordFlag;//返回错误代码
% W' ^& z4 n" T; c# Y( t m_bRecord = TRUE;6 m/ d' ]9 p9 F  x: M
m_bOpen = TRUE;
/ v# e- h6 u; k* |1 P1 ]+ M return 0;" T) J6 l$ l/ E+ i
}
9 r/ a1 X6 g5 h# d  TDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件3 T# l4 ]2 U* k
{
9 y5 }. V) W; c- D    if (m_bRecord)//正在录音
" h. t  F8 s3 p        return 0;//返回  `* Y1 O6 J! y" o5 z& y* |
StopWave();//停止录音
' ^+ }) U0 d: J( Z/ P MCI_SAVE_PARMS mciSaveParam;
) u% f0 I$ K' S2 Z, ?& @5 C mciSaveParam.lpfilename = strFileName;//设置保存的文件* G, r. s; s8 d% _2 o) @4 B0 I- A
//保存WAV数据到文件
3 i7 u8 Y4 r* A/ c2 J DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);2 L2 Z$ R+ t/ P9 N! X% L, j* m9 N3 A1 ~
if (dwSaveFlag)//保存失败
; @4 t  ^/ P9 c( [" b, ~% h  return dwSaveFlag;//返回错误代码' m1 w9 J% q# V! E- i
m_bRecord = FALSE;
1 ], \, n( h1 w1 }2 |+ L return 0;4 a( {- p1 k* P0 Z
}
6 L8 @7 @( Y: n1 i1 e2 h5 Q- X' gDWORD CMyMCIWave::CloseWave()5 r  L6 h0 z- [; x2 U! n8 w' H& t) w6 N+ Y
{3 W8 s+ Y) b* `* u+ C3 T0 O& b
if (m_wDeviceID)//有MCI设备在工作
- ~% w8 q" h' u4 e5 U' ^+ g7 L {
+ w2 L+ t9 @$ g8 K  DWORD dwCloseFlag;
$ z1 G" D2 S: t  P' d+ T. ]  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作$ |7 [0 s+ X. Q3 f0 ]
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
% }+ n1 M  [. z0 \( s/ o' M$ Z2 s* ]  if (dwCloseFlag)
' i2 @9 y2 {2 h( e" M7 h0 Z  {
& ~; p! K# o0 [# y   AfxMessageBox("关闭时出现错误");& a9 P/ \3 ?# h: e/ E1 ~: A
   return dwCloseFlag;
9 R" d: M- E, F' u1 a9 V' O  }
$ C5 b1 d8 G8 ?; E) W3 ~! v- V }
0 X/ q" C" a  N7 p& Q3 { //设置状态变量
! d9 S8 @9 ^2 R3 t- I$ T7 }5 ?. l m_bRecord = FALSE;$ z3 A8 X: U: f* {, F2 Z- `( e
m_bOpen = FALSE;
0 u, o, P% `1 P* L m_bPlaying = FALSE;
9 |/ g+ x) o* O' d. W6 ?* B m_wDeviceID = NULL;' |9 u, h. \  e' O) c& D! w; G
return 0;/ ]  b( X5 L% v) q& r. Q( C& @
}) Q7 h5 I9 q4 s. n# d% w
DWORD CMyMCIWave::GetSampleRate()//获取采样率% y* X- ]! D/ |
{
3 b) M/ M: _7 U MCI_STATUS_PARMS mciStatusParam;
  x7 X/ \6 t8 z. J' z" F$ e mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
% K2 L5 z. F0 d* y! Q) U //MCI设备的状态信息(采样频率)
/ r4 N& ]* }# n DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);$ M4 i! a5 K+ p1 t4 @( z
if (dwStatusFlag)1 x: B. D4 r  r* t, ]- X- G: L
  return dwStatusFlag;//返回错误代码7 e3 M5 ^1 p$ h
else6 r2 \; ]6 g* d( W
  return mciStatusParam.dwReturn;//返回采样频率
! }2 D- F* z+ W, d}
/ P2 U5 E% Y: bDWORD CMyMCIWave::GetChannel()//获取声道数
) N6 {6 A9 W" P6 W$ X{, V6 F$ A1 i  C
MCI_STATUS_PARMS mciStatusParam;" D9 M3 h0 Q: T9 s8 S  Z  O) S
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数- ~/ @: G0 g( R. ]
//MCI设备的状态信息(声道数)
8 D0 U; Q% h. [$ i+ m  { DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
+ y' i& x/ `- T: t( A3 D% R if (dwStatusFlag)
) B6 [& s* R2 ]2 L+ c9 j$ L  return dwStatusFlag;
7 F* |$ ]. s+ }/ A# n else
' D& H0 H7 h" D  return mciStatusParam.dwReturn;//返回声道数
; [) p9 W! ^! @: O% x% B}( v" v5 M6 q; v" D5 ?1 A8 y; Y5 D& o1 S
DWORD CMyMCIWave::GetBitLength()//获取声音位长
; U# D/ ~" P( d: k{
# C! p4 V( K/ D& ]4 j/ f) t. F& K MCI_STATUS_PARMS mciStatusParam;" [: ]# {/ c  ~- t) T& l
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长2 t6 f: q  S# O! ]4 l- f. a
//MCI设备的状态信息(声音位长)% a+ r" y- c& V' N3 j
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);" I+ G# z( A% d% e7 q4 V* a
if (dwStatusFlag)
: r  O- C$ e# ?  return dwStatusFlag;
2 k* j1 e- F/ S7 x2 ?- V: W7 O; U! L else
+ B5 ?9 |4 k4 T  N/ z4 k+ @2 {+ Q  return mciStatusParam.dwReturn;//返回位长! S) }' W$ v& c6 g6 |6 R
}
8 U. [' F+ s( J. ~DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
+ s1 {: L5 |1 |+ k6 |{
5 p' j" N  b; u+ m MCI_STATUS_PARMS mciStatusParam;
% M5 @7 ~: W0 H: Z6 T3 Y" m mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
- c- J+ M2 ?' N5 L- |+ h3 V# R //返回MCI设备的状态信息(音频长度)2 W6 R4 X7 R& g" N' B  p
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);! Y4 {2 X' h/ W
if (dwStatusFlag)
; A, U' j7 K5 q( D# f3 k! L! t. f4 x  return dwStatusFlag;
/ W  M( b" V' j/ T* c( | else
+ Q, y6 D+ x4 `" d4 x; H: e  return mciStatusParam.dwReturn;//返回音频长度0 m9 S. ]2 t5 y1 x$ a, {6 R! {
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 05:01 , Processed in 0.016159 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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