找回密码
 注册
搜索
查看: 3053|回复: 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# i" I, l7 A0 X//; b( x% e( ]) i) M. V; u
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)- V2 k# ~7 v' u$ X2 B6 _
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000, V8 V5 E6 U/ f$ a( b# P
#pragma once
2 O8 v# i# C7 }% Z+ h#endif // _MSC_VER > 1000% w1 @1 v0 a$ |5 Y* F. G: ^& I
#include <Mmsystem.h>   1 ~; ]2 P$ w: `( s% m4 P. K
#pragma   comment(lib,   "Winmm.lib")   
8 ?( R1 I' {' H0 _class CMyMCIWave    `5 d! i4 G, ^+ T- m' ~2 A
{$ ~8 s5 L) R& T1 m' V1 k) a0 r8 B- ~0 L
public:9 R& f1 F4 `+ F! I  ?
CMyMCIWave();//构造函数  W& j5 g1 S/ Y2 k* [3 u
virtual ~CMyMCIWave();//析构函数+ @8 m, D, m3 n$ @
DWORD OpenWave(CString strFileName);                  //打开文件
  e& i6 f' z) D+ z5 z+ p, ^ DWORD CloseWave();                  //关闭文件+ Y( @# `2 p- P4 K
DWORD PlayWave();                   //播放
7 F+ S' Q+ t" F$ |  y void  StopWave();                   //停止播放
% O! w4 Y4 g/ ^+ B& D% k! Y- [ DWORD RecordWave();                 //录制: q; y; a# G- l' p; @; l, ?7 j% b
DWORD SaveWave(CString strFileName);  //保存5 |' l1 H6 ~" ]& F* S0 M
DWORD  GetBitLength();          //得到位长
, Q0 N% M9 E; e DWORD GetSampleRate();          //得到采样率
' `  @% N0 K  ?2 l7 V' O DWORD  GetChannel();             //得到当前声道! x" R" x7 i7 C# g' n
DWORD GetWaveLength();         //得到音频长度
; r) ?! w3 _! m; Mpublic:
, m/ ^' e( A$ a* u6 i' j% Q- H. { BOOL m_bPlaying;               //是否正在播放( b9 }2 l4 `/ S, a9 q! ~  d
BOOL m_bRecord;                //是否在录音6 l" G, ]8 G6 S7 l, I8 k
BOOL m_bOpen;                 //文件是否打开
) n' j% F% ^2 k; B8 @9 J WORD m_wDeviceID;            //播放设备ID" Y  H7 \' x# p7 S4 W, l4 A+ y
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
: \) x/ {# e% P//
4 w9 f  M( ?! S& q% S' p//////////////////////////////////////////////////////////////////////#include "stdafx.h"  B% S9 E: j$ b9 e' m5 E! o8 [
#include "MCIWavPlay.h"4 ?# s. G7 G; K, X
#include "MyMCIWave.h"#ifdef _DEBUG1 I9 R- V6 Z+ G  F
#undef THIS_FILE
* K5 R6 y/ B5 o! j. K! w0 b. @static char THIS_FILE[]=__FILE__;$ L7 O% B! {, j) ~" _, `; I$ U( R
#define new DEBUG_NEW
2 G- o1 h$ ]% t& J# W1 L. B# Y#endif//////////////////////////////////////////////////////////////////////
, o# b1 S# S! F0 z// Construction/Destruction9 t: T9 h8 l, N3 u7 }3 z2 C
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
9 A  C. y& s5 F9 m4 i, p/ i' g0 U( G{
  F# [. r6 D; ?! u7 X8 t- N //进行状态指示变量的初始化* w# {' o" d9 j% j. c
m_bPlaying = FALSE;
' C6 m, T9 H3 T% ]/ N    m_bRecord = FALSE;! [6 S- s" o5 k2 [- o
    m_bOpen = FALSE;9 x' B7 u% H; \* Z
    m_wDeviceID = 0;
1 ?7 F. B9 S/ F( _}CMyMCIWave::~CMyMCIWave()) n2 j; F0 {: {- }% E. Q$ g  I+ _
{
; C: N# i7 a! p* G CloseWave();//关闭WAV文件4 Q7 }% Z- J7 n$ p
}: l% |  ^1 R* w7 o
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件. y: P' ~0 S( t% j
{8 y9 ~# J4 @0 f) M  E/ I
if (m_bOpen)//如果文件已经打开) u% X9 |" j+ ]" u6 d
{; f0 X! [2 k: Q0 g( h, t
  CloseWave();//关闭该文件
* A, s& Q9 q. k) Z6 @; Z* N2 I) {6 m  x/ v }
8 Z. ?9 q" O# V( F4 I. V. H8 M! K DWORD dwOpenFlag;//打开标记: w! [" M. {5 W5 L
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
- [, G# n, |: e- h mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
; l  s- a3 `8 s: f mciOpenParam.lpstrElementName = strFileName;//打开文件名' ]" Z5 U) S5 C3 w- C2 v5 |+ j
//初始化MCI设备: x) i; z( n( W* a, d
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);, ?. s3 z; X& j' k& v) L# N+ l  w
if (dwOpenFlag)//初始化失败
# I6 F' B# }& \% W1 P  return dwOpenFlag;//返回错误代码
1 ~9 E& a- ]; P m_wDeviceID = mciOpenParam.wDeviceID;//设备ID& `3 ]+ @, E  L( j
m_bOpen = TRUE;+ j- j$ V5 z2 b& u" B
dwOpenFlag = 0;; l, Q7 e' h; N. N
MCI_SET_PARMS mciSetParam;# g) Q- L+ W9 {# s6 K1 {
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒4 M( Q5 @0 P6 ^; ]6 W& Y* r
//改变时间控制设置
- c; y0 j" \- H; ? dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);) b- p4 l7 W7 _5 Y1 ~
if (dwOpenFlag)//设置失败
' ^& d. g! i* B: R) W  Q  return dwOpenFlag;//返回错误代码
9 Y% ?: j& g% ^+ C  |) x  f+ j5 a return 0;
, M; ^5 R2 ^" p4 S3 i9 M! S5 e$ Y}DWORD CMyMCIWave::PlayWave()//播放波形文件
' L/ {  T% s! V3 y  @{7 r- U+ K/ ?3 p) B& t  r4 o4 r- q
MCI_PLAY_PARMS mciPlayParam;
' E0 ?) r& S; o DWORD dwPlayFlag;, d# F6 \% J+ I# L% a
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
, q. z: C, L& t/ o1 y  P if (dwPlayFlag)//播放失败
; |* z/ _' ]' M  return dwPlayFlag;//返回错误代码
1 c# o3 q5 p# p% k' N  a1 y else5 ^7 `# E) ~. K% d( i
{) p2 P& V" d2 t1 p6 V
  m_bPlaying = TRUE;
; Q5 m! W  p3 `- _/ C2 ~  return 0;
7 E% j- s( |; Y- l* f }
' z7 s: j1 G; C+ c7 @4 P7 [, B}& y' s# _, v, w
void CMyMCIWave::StopWave()//停止播放波形文件
9 R* O7 S9 O/ `, i{, T+ Z0 k: r" D8 K3 N' D3 S2 s
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放% ]0 L8 {; Q) z# B
}. }0 G/ r: c# x6 c$ T
DWORD CMyMCIWave::RecordWave()
) F7 l# j! e4 z/ \4 `{6 f$ c" g: i& z9 p
if (m_bOpen)//如果有文件打开5 h& T' ^7 h% F) R
  CloseWave();//关闭文件. f6 W5 u( N& C7 Y
DWORD dwRecordFlag;" e* @# F1 g/ Q0 e) G* x' ]
MCI_OPEN_PARMS mciOpenParam;& a2 H; ~' g6 G' r
mciOpenParam.lpstrDeviceType = " waveAudio ";2 ^2 f0 u3 o4 E! `! `; a
mciOpenParam.lpstrElementName = NULL;
5 V; H4 {6 ~+ o: J# o //初始化MCI设备8 t6 d4 f7 t$ N6 K+ p* W3 r% g1 }
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);7 t7 j& d3 \8 @& ~; F7 O- B# F! A
if (dwRecordFlag)//初始化失败5 C) g0 A% E; F; s
  return dwRecordFlag;//返回错误代码
# m. X% V% ^/ y m_wDeviceID = mciOpenParam.wDeviceID;! |8 O# W9 C8 N6 w
MCI_RECORD_PARMS mciRecordParam;& |* v" N" p# i. y' w, k& k+ G
//开始记录数据
8 o! S9 }. v. W" [/ }1 b dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
6 d" p* d* z0 a' O& q  ]2 y if (dwRecordFlag)//记录数据失败; u- O8 m4 [6 m
  return dwRecordFlag;//返回错误代码
! ]$ j: }2 }$ g7 m; x m_bRecord = TRUE;
2 s& [4 [  e: C& w* s m_bOpen = TRUE;$ c' R, q1 k* K2 @1 X
return 0;$ y2 ?& d1 z* q2 E7 L
}/ H- q& v1 V* O( n+ d+ a7 E! {
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
) O( Y- a- T! E{
" P! O' C$ s: V6 N: V) C( I! o    if (m_bRecord)//正在录音- C1 ?2 @+ M1 ]0 t5 u! O
        return 0;//返回
+ l. m& @1 n, N0 E& s8 }+ \5 z" l, s StopWave();//停止录音
2 |4 A* [! H0 Q7 P( z/ q6 | MCI_SAVE_PARMS mciSaveParam;* Z1 F: k1 ~+ B! Y+ J0 [0 u$ @
mciSaveParam.lpfilename = strFileName;//设置保存的文件
4 u/ ^% H3 P! y; R+ Q //保存WAV数据到文件
4 W6 h6 @$ v+ x7 {. U: W6 n DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
" E% l# w" }7 }! f if (dwSaveFlag)//保存失败
+ ^: S  f1 ~5 w! N" }5 n( a* a  return dwSaveFlag;//返回错误代码% H* f4 t  R$ N1 N
m_bRecord = FALSE;( ^+ ]* P) u; S
return 0;
4 ]0 u/ J5 h7 G6 m* M5 y}
# o* n4 q8 i8 x2 k# j* ODWORD CMyMCIWave::CloseWave()
& f7 q( o% ^9 @) ?2 v! _; I{
9 w- {& e4 C9 j if (m_wDeviceID)//有MCI设备在工作/ P6 @8 l: q3 h; f4 m- s0 Q
{4 Y; u/ c; b2 ?( ]3 ?8 I5 G
  DWORD dwCloseFlag;
; S: S- \1 \/ @; R" g  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
6 N# Y, O3 ?9 L8 o" n7 F; g  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备, w4 T  r9 A: a$ M/ k2 \) c
  if (dwCloseFlag)( R8 j" N9 F! i. \3 _. |% U& N
  {
; |5 o# t- ?% S* A& g   AfxMessageBox("关闭时出现错误");
* V' v; i, E, z' _  h6 A   return dwCloseFlag;
3 |$ h2 B/ h0 l! J  }
$ O1 Y) R- U7 g0 m/ ~ }
1 y' X" |2 z# k! Z# }9 M1 M( h //设置状态变量
# Y. w0 i) R4 g+ ]7 e m_bRecord = FALSE;
" D& f3 |8 x3 M3 P2 j% F5 P m_bOpen = FALSE;/ _/ y1 B/ y- X9 a1 r0 a
m_bPlaying = FALSE;
; C2 l6 t( o: a" O# {1 Y m_wDeviceID = NULL;
" m  \6 a# o/ K' V" {$ h return 0;
2 c2 \/ v. i+ t, _7 w}
0 e# i' O+ k4 e0 w! b* bDWORD CMyMCIWave::GetSampleRate()//获取采样率, |. O% c1 ^; Z9 [9 j: g
{$ e' O4 A1 }9 r& R& I* Y2 f" g
MCI_STATUS_PARMS mciStatusParam;
2 O( k( Q! y4 T$ w mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率' m  ~6 W, C- M- T' w8 W& x
//MCI设备的状态信息(采样频率)3 f& V( S5 U2 Z5 p; s$ i- J7 T
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);; o: s9 H6 c0 T- b
if (dwStatusFlag)1 y6 E1 R& A6 t* R! T/ z
  return dwStatusFlag;//返回错误代码4 `# {' J* Q( [/ L* z
else$ m: |4 l" G* S' A+ _: F, z
  return mciStatusParam.dwReturn;//返回采样频率: O7 e2 x$ C9 ?# g, F+ u0 k/ ^
}( y. R8 ~0 I. V' G  i* G$ h
DWORD CMyMCIWave::GetChannel()//获取声道数
( y4 ~0 \$ g# k9 I$ f0 u" J8 e{4 }0 t% b$ P' t, j; ?
MCI_STATUS_PARMS mciStatusParam;
5 A! h$ L* C* f2 z8 s# m) b mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数! U8 E% ]3 o: ]3 [8 P
//MCI设备的状态信息(声道数)0 P" S1 v4 A* Z& x- y
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
" x7 I2 v; I* ~! L7 @ if (dwStatusFlag)  y, ]& j! }, ]: Q4 u* ^. r) G
  return dwStatusFlag;! }- `7 |; y+ o5 @
else
# n% j/ d- E. O2 Z' l( b  return mciStatusParam.dwReturn;//返回声道数
' _/ [8 r8 \$ x0 T}
4 f; J. n/ [7 I1 H; KDWORD CMyMCIWave::GetBitLength()//获取声音位长2 w0 j- F. n5 G$ E; `, u
{
2 \, u1 U. O5 `6 j5 c MCI_STATUS_PARMS mciStatusParam;
. \- p9 n# L5 o; w5 E& b mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
, L& T5 Z0 Z1 F9 Z( C. o/ P //MCI设备的状态信息(声音位长)$ M( J& f# C, T! c6 d
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);6 x  g" P4 |. m6 Y1 Z
if (dwStatusFlag)
1 P2 Y! J( E+ T9 ?$ G  return dwStatusFlag;- N* e( O  V  h. O7 A5 @% c* n
else
- E/ @' ^* ?- J0 m  return mciStatusParam.dwReturn;//返回位长# G1 v6 _8 C7 Q# a% O+ C, k
}
- \# Y4 |5 I$ s- Y: `DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
8 D9 R( n5 N( q- r" i{: }8 n* c4 ?/ A' F# w
MCI_STATUS_PARMS mciStatusParam;
; N- |$ O3 {/ A; h# \' V7 w+ T mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度2 u0 G% s" A$ V* l$ A8 r
//返回MCI设备的状态信息(音频长度)
) F* W" `  S- c" N  {- _0 r$ S8 O DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);' F! S$ H' q; H" W: S
if (dwStatusFlag)  f* [! c7 }. S  z
  return dwStatusFlag;0 G2 Y) o  b; Q6 W$ k( V8 c
else. ~: e9 v5 c6 Y5 L) r! q& ~; c
  return mciStatusParam.dwReturn;//返回音频长度
7 z6 z" L# c1 g  W}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 07:42 , Processed in 0.017430 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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