找回密码
 注册
搜索
查看: 2828|回复: 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.
4 X8 l. I5 X3 {( A1 J//$ t1 H3 f6 g0 }3 h. r9 |* f1 y: g
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
/ g6 P2 j. i" J' a- U#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10008 ^6 g5 a/ H5 Q
#pragma once$ R+ q' P: V- w7 s+ c; x
#endif // _MSC_VER > 1000' P! J0 ?4 R! Y) y6 x. i% R
#include <Mmsystem.h>   & N6 \4 o9 V& u! N
#pragma   comment(lib,   "Winmm.lib")   ; F1 l3 m5 r2 `0 L# Q2 L
class CMyMCIWave  
9 S, b; o0 F6 ~. a{
) _( p7 {* }7 l6 N7 S# vpublic:! ^8 }. ]3 W, h" f* O9 P% E& a; T
CMyMCIWave();//构造函数
' [; f. M0 g  z- l; Y# {6 \ virtual ~CMyMCIWave();//析构函数
3 e, K) x  t# Y1 N/ [ DWORD OpenWave(CString strFileName);                  //打开文件' T$ i+ ^( z1 m
DWORD CloseWave();                  //关闭文件
* {2 A% g9 g6 d& ^. }' h2 C DWORD PlayWave();                   //播放
  o4 O9 ^( P8 F9 z void  StopWave();                   //停止播放
* q3 }' f- X0 Y6 a6 p DWORD RecordWave();                 //录制! a1 M7 ~8 I8 E# t: H" n1 T
DWORD SaveWave(CString strFileName);  //保存1 v; q6 G  j1 ~( V) A5 {  _
DWORD  GetBitLength();          //得到位长
) c: M. j/ }* d! M6 [+ F8 \: u DWORD GetSampleRate();          //得到采样率" [) N. c; I# H% |* S9 {) H8 U
DWORD  GetChannel();             //得到当前声道
5 V; V, ^1 p  H( T3 p9 u, O DWORD GetWaveLength();         //得到音频长度; I) w7 ]/ \  D8 c5 i: j5 Y
public:
" P0 a9 K, c+ s( R0 W BOOL m_bPlaying;               //是否正在播放+ \8 \% L  o$ ?+ ]
BOOL m_bRecord;                //是否在录音
* U$ i8 G; x; i- Z3 _) D: w BOOL m_bOpen;                 //文件是否打开
7 y% _' }- {  q7 V7 n) K7 A/ a WORD m_wDeviceID;            //播放设备ID
* \  {) m8 b3 x% [5 v' B};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.6 ?& Y3 s6 J5 w) B2 ?- D  `
//
+ T" [- z  g( x8 f9 \2 @( A//////////////////////////////////////////////////////////////////////#include "stdafx.h"
' {) S4 ]* P: ?#include "MCIWavPlay.h"
1 s9 N* @0 e  R4 L" \% [+ W#include "MyMCIWave.h"#ifdef _DEBUG
3 x% U' p) [# g) G: E#undef THIS_FILE, m: ~( i) S2 v) o
static char THIS_FILE[]=__FILE__;
1 s( i+ B1 k0 T9 B+ y# E#define new DEBUG_NEW2 I, {, }$ y, A4 H5 Q) [& ^
#endif//////////////////////////////////////////////////////////////////////
4 h  e! z7 D6 `// Construction/Destruction
: B0 p; C' c% M7 b  I8 C//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
$ i# P  P, _5 s6 {{
* [- n' m2 x( ?0 \6 f //进行状态指示变量的初始化
) {) [; X6 l) }& ^$ N4 w; R m_bPlaying = FALSE;
6 w1 ]1 V5 _! E) p* l, h- @    m_bRecord = FALSE;
$ X. w5 M6 B; l  B, G    m_bOpen = FALSE;
9 m! U5 r. \# M7 `, ?    m_wDeviceID = 0;
  c& ]& L5 K: z+ O+ {& T! H}CMyMCIWave::~CMyMCIWave()
" N& ~4 v5 Y- L& F! Q3 |{# U2 l# v6 f$ z6 z' G; R
CloseWave();//关闭WAV文件
& C% B: X; ]5 u3 D: a}/ r7 a$ S! L7 z
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件1 {- O# x$ i) }3 h2 y; p
{
6 q* g$ {0 n8 L4 g0 F2 H: J if (m_bOpen)//如果文件已经打开
, P  O% |. f- i4 o5 G* i# y) @ {
5 u$ d' |6 x5 F7 R! f2 @& n2 X+ E  CloseWave();//关闭该文件- J1 h8 H: c$ a4 e/ E4 `; A
}
* a% q  y: f, m1 j" d DWORD dwOpenFlag;//打开标记4 L/ Z( A- d7 y+ f  m
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
8 {! ~" C0 E4 i6 b) X1 z0 H! A mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型* b2 ^/ {  j+ Z) O5 Y& T
mciOpenParam.lpstrElementName = strFileName;//打开文件名
# W' V7 P+ I1 Z: U8 f$ L+ R/ Q' [ //初始化MCI设备0 _, j5 G( R4 p* H
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);6 P7 G5 p' C6 |0 E% A% l
if (dwOpenFlag)//初始化失败
4 |8 P% l: U- _/ J6 ~) y1 [7 [  return dwOpenFlag;//返回错误代码0 e3 _8 y; ~" e: V" X9 p7 g( q1 M
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID) L2 k* S7 ~. H" @$ H4 `5 i# |6 q5 @
m_bOpen = TRUE;
8 V* x6 k2 J- p3 \# n5 \ dwOpenFlag = 0;
* ]9 c& a+ `# } MCI_SET_PARMS mciSetParam;: z2 U) W% m0 f, R( ^* r7 z% u5 ^9 x
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
: B0 K: N" F' \1 a9 f/ X1 Y //改变时间控制设置/ L  _6 t: ]# ~% |! x  Q# `0 ~4 ?
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
( S0 ~: O1 N" w% I- b) C if (dwOpenFlag)//设置失败: R1 v/ r  y* @7 e  z
  return dwOpenFlag;//返回错误代码
3 `8 q1 o. w# W& ?/ x7 S1 j return 0;9 Z. p7 c, @/ m5 b
}DWORD CMyMCIWave::PlayWave()//播放波形文件
4 [! b) _5 S" l0 _* x2 i2 Q; H{
3 m8 o& m3 W- V MCI_PLAY_PARMS mciPlayParam;
) w* x+ ?# f  r' l  ^" K DWORD dwPlayFlag;% d+ e# I; S4 a* D" e. y
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
- w; T3 I" {/ D- r if (dwPlayFlag)//播放失败
" C$ P6 u: a' v) G6 Z/ L) s' b* j& N  return dwPlayFlag;//返回错误代码5 ]$ E/ g$ N/ C% X
else0 J9 {) |  u" K- ~% k  A
{
0 c- P9 C8 x8 h! B  m_bPlaying = TRUE;
0 t" \. [8 D4 d, h' `! ]. {* \2 I  return 0;1 s# s" p6 ?+ E# E+ N
}* j0 t0 d( U# g0 ]' v
}
( E' i2 x, Q5 q2 H2 qvoid CMyMCIWave::StopWave()//停止播放波形文件
: R# R- {; }; i. Z) ]{. l# s# \2 }- o7 H: j7 J' {
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
, s/ \5 H7 ^6 k0 e% L& w}
2 l2 g4 |% d( c0 s' z5 t- m+ GDWORD CMyMCIWave::RecordWave()
9 c- a* Z" `2 ]! G- Z; E4 h{
- V+ R4 [, ^! R6 G5 W if (m_bOpen)//如果有文件打开; }! w% p( W0 e3 T9 _* m0 R) k
  CloseWave();//关闭文件+ U: U+ K' u- I8 N' g
DWORD dwRecordFlag;  G5 ?( E/ p8 D* ?
MCI_OPEN_PARMS mciOpenParam;9 W7 C5 {9 x+ e3 P
mciOpenParam.lpstrDeviceType = " waveAudio ";
, H: @" M, f! t' C mciOpenParam.lpstrElementName = NULL;
2 h' |+ o% M4 D  \! e; L1 ` //初始化MCI设备3 U5 L1 Z* X) s  q5 Y
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
8 m/ H: O/ a# _8 L8 x7 s/ M: b8 b8 e if (dwRecordFlag)//初始化失败: _* ~: M5 V8 w7 @; V7 v. n
  return dwRecordFlag;//返回错误代码
4 d$ ^- n$ ^3 x  |7 J m_wDeviceID = mciOpenParam.wDeviceID;9 M" s$ ~9 @, G  k8 m2 H' ]. U( x* c
MCI_RECORD_PARMS mciRecordParam;
1 C+ v) N3 l) G/ S, W //开始记录数据
, o" z) A# B  f dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
: B( d) ^& j- H2 `8 K if (dwRecordFlag)//记录数据失败3 S' I+ d8 A! |( u/ L' _  {9 A: k) z
  return dwRecordFlag;//返回错误代码
* l; E# j" [8 t: x0 U) A% n# S, u* w2 K m_bRecord = TRUE;& g% Y9 C' W: h. m' C! i8 M
m_bOpen = TRUE;
1 X+ Y5 p- p" ^) G; f' s4 X: F return 0;: _6 X. {6 p; z/ b
}9 v, E( ?% g0 W. v# `3 V! i
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
; J1 t0 |7 _* f& N5 X, r$ t{
+ T5 I- [$ e  _" |& ^    if (m_bRecord)//正在录音- s6 |/ `* S% ?+ y( i3 l  a
        return 0;//返回8 ~) Z: d0 \) S: X) r
StopWave();//停止录音8 l1 Z- ?% r8 r, b
MCI_SAVE_PARMS mciSaveParam;
5 {1 Z$ Q8 O$ ?; a/ b mciSaveParam.lpfilename = strFileName;//设置保存的文件
; f$ t* l5 K( Y& `; }* Y: d6 c6 c& E //保存WAV数据到文件
$ t' A2 V% v4 Z9 ]" ~8 r DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
; G  l* p8 J, E$ u: U( c9 O$ Y if (dwSaveFlag)//保存失败3 s, @6 U, z+ Q, b6 S0 g$ n' ^: r
  return dwSaveFlag;//返回错误代码2 G7 E; K% p; O5 y2 Y
m_bRecord = FALSE;
9 J7 W, {% A" \$ \  m return 0;
9 U$ ]- n+ a% o. O  _/ c}
# C& u" g( X, [8 a5 q+ t1 ]DWORD CMyMCIWave::CloseWave()
$ h& Q' `. H" g{3 a  F" `$ Z1 }% s: t* U
if (m_wDeviceID)//有MCI设备在工作% z0 e4 f2 B+ W! Y4 A
{- y: A# ~" @1 i+ m
  DWORD dwCloseFlag;8 t: ~' P$ u! o/ Y
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作- c# ?! R2 A8 ~: a( \% v' A
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备1 q# F1 D- w' C' }$ R, S, K
  if (dwCloseFlag)8 s- c; `+ t( X1 D" b
  {0 g' r- F, Z% k
   AfxMessageBox("关闭时出现错误");6 a- M! s3 s; `; u( |, }
   return dwCloseFlag;% r& W* k* t( f" s% F# O1 X
  }$ p1 r) F1 J4 t( _- G
}) C( s# Y7 B* ~8 N' W/ @
//设置状态变量
& h) v. }- f6 V+ C m_bRecord = FALSE;
3 C4 ^; ^2 i- @% k* _5 l m_bOpen = FALSE;
' e4 H$ z! l4 }2 W7 V4 h m_bPlaying = FALSE;3 E% v9 T( Y( Q1 _9 @5 x
m_wDeviceID = NULL;
1 W. @4 j6 W$ P& H return 0;$ }1 k6 Y/ _: x9 I
}  Z) s# Z2 L: K2 Z
DWORD CMyMCIWave::GetSampleRate()//获取采样率
4 j/ h# @" v0 F: O{
6 n0 F% ?3 f3 Q) N& _ MCI_STATUS_PARMS mciStatusParam;
. ]$ G  c" y; b mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
4 X9 J2 [" a" ~ //MCI设备的状态信息(采样频率)
/ D! S* `! `7 @: C9 S$ h DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);, B! W; Q& D- E5 ^: Y/ ?) l5 z" ^0 y
if (dwStatusFlag)2 U3 g8 Y3 c/ |, S4 a8 V* q  N' Q, b
  return dwStatusFlag;//返回错误代码
# R  w6 I1 h4 t else
* J- m. ]8 G/ a8 [3 u( d+ k: |  return mciStatusParam.dwReturn;//返回采样频率. I& M6 e  \8 r$ D4 d' D
}
2 c; w8 K; n2 ~3 D3 oDWORD CMyMCIWave::GetChannel()//获取声道数
, }; g' i- b- s0 j4 ~* s' q! b{
$ g" M( {$ R, x7 q! h9 y5 ^% L MCI_STATUS_PARMS mciStatusParam;
+ C5 T. V+ B- R; A4 g2 b8 q mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数9 L* H4 B( F8 V5 s
//MCI设备的状态信息(声道数)
* W& V3 _1 u' \) _+ t& i% h" X& w2 d DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);! s  [4 y& M' W4 z6 J
if (dwStatusFlag)
1 K$ z3 k" [* [; B: ?: h  return dwStatusFlag;
* Y2 n$ a9 ~% A else1 U5 y3 ]  n) Z8 |& P1 Z4 ]9 Y
  return mciStatusParam.dwReturn;//返回声道数
) d) D: R: D1 S+ |: h# N}
) o5 O+ Y' }9 Z- v  DDWORD CMyMCIWave::GetBitLength()//获取声音位长
# |/ m  G: J4 ?6 {+ E{
' `4 O4 O6 K4 F7 _' }- } MCI_STATUS_PARMS mciStatusParam;
4 c. J" Y3 c1 M8 G mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
$ M+ _, z/ g( C5 a: K //MCI设备的状态信息(声音位长)( E5 i: v1 ?; `& z6 D9 P
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
7 P9 l$ {9 w% B6 x: P if (dwStatusFlag)
2 e( d! @! c, n( \$ y9 p# _  return dwStatusFlag;
+ z* B2 r  w9 S1 U1 a else% A; m  f( V1 m  r9 Z7 l; {
  return mciStatusParam.dwReturn;//返回位长
: E1 ]* i5 V1 L, N}# S/ R, _" ?, u. k3 J5 S# v& B
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
6 n: }9 s( e, k" l( I{
0 ~/ s: a( w1 j MCI_STATUS_PARMS mciStatusParam;3 Q( D! L( m4 t" a$ R1 n7 I0 [
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度; K  _0 M* z$ |. f7 j! d; G
//返回MCI设备的状态信息(音频长度)
* R. F8 J6 T5 i1 K" _) L) j DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
# t- j9 P. D; `" W if (dwStatusFlag)
: G8 N  ^$ i. Y4 T  return dwStatusFlag;9 y0 w. V2 o- j4 R4 o$ g
else
4 I) v! e7 n9 d. n) x/ p- Q  return mciStatusParam.dwReturn;//返回音频长度/ b: t6 ~, ~9 l2 u* S) Y/ P& q
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 19:34 , Processed in 0.017522 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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