找回密码
 注册
搜索
查看: 2443|回复: 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.
1 b  i. ~1 u; B. ^//1 f1 g& R( L* B
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
( s, A, d5 h$ l#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
* z$ J0 ^3 g+ c/ q. C8 f! C#pragma once
3 {5 n8 B% T4 i" d#endif // _MSC_VER > 1000( o" T$ g4 e& }  _( b
#include <Mmsystem.h>   & ~2 c$ a  v4 n9 h8 j" r8 I
#pragma   comment(lib,   "Winmm.lib")   0 T" j, r- F$ v, \+ h8 Q0 P9 _
class CMyMCIWave  5 M% R; k( e. Z( S. `
{
: v2 K7 X" w2 t. k. m1 ypublic:5 ~0 s" X# ^, `  O& ~- n, a  Y
CMyMCIWave();//构造函数
& N  C# w. {: s, V8 V" c virtual ~CMyMCIWave();//析构函数
- |4 s/ y  \: Y% ~' d# ?" _ DWORD OpenWave(CString strFileName);                  //打开文件
) y! }9 J. r- U* f) v8 }. D DWORD CloseWave();                  //关闭文件
) ]3 b  O) T& I DWORD PlayWave();                   //播放3 |, s. T" Q9 j# p5 K
void  StopWave();                   //停止播放7 |/ r  a7 E8 d( G
DWORD RecordWave();                 //录制
! G' c& l4 h! q2 Y  { DWORD SaveWave(CString strFileName);  //保存8 ]  _5 p3 v1 @1 y
DWORD  GetBitLength();          //得到位长1 K2 D- ]6 S% ]: Y
DWORD GetSampleRate();          //得到采样率/ c% W) _' M; H
DWORD  GetChannel();             //得到当前声道
! x9 J3 G8 E0 W$ Z0 Z DWORD GetWaveLength();         //得到音频长度
$ r; m. m6 E7 a# x, s2 w. xpublic:
! B  m) m$ v: h/ s, y/ z BOOL m_bPlaying;               //是否正在播放
5 |& o, h( @$ N BOOL m_bRecord;                //是否在录音, p& O* h5 S2 B
BOOL m_bOpen;                 //文件是否打开
( e* I9 @) {' O5 M2 F$ }) d WORD m_wDeviceID;            //播放设备ID0 i; a' y$ l/ E1 m
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
% t: X' y$ z! q+ K( i  b//( f/ k# b- D+ H! D$ l( Q
//////////////////////////////////////////////////////////////////////#include "stdafx.h"9 k0 V0 T1 u% t0 K# P
#include "MCIWavPlay.h". K; d1 a7 b  ^3 K- k3 D
#include "MyMCIWave.h"#ifdef _DEBUG
0 Z( ]" M3 {4 O) w- c#undef THIS_FILE
5 c# ^! z$ e0 Q( w  [( x) Gstatic char THIS_FILE[]=__FILE__;
/ D1 {% j& r+ U% c- g0 @0 R/ R#define new DEBUG_NEW
( E" F' ]+ \+ P% q' ^: H7 m5 D#endif//////////////////////////////////////////////////////////////////////! Y6 Y; i/ p" C( @+ E4 Y
// Construction/Destruction
) a4 }2 r! J3 T& c" T9 d//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
  B1 P' S. V4 F% r{
) Y6 R0 V1 D, |: ^) I, Z //进行状态指示变量的初始化$ W& G+ g2 w; k6 U
m_bPlaying = FALSE;
' y5 c" h0 d9 h8 h' W+ m. U0 e3 A    m_bRecord = FALSE;/ N; |% e. ]( `% u
    m_bOpen = FALSE;
# U6 G) ?0 P+ r' s0 V6 w, m! b0 r    m_wDeviceID = 0;4 S2 p8 q) u4 X" H5 G  K
}CMyMCIWave::~CMyMCIWave(). w+ W; D3 K' \* T( ^3 A) z
{$ b/ Y4 F  L: E1 F+ T
CloseWave();//关闭WAV文件
7 l: i) \7 z; f! q9 m# I2 b. p}
/ I* ~+ R9 x* t0 V7 z2 `DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
$ a+ i8 o3 I+ L{
9 J6 R% H, S; Z6 I( |* U if (m_bOpen)//如果文件已经打开5 K: ~. N. {& R. j& |1 T
{6 i  w' R( p  I5 U& r) v
  CloseWave();//关闭该文件
/ i+ p6 u' q- ?% @ }. {: y/ v1 c, {
DWORD dwOpenFlag;//打开标记
4 {9 }+ e: Z, q MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构  h5 j* q- G$ o1 N3 f1 T7 j
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型: Z+ O: }: v; W" H3 E6 s6 z, Q5 ?
mciOpenParam.lpstrElementName = strFileName;//打开文件名
" D  c+ }$ e4 F  K5 a6 D- i0 } //初始化MCI设备" u% Q# B9 u) G! s2 ^
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);, H  x* e2 M5 y; V% n; Q
if (dwOpenFlag)//初始化失败5 {( U" e, g* Z# Q. O! j5 q* \' ]
  return dwOpenFlag;//返回错误代码
: I: ]+ k. `1 K( y m_wDeviceID = mciOpenParam.wDeviceID;//设备ID9 X5 e$ b9 E! `) b* o' g
m_bOpen = TRUE;
$ V  {0 m6 E' a: a/ u dwOpenFlag = 0;
& c: g& o/ r% B. r" H- A2 e3 C1 W MCI_SET_PARMS mciSetParam;$ K8 F# I& F% s0 \  U/ N( X! X
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
+ ?( }+ e0 a( i  x) F; r //改变时间控制设置
0 ^9 N3 v% R7 F/ v) W. D2 N dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);) I. O* j7 C' T& Q
if (dwOpenFlag)//设置失败
' q, k% n: X% w6 l' I! Q3 u  return dwOpenFlag;//返回错误代码
1 k% }' U/ G9 S9 s8 }) M$ W return 0;/ V" @; Y  z) Y' R$ s
}DWORD CMyMCIWave::PlayWave()//播放波形文件
9 s/ [) K/ I, Y  V9 N{
& i0 J1 }' I. l8 |, A  n+ E MCI_PLAY_PARMS mciPlayParam;" a3 M4 _+ _& z( f8 R
DWORD dwPlayFlag;
* D5 y3 ]* g1 P7 X. s- e! {: p dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据6 I! ~, E- Y- U. z- w# U. v- v7 R
if (dwPlayFlag)//播放失败
$ {: q! h4 U5 ]% \1 Z# y  return dwPlayFlag;//返回错误代码& F: E/ j- m. ~6 |5 p0 c
else
* F4 L8 o& |' N8 Z2 E0 N5 B {- d( v6 T# _% J3 g* ?# X& X; @
  m_bPlaying = TRUE;
+ _( o& C2 V  h  R- w: Y/ G  return 0;
! }1 f9 f) o7 q0 b3 \/ X }8 z1 U/ ~& v5 `# Z- Z( Z
}9 |: s& h$ Z# \8 a5 L: a4 u( r% J
void CMyMCIWave::StopWave()//停止播放波形文件
  a0 w3 t4 S  o! Z7 s8 |{
' H1 Z3 _6 f' U* ]* @ mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放1 Z$ C# g$ D8 V! j( \2 C: E
}" I* a. _! ]8 f; Q( ]! K0 h
DWORD CMyMCIWave::RecordWave()- H% [+ q4 \; v5 e8 F# k/ r! B% O
{  O1 ]" [0 a$ H5 x6 m
if (m_bOpen)//如果有文件打开# {0 o/ L  t- d9 T1 \
  CloseWave();//关闭文件
0 C& d) t( |+ r# {1 ?) a/ O) u DWORD dwRecordFlag;0 ?7 @+ e- A; r' {
MCI_OPEN_PARMS mciOpenParam;: W5 Y. N+ B, u
mciOpenParam.lpstrDeviceType = " waveAudio ";* B' V1 K  p; h7 I% V% w
mciOpenParam.lpstrElementName = NULL;
7 I+ [- r! m9 E //初始化MCI设备0 k) T9 @) S/ W. f% c
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);2 p; U; k: O% F8 `$ b
if (dwRecordFlag)//初始化失败
8 ~: i! W6 A9 F4 c9 [  return dwRecordFlag;//返回错误代码) |3 T  i" d6 a/ L8 m" ~
m_wDeviceID = mciOpenParam.wDeviceID;
3 \: M) S5 d* g3 p0 l3 T' v: m! H% T MCI_RECORD_PARMS mciRecordParam;
7 ]) e3 v0 y# ]7 |5 L1 H //开始记录数据
+ P! w" S: c/ w dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);5 @# }3 G3 b9 b2 r8 ?
if (dwRecordFlag)//记录数据失败2 R. D1 B. w( R& N
  return dwRecordFlag;//返回错误代码' A9 M; N# J8 r4 ?! b2 F
m_bRecord = TRUE;
% F  ]7 K+ Z* m7 K& |0 E' h% T m_bOpen = TRUE;7 B0 r, M6 K6 o
return 0;( V( K1 U" P* p! n5 k4 @; z3 R
}
1 y9 P7 o4 y3 \2 O( n6 t! }DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件1 c# Y. |1 d+ w
{
/ J! N3 o1 d. S' t, L: M! V    if (m_bRecord)//正在录音
4 E% r# c  z/ D& q. o        return 0;//返回3 a- ], k& l0 e9 f
StopWave();//停止录音/ S4 i$ a! ^- B
MCI_SAVE_PARMS mciSaveParam;% o3 h( N" V' ^
mciSaveParam.lpfilename = strFileName;//设置保存的文件
) R8 l7 ^7 i( v //保存WAV数据到文件
; ~7 w) X$ D8 f* e) Y, M6 L DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);$ z  t+ A+ \" L/ E/ G- Q- p
if (dwSaveFlag)//保存失败* [2 W8 m% M, J6 t& f& i0 X# L
  return dwSaveFlag;//返回错误代码
3 v% E( w7 b% }; ^' H% n m_bRecord = FALSE;
7 Z. o" X2 Q! ]$ @2 X return 0;
; i7 l; f) ~( h% Y& I  h+ n}  T- [+ u1 P0 u2 |; j0 E
DWORD CMyMCIWave::CloseWave(); G4 Z  A: q4 z' e+ ~  |  n+ b
{
( E8 G0 U2 ~+ q  z" m; o8 p5 r5 O9 W if (m_wDeviceID)//有MCI设备在工作/ X; ]5 o( |6 ]/ C8 N* A
{; X$ @6 w, q* }. f3 v* v2 T
  DWORD dwCloseFlag;
" o* D# R, O6 {  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
5 ?( N, G; q9 x4 ]  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
' [/ y" K9 K* ^2 [% s+ P0 g$ u) T  if (dwCloseFlag)
8 q7 Y7 Q2 o; e  {5 x  t2 _7 h# z# O4 e
   AfxMessageBox("关闭时出现错误");
/ i% A/ x& e2 h1 G4 Q- u$ M8 \/ w5 e   return dwCloseFlag;* V5 I8 Q# F% h) B
  }
: J: t4 K- Z& O. u8 ] }6 @8 o5 E3 b6 U5 }' E) t6 s
//设置状态变量& n3 g0 a3 j) Z0 i: ^/ d6 C# `0 w/ y
m_bRecord = FALSE;
8 b+ V1 k1 a# }1 y# O2 I m_bOpen = FALSE;
  t) g. P/ ^0 t0 e; L1 z: a m_bPlaying = FALSE;
1 ^& z* n& Z( C+ x- F5 D6 ~ m_wDeviceID = NULL;
: P1 x* T  D) B6 q1 V return 0;
7 A! P7 t2 I2 A, C7 R! x, P}
' B6 Z- z. F* |/ r. p+ L3 r8 x7 A* ?DWORD CMyMCIWave::GetSampleRate()//获取采样率
" d5 i* ]  O1 w' _/ e4 ]: `{
. C/ C; g4 `2 N; M MCI_STATUS_PARMS mciStatusParam;4 o2 {4 j8 ]. ^: ?
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率# [- o' s' N" O0 Y
//MCI设备的状态信息(采样频率)
; L; y: H; m* o  z+ k6 M7 Y1 b- d DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);- j& x& M/ }0 M) o
if (dwStatusFlag); I# k0 S5 d  X1 H* S; q
  return dwStatusFlag;//返回错误代码; e% n- j+ U. D: H0 J4 {& {8 E, q. o
else
7 l5 }" K  J) h3 j  return mciStatusParam.dwReturn;//返回采样频率/ c+ [. ]+ ~0 t1 z, w  n9 V9 E
}
4 G8 b' V# E9 K+ c5 K& P2 `DWORD CMyMCIWave::GetChannel()//获取声道数/ }% D; O) n" p, W5 L, J- u" z
{
- l4 t5 j! X: A. X$ m% u" p MCI_STATUS_PARMS mciStatusParam;( T6 ^9 n! Z) T4 t9 H
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数$ ]; i: |! m9 N! A6 C; ^  |
//MCI设备的状态信息(声道数)
! e8 H0 K) z0 E1 r' O6 c. o DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);5 O6 n. G3 ]+ q) F% h' m0 h
if (dwStatusFlag)5 x/ n! L5 R/ j% u- X: b% P
  return dwStatusFlag;4 L2 E, X6 N# u5 }& V& q1 O
else
$ z0 p# D0 o# p- V  return mciStatusParam.dwReturn;//返回声道数
, _! j0 T8 j8 K" R}
( ]0 P, V4 s  f3 TDWORD CMyMCIWave::GetBitLength()//获取声音位长
$ h$ B) ?/ L( g{3 ?. ^4 R* J' G$ l( Y* y
MCI_STATUS_PARMS mciStatusParam;& L+ K( I: f; R/ d$ f
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
( M9 F4 E4 x. ?" Z" q //MCI设备的状态信息(声音位长)
& R. t5 k! J1 z& Y: J* Z DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
3 {. b8 @9 N  b2 u3 R if (dwStatusFlag). ?- J- x# [" a8 z4 w9 s
  return dwStatusFlag;
$ T' ^7 A; P: e! s: I# I else9 Z7 i+ j1 [1 J* {- {1 P
  return mciStatusParam.dwReturn;//返回位长
) V! d) h6 `8 g}* U2 O. y; k. X; J4 U% ^8 o  e
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长. p5 s) f+ K# E6 t% e( d
{
. u( i7 |! _% T# ?6 m7 f  ? MCI_STATUS_PARMS mciStatusParam;
3 f  [/ u$ A9 Y( U. K; ` mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度* c0 \4 w- @: }8 @
//返回MCI设备的状态信息(音频长度)
0 p& _& h  u' R" |0 m1 l DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
8 o& [" v1 G+ |/ ^! H: B7 B if (dwStatusFlag)
2 L8 ~' f% h2 c5 Y9 T  return dwStatusFlag;
* M+ t) n+ y( L  {/ P; t else$ m% Y8 R" ]8 X; w; v7 C1 \8 x1 {! x
  return mciStatusParam.dwReturn;//返回音频长度
" D1 f1 w+ j& [}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-4 23:02 , Processed in 0.014310 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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