找回密码
 注册
搜索
查看: 2672|回复: 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 w% j, J8 O- T" N
//7 P( ?+ z/ N8 P; [( n* j+ E. E
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
2 T! i' D: T+ W#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000( {( G# p6 S+ L
#pragma once. E6 Y* |: k) T6 s# H/ d  l  U7 d
#endif // _MSC_VER > 1000! a$ M) S* {( q8 `$ T
#include <Mmsystem.h>   
! u" A. g  u  D! k- M1 y  w4 l6 X. n#pragma   comment(lib,   "Winmm.lib")   - m* [9 @9 a, j) Y) m
class CMyMCIWave  
* w9 K, q/ P6 c$ U3 m- I0 }{# i- F+ K: f/ y3 g! n9 U) T
public:. M* B. Y/ I, S
CMyMCIWave();//构造函数
) O5 X7 A& R- M1 k. t virtual ~CMyMCIWave();//析构函数6 h" ~- e# l& U) L' b& b
DWORD OpenWave(CString strFileName);                  //打开文件. x' o( C( w- M9 f$ R' [# s+ j* S
DWORD CloseWave();                  //关闭文件
$ D" h2 [1 C2 l) y4 w9 C DWORD PlayWave();                   //播放
3 t% Z9 U/ S3 p! k. I) U% W void  StopWave();                   //停止播放
) O- U) J# ^( G( p/ j) ] DWORD RecordWave();                 //录制
2 J" B6 X4 B: N DWORD SaveWave(CString strFileName);  //保存
0 d% ?0 H* L) Q; c+ N9 C7 B/ Y DWORD  GetBitLength();          //得到位长
" l5 T; f0 G( E: \! V% ?7 M DWORD GetSampleRate();          //得到采样率
& R' J7 {2 B, L# E* N DWORD  GetChannel();             //得到当前声道  K5 {' W' r3 z, E0 ~: d0 P
DWORD GetWaveLength();         //得到音频长度
+ M2 o! g% z" g# d1 ~/ e8 Npublic:% f9 h' }9 L, [% K% v
BOOL m_bPlaying;               //是否正在播放: s0 g* {3 L& V" D/ ]' `
BOOL m_bRecord;                //是否在录音
: s) r% b2 h( ^ BOOL m_bOpen;                 //文件是否打开, ?( v7 D/ i" s; k
WORD m_wDeviceID;            //播放设备ID, G& Z7 s3 ^" A0 c( ?: I( a! U
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.0 e, r! M1 e! I- E
//
  I& X: w( E5 F2 L" _6 h$ C//////////////////////////////////////////////////////////////////////#include "stdafx.h"6 `$ z; \0 R+ I1 ^
#include "MCIWavPlay.h"
" N# U/ ?! C3 r. v' Q; D, {- G# f& L#include "MyMCIWave.h"#ifdef _DEBUG7 L$ ?& e6 d- \: [3 q1 e# M& B
#undef THIS_FILE; j, T# S; j% I2 x" B
static char THIS_FILE[]=__FILE__;, H3 }. g( z6 h+ {& w( T# D
#define new DEBUG_NEW5 g2 s: @4 c8 I. J8 ~
#endif//////////////////////////////////////////////////////////////////////
/ `1 l3 y1 [4 _1 R: I* ~// Construction/Destruction# N5 e" h- T' |3 x, R5 j3 k
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
) H2 H( `; Z( |  I3 U8 T( L: z0 Q{1 c7 J+ j6 p6 D
//进行状态指示变量的初始化
4 |; v0 ~; R2 z5 `; C m_bPlaying = FALSE;
9 i, {+ v$ V! l% e& c    m_bRecord = FALSE;
5 Y9 m7 L7 a. a/ D, W6 Q$ z2 }    m_bOpen = FALSE;. m, x- N$ Q+ r6 N  u
    m_wDeviceID = 0;! U# P- q2 m; @7 T  v  |# x
}CMyMCIWave::~CMyMCIWave()
  J4 h- a5 C( H{
9 q! ]' }2 M9 w3 |; b CloseWave();//关闭WAV文件
/ p$ K: {5 m  ]# j! `# F4 i}* K. t1 W( D1 R3 w# D! G/ A
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件- \4 U; g9 w. r6 `
{
; J, h8 v1 Z. t# Y9 ~4 H4 c: ` if (m_bOpen)//如果文件已经打开
9 X9 @* O3 r6 A {8 r: g1 G" y5 x* A5 \
  CloseWave();//关闭该文件! e5 `9 D  R3 ^
}
2 I7 C' d/ ?; G, P DWORD dwOpenFlag;//打开标记
3 q3 o( s9 }7 y  i2 d% B MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构& D7 E9 H) b! R- W% r' O, n7 A
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
, N5 t  E& j( o' t! _ mciOpenParam.lpstrElementName = strFileName;//打开文件名
9 B4 i5 {9 N( o' L  J' f( n //初始化MCI设备/ n0 w2 L8 @: a: T4 T5 e& t
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
7 A" |2 o, S4 l& O: A if (dwOpenFlag)//初始化失败: L8 O8 a# }+ x9 E( ?6 Q
  return dwOpenFlag;//返回错误代码* q( H. a* J4 D7 m/ b) w
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID( z; T1 l; ^, ^2 e
m_bOpen = TRUE;
) p1 a; J8 l3 Q9 U5 A) r3 n dwOpenFlag = 0;
) V% B! j" _' Q. T MCI_SET_PARMS mciSetParam;. g' f) q' ^% ^$ r2 o) O
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒2 A* X5 G; p, P1 m6 `8 o& I
//改变时间控制设置3 F$ o4 F( M( k4 i! F- E. s  _
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
, ]! ?0 o7 o8 _, n- H if (dwOpenFlag)//设置失败
2 e& s' H$ A1 y, o  ^( u( N. L  return dwOpenFlag;//返回错误代码
$ Y" X# s% P9 f* @) E% K* U return 0;
1 j: _8 x" ^" _; B+ i}DWORD CMyMCIWave::PlayWave()//播放波形文件9 b/ h$ }) _: d6 C3 v4 F
{& X) ?8 R' K! Z% }$ E
MCI_PLAY_PARMS mciPlayParam;
1 A1 M: D$ x* \1 \  w DWORD dwPlayFlag;
, p) n+ x! F6 f( [# J# V dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据0 M/ u6 p( n/ c! R/ m
if (dwPlayFlag)//播放失败
; p6 B* c5 ]& ?! h  return dwPlayFlag;//返回错误代码# t" D  O7 J: {4 r8 I; J
else
9 {7 }' v- I! D5 i9 i1 `4 V {
/ c& ?* S( b4 F- T* y  m_bPlaying = TRUE;
( u* d" s" }8 F) U3 p* q  return 0;$ E5 j. a. P7 ~. C8 b" K* J0 D
}1 Z0 j7 a- j4 Z) W$ U
}
& [5 B0 y( u% T) k1 {' ~void CMyMCIWave::StopWave()//停止播放波形文件
$ @! \2 D1 x/ ~5 A{: {6 {$ @6 X: k2 I6 F8 G
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
7 V$ b2 a. N4 D' E0 @! Q}
9 h4 H9 ^0 u" Z' J" WDWORD CMyMCIWave::RecordWave()
7 R8 t0 [9 B. D' Z3 ~& M{8 ^( p1 @* T& _1 @& l- \
if (m_bOpen)//如果有文件打开
8 e' ?) u3 K2 x# f  [/ W" ?  CloseWave();//关闭文件
8 t. [, E/ v( U, O% R* Z5 h DWORD dwRecordFlag;" F* i" o$ W5 _4 z
MCI_OPEN_PARMS mciOpenParam;
" I! r6 W7 ]% C+ W% E) m! P mciOpenParam.lpstrDeviceType = " waveAudio ";6 q% \; r; O  ?+ o
mciOpenParam.lpstrElementName = NULL;
6 T# d) H5 Y# \ //初始化MCI设备
: j; W- d; R1 U0 H" a- T) P3 \9 { dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
1 D# G  n; F2 k5 \7 A% D) e6 A- A# Q* R if (dwRecordFlag)//初始化失败: E/ ]+ _* M5 B1 c$ \0 ]' F3 [
  return dwRecordFlag;//返回错误代码8 L% B1 C9 e8 [; Y# p: W
m_wDeviceID = mciOpenParam.wDeviceID;6 S3 C; @9 l; y, e
MCI_RECORD_PARMS mciRecordParam;
9 H# R9 r; M( p6 p8 b //开始记录数据
3 Q3 v( Q: G0 H9 h# R- E dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);% ]* N/ W& F' l
if (dwRecordFlag)//记录数据失败
* p* x" R; K8 w# k% m" s  return dwRecordFlag;//返回错误代码, u- ?6 m( x, E; {3 M3 u" Q) J
m_bRecord = TRUE;
+ V7 C9 `, u% u2 p; o1 \ m_bOpen = TRUE;
- }2 {5 O% ]" G2 N- t return 0;
& a# t( t* ]" {6 _  r9 m- j}, x; ?  f/ |% a7 `* |
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件" t9 X. }% s; Q4 ]3 T- }
{
3 ?  }, I) L3 I/ ^+ {% K    if (m_bRecord)//正在录音
! v* }6 u5 l4 @) x+ Y        return 0;//返回
5 |$ ^9 Q+ r6 ~) N4 Z2 S StopWave();//停止录音
+ s" ?: o5 H, O8 p2 i MCI_SAVE_PARMS mciSaveParam;- |; z5 k* `- M' I2 p9 H7 I4 @( _
mciSaveParam.lpfilename = strFileName;//设置保存的文件
7 e1 I+ ~. [: t) S9 o7 | //保存WAV数据到文件
+ N4 c, {" e8 B" [6 |7 H1 e DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
9 \4 y9 V" G/ S if (dwSaveFlag)//保存失败
/ d3 t6 u$ F' j0 z, e0 o+ Y) _  return dwSaveFlag;//返回错误代码
* I  o/ o% C' g m_bRecord = FALSE;
) ^+ T2 B  b7 }4 Z5 c; X" |# Y return 0;
% `% Q4 }0 p0 K}$ r  T0 V8 M# O8 R) N
DWORD CMyMCIWave::CloseWave(). q, |6 E0 B# D7 @, G* Y
{
0 q$ u- w( T  y. `: t8 e if (m_wDeviceID)//有MCI设备在工作
$ l. z- t/ P" A- s- ]% H {5 t1 ]* Z" f/ {" h
  DWORD dwCloseFlag;
# \: f+ G2 G6 C/ G3 {8 p! D  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
  h  p& C5 o6 V1 ]  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备0 Z- k  b4 I& A3 ~  M
  if (dwCloseFlag)
* H, I# Y% }) S6 @8 i( I! y  {4 c* p! A6 b6 g
   AfxMessageBox("关闭时出现错误");
% I) ~, f( |& ]7 w# D/ e6 [   return dwCloseFlag;
) j0 N+ I( J' h( g  }7 J6 {& q& O; Y: Y! L/ N7 ~8 t
}# r: b" e3 a. E' _6 E6 R
//设置状态变量' y$ X5 v4 }* k2 I
m_bRecord = FALSE;
3 d% W: d3 ]% {5 d3 ]% h, C+ J m_bOpen = FALSE;3 V+ L1 m9 q. E
m_bPlaying = FALSE;- y9 W. E% D" F" v5 |& N
m_wDeviceID = NULL;
4 `1 d& S; T) Q' Y5 _6 A( [0 b return 0;6 h9 O* J7 u( q
}' E9 u5 i" i3 I/ U
DWORD CMyMCIWave::GetSampleRate()//获取采样率$ g0 H, R0 C( r% N% f* L2 O' B
{. x& D7 _% r8 K3 g0 C8 }
MCI_STATUS_PARMS mciStatusParam;7 }3 f" L% k0 W' Q
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
9 G1 e6 Y# o. ^, C //MCI设备的状态信息(采样频率)
# }5 Z* v3 o% R+ }' E DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);7 N. V, c. q. W3 ^1 ]5 o, Q& Y
if (dwStatusFlag)) J; B6 q: ~! G2 F( B1 s: ^
  return dwStatusFlag;//返回错误代码# q- o# t( E# e9 W: y0 ?( B3 ^
else
  D9 ~% D# o6 B  return mciStatusParam.dwReturn;//返回采样频率. ?* ^! N- ^; h3 H
}5 L, i4 _# a- ]' `% w
DWORD CMyMCIWave::GetChannel()//获取声道数; s% X0 L% D* z! E
{
2 ?# Q4 a8 l3 @* Z MCI_STATUS_PARMS mciStatusParam;9 t3 S# Y0 g& k7 {2 q; l1 R
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数) y! `* I0 D0 ^, b
//MCI设备的状态信息(声道数)2 W+ ]2 U& X& y/ F* E7 E( \
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 d% h7 x, g: B3 |3 X
if (dwStatusFlag)
9 m$ N9 f1 F# ^2 C& H  return dwStatusFlag;
* D  T0 ]  A* L* P  [2 Q) m4 m else& [4 V! K7 c$ m7 H2 V! U- Q
  return mciStatusParam.dwReturn;//返回声道数
! z' c  e9 J- S+ T}
5 D* z  {+ d. |/ s; Y. }5 J: tDWORD CMyMCIWave::GetBitLength()//获取声音位长/ I5 L) I1 P5 ?8 [7 I
{6 v, J- c" b5 V; E
MCI_STATUS_PARMS mciStatusParam;% Y$ O, Y8 v8 P+ t8 d. b6 b2 J. r
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长1 Z+ g8 E, R2 \5 y
//MCI设备的状态信息(声音位长)% `5 i' {7 G1 _$ v. n% g2 b2 J$ O
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
5 o- U( @9 {9 q: K/ Z$ b if (dwStatusFlag)
" S& K1 x: J/ E$ \1 I  return dwStatusFlag;" V& e3 F# `, D5 ?9 d
else
' m+ x4 |* W6 d% {  e  return mciStatusParam.dwReturn;//返回位长( L# G1 ^. c9 x3 ^9 P. k  \
}+ U4 l3 b2 h4 F: K3 I
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
2 Y( O9 Z6 |  p8 L! r2 `8 L" i{
+ o8 D( U0 N. q" _- u9 h2 I MCI_STATUS_PARMS mciStatusParam;
& Q" B9 Q. H% L% y mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度; v+ C4 R" O0 m& F; I0 R2 V
//返回MCI设备的状态信息(音频长度)
3 B* |+ T+ K% M0 Y0 @/ C$ P0 R& E$ Q DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);0 B# E0 k9 N' u) Y9 y$ C8 l$ @
if (dwStatusFlag)
7 o# k0 x5 n* f# `0 G" B  return dwStatusFlag;4 R4 T4 |) J  F$ ]+ L: G4 W
else
$ l8 `( {2 v8 h+ \3 H+ {" ?( r7 O  return mciStatusParam.dwReturn;//返回音频长度1 g( h  v+ n" W- b
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 06:24 , Processed in 0.035748 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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