找回密码
 注册
搜索
查看: 2674|回复: 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.% y3 U) E6 S. E8 m  S! H# G
//
) x5 [# L' j2 x) ~5 a/ J* N+ l& p//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
9 x4 A0 l" G# U& b# G$ \) z#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000' \7 T( @$ H2 o9 \& o; ^7 w: D
#pragma once  f* N/ M% ]; ?3 E
#endif // _MSC_VER > 1000
: i9 H$ @+ D+ i! y2 T#include <Mmsystem.h>   
4 W* k- }% H% C5 y  Q& u/ \#pragma   comment(lib,   "Winmm.lib")   
% k2 F5 y; S" m! Wclass CMyMCIWave  
1 r4 g  w! I, A. d0 U( I{5 h4 r+ T5 k1 f
public:$ `1 \# P& {& L; z
CMyMCIWave();//构造函数
2 A: h6 P* _, z2 Z; v/ r' G4 w3 h$ S virtual ~CMyMCIWave();//析构函数  ^, m# T/ ~% N/ l( s: E& L
DWORD OpenWave(CString strFileName);                  //打开文件
! O$ F8 L* D0 D+ C6 m; p2 }" ^ DWORD CloseWave();                  //关闭文件
" B: E" H, c& Z' A& N- |! r DWORD PlayWave();                   //播放3 K. r( I3 V6 E7 N
void  StopWave();                   //停止播放% V* @1 Q, r  ^, i
DWORD RecordWave();                 //录制8 B! C0 z% P9 G6 g# p" t
DWORD SaveWave(CString strFileName);  //保存
9 P8 H) S& |0 M1 g DWORD  GetBitLength();          //得到位长
& I8 x8 \4 x7 Z. `# e) I8 E" R* \ DWORD GetSampleRate();          //得到采样率
. I3 D, W8 P# u! m5 V DWORD  GetChannel();             //得到当前声道
, c" r+ q' ~; Y5 g1 I DWORD GetWaveLength();         //得到音频长度
: X4 m9 u& a2 Tpublic:
( t2 E9 e# }7 f' C; c- @ BOOL m_bPlaying;               //是否正在播放/ K' c: i! a: R( i% O5 s5 k9 f
BOOL m_bRecord;                //是否在录音2 ]* g" n' N1 @; C; i5 @* f
BOOL m_bOpen;                 //文件是否打开
  Y+ V" D0 \  ?$ j9 m WORD m_wDeviceID;            //播放设备ID' t& Y4 F' q. l# o5 h6 z+ z$ U
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
0 w# ~% i  D2 |; y//
1 `2 o4 |1 W+ L0 K+ w//////////////////////////////////////////////////////////////////////#include "stdafx.h"
" Y. O1 j: T: k; E#include "MCIWavPlay.h"
5 }' H- @9 W( h2 [" Z#include "MyMCIWave.h"#ifdef _DEBUG
- {* q6 v5 {) {- p#undef THIS_FILE
6 d4 k0 g( n# m' s# \9 D1 vstatic char THIS_FILE[]=__FILE__;+ v# K. l6 E  W" N5 m. E. @
#define new DEBUG_NEW+ o# w2 T" k4 [3 ^+ ^, f7 T# V7 p
#endif//////////////////////////////////////////////////////////////////////
* l+ n) l0 P% P, x' i" z// Construction/Destruction
& u8 A5 W7 Q" J, K2 L//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()" B" ~4 _- _9 i
{; k3 u' f& P$ H, S3 b
//进行状态指示变量的初始化
3 i4 G; Y# n* H m_bPlaying = FALSE;, _. g; N! o% [$ B+ q+ K
    m_bRecord = FALSE;
: C- w9 T' J& y0 q! a' n( y1 ^    m_bOpen = FALSE;
  e; i8 |4 B: i/ s% W    m_wDeviceID = 0;
3 J' p- n% e3 _3 M3 g2 @' K  F) ]4 q}CMyMCIWave::~CMyMCIWave()
% A5 w2 m4 R2 X$ i{
/ R% M# R3 m. n# P% Y  W" ~, Z3 y CloseWave();//关闭WAV文件& v2 K; S$ M7 E1 I, ~3 A
}' y3 S. c9 W8 ]$ q" z- a" n/ z8 d9 C
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
& [+ G! y3 u. U$ e{1 L! \/ p/ H3 ^; L7 z& B0 l& B
if (m_bOpen)//如果文件已经打开* \9 e' B  ^% ?, J  D8 }% D
{
8 E  Z  ~7 Z6 T7 `) Y% z- J  CloseWave();//关闭该文件2 a( e+ r( a; p+ [9 x0 n$ K: O2 R
}
0 ?! L! Y) j0 H- F/ d DWORD dwOpenFlag;//打开标记
, @: m7 t, N4 c: \7 p; y MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构, N) @) ?$ h# n% b# n8 S; H
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型7 E  j% n+ d% P8 J" O2 E4 s
mciOpenParam.lpstrElementName = strFileName;//打开文件名1 D+ ^6 {" V2 O3 r
//初始化MCI设备9 ]' D/ }) H1 O0 U
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);* _& X* q: r6 m0 U! R* [
if (dwOpenFlag)//初始化失败
' h6 S& F+ G& b! M: i  return dwOpenFlag;//返回错误代码" i4 S2 |' D& h$ ~8 _9 v# E8 U9 ]
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
; L1 i/ g% r7 p/ u7 d* M7 } m_bOpen = TRUE;
2 V4 x/ x2 F' L$ R/ V% ~ dwOpenFlag = 0;
) B. Y' o3 t- x; B7 h$ w MCI_SET_PARMS mciSetParam;" c9 \0 O8 h7 l% ^( ]& O
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒& ~& w. L/ k3 [, f/ j1 p6 \$ g' V
//改变时间控制设置
) v, T; K' w* L! L: t8 n0 z& [ dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
! ]& a8 z$ [' b9 L$ R& D7 R( ~ if (dwOpenFlag)//设置失败
  ~* V# G# ~1 q# k6 F3 a  return dwOpenFlag;//返回错误代码& N/ J  [" K' n) U5 c1 B0 U
return 0;7 A% V5 q' \9 l; F: T/ v
}DWORD CMyMCIWave::PlayWave()//播放波形文件
8 q" [1 Y/ [, p6 U  b7 G{" a& ^& D, x, t& _( O
MCI_PLAY_PARMS mciPlayParam;
5 A, p8 Y1 j& V$ |0 W) ? DWORD dwPlayFlag;0 T- a# w# _, j
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
$ h7 O8 {  J! P" ? if (dwPlayFlag)//播放失败$ ]$ ~4 [0 @5 T+ m
  return dwPlayFlag;//返回错误代码1 @+ {4 M  Z; @! @
else8 n7 u# Z. d7 p; {( f
{
, t9 F" x4 K$ W6 W* s  m_bPlaying = TRUE;
6 Y! Z6 R  `0 S( F* |2 P  return 0;
7 P* T) h: v" T. _ }4 L2 h( f, Q. I3 L; \
}
" G! C: P/ G  ]void CMyMCIWave::StopWave()//停止播放波形文件! i: @, r( [( R$ L+ f& H6 r
{
9 F  A" _" `$ P8 x( w4 A# | mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
5 b2 M: J4 J* R8 ~3 q! b  j}
# @3 x/ ]! W. u9 HDWORD CMyMCIWave::RecordWave()7 K) S" {, L' [/ `( f+ s) a
{2 f' S  E' ]( e* X  w
if (m_bOpen)//如果有文件打开- g8 m; `7 {' p5 r& k' R
  CloseWave();//关闭文件( N7 P  L, C5 e
DWORD dwRecordFlag;; P- A4 [. F$ O( ]
MCI_OPEN_PARMS mciOpenParam;( [+ {$ x6 M! t" J0 k
mciOpenParam.lpstrDeviceType = " waveAudio ";+ Z! }3 v) m. ~; a' K' n
mciOpenParam.lpstrElementName = NULL;$ R7 \7 v4 S# G1 b1 ~& W6 U
//初始化MCI设备
, N9 Y& w9 E: B$ z& Q; k7 z' Q dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
! u" h$ i4 V: V! |) b0 L if (dwRecordFlag)//初始化失败
: \( R$ {4 V6 x8 u/ \, m7 o) L' y  return dwRecordFlag;//返回错误代码7 o- p! G; t- n7 f" k6 Z
m_wDeviceID = mciOpenParam.wDeviceID;
5 \" Q) s* a7 I; q% ~/ |) n MCI_RECORD_PARMS mciRecordParam;) g" H( _" d$ u) Z3 ^
//开始记录数据
5 h7 ~) O5 W* W) {4 O' ] dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
! m2 ~. w4 @; r  Q if (dwRecordFlag)//记录数据失败
  }( V6 s) n" @9 N- {7 P) i  return dwRecordFlag;//返回错误代码3 z  D1 ~! e8 Z
m_bRecord = TRUE;3 a& c( W/ Y1 ~
m_bOpen = TRUE;
. w3 e) Q0 \# x( Z5 \: u4 L  L return 0;
. {8 m; F7 o/ W7 C' d+ z}
0 N1 t8 j" N; S% d  ~  s) F  W* nDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
9 x& v0 h5 _( \1 p+ k" ~{) {5 Z6 y; a& S( k3 L3 h
    if (m_bRecord)//正在录音
* J8 Z* x0 X; j5 Q5 [        return 0;//返回* N1 a# W2 F; G3 W* ^/ Z+ r: L
StopWave();//停止录音" t  q' w( i& R$ o6 ]0 g
MCI_SAVE_PARMS mciSaveParam;
  r0 X0 @( n) O* Y1 c( d! B mciSaveParam.lpfilename = strFileName;//设置保存的文件9 T- y" H# W2 C' \# Q
//保存WAV数据到文件
8 ~/ y* G( _' s7 C DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
4 L0 F& n$ {7 d; o$ ` if (dwSaveFlag)//保存失败
6 G: e" W  q" L3 m2 |$ t& ^  return dwSaveFlag;//返回错误代码
4 r: o6 d: R2 w m_bRecord = FALSE;
. A' i3 H- y8 g, w return 0;  y+ s, ~* O- j; M7 X5 S8 w
}- U- Y; E# a  Q
DWORD CMyMCIWave::CloseWave()# B9 ~0 n; J1 h4 u) |
{0 H+ s$ n- b  s( n7 G% M4 _& M
if (m_wDeviceID)//有MCI设备在工作: c# d% k2 _8 w. G; ]; r9 H
{4 ?9 E" ~. L4 }, m
  DWORD dwCloseFlag;! f8 J; E, p: y) n
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作. |$ [: x) H: U5 h( e
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
- K: l/ o0 l0 {) H1 g# S  if (dwCloseFlag)
: c# ~  M: d1 B- J9 _  {
4 v- |3 L% t" N( }$ X2 k   AfxMessageBox("关闭时出现错误");- a. C1 R# X, R) z$ j& s
   return dwCloseFlag;
2 ^( m* u4 O+ T. G9 |  }$ v) b- b( p/ A
}7 [! \4 I+ N/ d  }
//设置状态变量: c6 [. q6 V! I& U& k1 g
m_bRecord = FALSE;: `) ]( T( N4 y, R; c/ o4 S
m_bOpen = FALSE;7 a; P  ]7 F0 \/ Z7 ^9 I
m_bPlaying = FALSE;
1 k9 I! e3 [" R! z( q+ y! \, Q m_wDeviceID = NULL;
$ q7 m: |: I8 [9 ^+ M return 0;
# _: B" A9 I1 f/ O}, _! P7 y! y5 ]0 p4 [5 y
DWORD CMyMCIWave::GetSampleRate()//获取采样率
7 I: a8 g7 B- d4 E{! @# b" @6 J& b, e$ Z" N9 a
MCI_STATUS_PARMS mciStatusParam;
8 _+ [5 M/ z. g. P/ M' x mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
8 Q" r( U% Q5 ?7 S7 `6 l //MCI设备的状态信息(采样频率)
1 ]- X! [6 w9 ~" b  L1 ]; W DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
0 A6 W; _) N% k# V! y: p if (dwStatusFlag)
4 ~6 w# C# \* n  return dwStatusFlag;//返回错误代码
! `. D. {0 X* j, x* m# R else" D. Z# t# g4 w9 r5 d% L. }" O
  return mciStatusParam.dwReturn;//返回采样频率% v( i- C. g1 c- p% J, y
}
) B$ |4 ~) m3 p+ x. nDWORD CMyMCIWave::GetChannel()//获取声道数
+ g- O7 M( M& p. P' k, J4 P$ O{
2 M! k& p8 U/ N' G MCI_STATUS_PARMS mciStatusParam;
: M! f# P5 g* L7 X1 J: U mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
: u" S0 ?. y5 k) J0 W# L //MCI设备的状态信息(声道数)+ `5 ?1 }! N  q: v# j0 I' D0 R! U
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
( U- [/ \$ {2 y9 ^- W' o if (dwStatusFlag). s) c- O% }3 ]. v# F
  return dwStatusFlag;
  V! q  z7 N/ C$ t else
0 h$ Y6 Y" L3 {3 w8 i  return mciStatusParam.dwReturn;//返回声道数
% S% @# D/ L$ \% a3 j/ R4 _}( z: B& p3 v; |: O& C
DWORD CMyMCIWave::GetBitLength()//获取声音位长
1 ]/ O$ E: O1 Y- E% K" h7 \{
3 S4 Y3 W  k7 x* ] MCI_STATUS_PARMS mciStatusParam;
5 Z& y1 E2 y) H+ H mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长1 A5 N+ H! k! q) j0 o9 t: W' j# W
//MCI设备的状态信息(声音位长)
' G7 X- g0 L9 }, v DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
9 c3 o' s& k6 Y if (dwStatusFlag)
( y( {  z3 \& Z& F0 s4 k3 C  return dwStatusFlag;0 [; I" l/ r/ e& d, V0 \4 N1 I
else
; g  b! \3 C" y2 U: |6 P  return mciStatusParam.dwReturn;//返回位长$ ~* Y3 l; G  v
}
+ l% b: q* P3 _% D1 Q* h" K  `DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长9 {- V& a  J( b
{
! y2 B# f5 R7 L4 T MCI_STATUS_PARMS mciStatusParam;
2 Z: I3 k' U$ ^  c4 C- } mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度& i+ Y5 Z5 p  l- x# D# W) S6 X
//返回MCI设备的状态信息(音频长度)
, l& V7 \1 T: q6 S4 _7 B DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
7 F& L4 t4 m) L: k: s* R: f5 \ if (dwStatusFlag)+ l3 h' w% \' P- I! B4 v" j" J/ F
  return dwStatusFlag;" }3 L0 I7 S7 |
else  y$ M1 Y8 g* _, }# ?( M5 i
  return mciStatusParam.dwReturn;//返回音频长度2 C/ L9 i  ]/ @* S
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 08:48 , Processed in 0.036185 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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