找回密码
 注册
搜索
查看: 2602|回复: 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.# ?8 O" n- T+ ?' i6 i
//  U( j9 U1 M3 w/ G
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
0 u' _- `6 [% r0 n/ M0 M#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
$ f2 K9 z2 P$ U3 o0 U#pragma once
3 ]2 g7 i3 ^' \+ {- v9 Y#endif // _MSC_VER > 10005 \3 g( J6 w3 R" ^
#include <Mmsystem.h>   5 R7 a" a- q$ q
#pragma   comment(lib,   "Winmm.lib")   - X8 Q, D+ C. h6 s6 [
class CMyMCIWave  5 q) |/ f/ H& l: }+ ~
{
% i# ]! {. ~; `* e# p0 \" ]5 }: W  Ppublic:
5 R) B* x1 p, k, D' V+ z CMyMCIWave();//构造函数
" T7 g7 Z( [5 r; r virtual ~CMyMCIWave();//析构函数3 b% X. H+ N! E5 s' Y7 D6 m" @
DWORD OpenWave(CString strFileName);                  //打开文件* M9 q" M: Y+ x/ S& ?" v' y& k, e1 ~6 \
DWORD CloseWave();                  //关闭文件- g: L( z( p, x+ C5 V
DWORD PlayWave();                   //播放
3 }# q. s* Y  ]  s( Q void  StopWave();                   //停止播放
4 O: n! n/ [0 ] DWORD RecordWave();                 //录制0 |. a. c& ~  Q* S% w
DWORD SaveWave(CString strFileName);  //保存8 s* ]" @( U* Q4 \; Y# T5 \
DWORD  GetBitLength();          //得到位长
  H5 g- A$ u" U8 Q: h/ L DWORD GetSampleRate();          //得到采样率
. [4 {+ t1 D# P8 r! r: B DWORD  GetChannel();             //得到当前声道7 S) Y0 P* M8 r- N
DWORD GetWaveLength();         //得到音频长度
2 @- i8 A+ q2 S- C1 `public:
2 e( i, ~/ t: ^8 k BOOL m_bPlaying;               //是否正在播放3 I2 d, w( c* A  m! O* W' t' `1 N
BOOL m_bRecord;                //是否在录音
, P4 v+ r% a% W$ P8 K BOOL m_bOpen;                 //文件是否打开
- A5 i& ~& k2 y( ?( [2 T/ K0 T WORD m_wDeviceID;            //播放设备ID
! n) w" R$ k- t9 G* c" l  l* _/ T6 ]};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.3 x% [6 m6 Z' P7 [
//
( O1 i3 P+ K: r8 r* ?/ Z//////////////////////////////////////////////////////////////////////#include "stdafx.h"
3 J6 }/ t% _/ w' r" f4 t  G" Q/ L#include "MCIWavPlay.h"
! M) D) K6 N" J! I% Y#include "MyMCIWave.h"#ifdef _DEBUG
& }1 k; x* z5 N3 z; T4 {#undef THIS_FILE
( D5 W9 \4 h4 E) y) tstatic char THIS_FILE[]=__FILE__;2 x# ]8 O  N2 \& u
#define new DEBUG_NEW
6 W: T2 H/ K) `0 w5 b1 t7 H% U#endif//////////////////////////////////////////////////////////////////////8 b. D# w$ ]6 Y  m
// Construction/Destruction
! A/ A3 s3 l$ [( l" j//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()8 ?9 g4 a* b) v- ^+ l; f" R
{- d4 [! m9 m/ s& K+ g* i
//进行状态指示变量的初始化, a, ~5 l9 B; Y; z  @
m_bPlaying = FALSE;% z  _% q8 R0 J  D
    m_bRecord = FALSE;2 N5 [" B+ O5 O$ ~4 b+ E* h
    m_bOpen = FALSE;& }& R- |- v1 \2 c* S
    m_wDeviceID = 0;4 j$ m/ @$ V) O# _  T8 y. r: ?) ~
}CMyMCIWave::~CMyMCIWave()
! |! ~- y3 {1 z) D7 J{  P0 j/ Z" Q9 g
CloseWave();//关闭WAV文件
' Q( N: J* X2 k4 k. M, U$ B9 W2 \: l: X}1 _1 X! B5 M. ^3 Y3 m( x7 o- a
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
) ?& C7 k& |3 G{3 p. r6 s7 E! s* V$ m; P
if (m_bOpen)//如果文件已经打开9 d' m7 Z  F6 A/ [9 N. N9 [
{
' u% m& P6 \& Z; h6 s3 `3 r  CloseWave();//关闭该文件
, ?$ g: X1 S  N0 |% m" i }
. {5 j) V- g! f1 C  w. v9 b DWORD dwOpenFlag;//打开标记
  x6 \' n9 X; G& x( u MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构3 |. M% W; @* c* P) O
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
: Q6 \& {3 D" [# _( e8 F" u! ~6 u- H: B mciOpenParam.lpstrElementName = strFileName;//打开文件名
6 Q5 U# i. Y- X //初始化MCI设备
3 F. s; }3 k, q" R  |' [ dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);8 r2 h) r3 L6 `* d# M- E
if (dwOpenFlag)//初始化失败
- o* C% F' o, s1 k* f' k/ [8 J  return dwOpenFlag;//返回错误代码1 N( G7 t5 ^% y# ]$ C
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID! z% L( P$ A( ~" S7 j8 x6 X
m_bOpen = TRUE;* E9 j1 l  m; j( p# r
dwOpenFlag = 0;, B9 n" N& ~& v4 W* H
MCI_SET_PARMS mciSetParam;
5 R2 P  [6 g; D3 y' e; S6 n5 D mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
" h- B* u  u! ~- i# _ //改变时间控制设置
, d7 |2 T3 v& H0 k" s! b dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
/ N, v# I# x" g/ x) S& v if (dwOpenFlag)//设置失败
0 A1 R; R; z: L5 e3 s7 I( T; Z  return dwOpenFlag;//返回错误代码
0 b- {% ]0 ^3 n! g0 I; b! H return 0;# v" _# @. S, y6 h9 Y6 M
}DWORD CMyMCIWave::PlayWave()//播放波形文件. x7 x* \  ~9 B8 R3 w! V  M9 E
{, E& Q6 d* K* u$ \5 W& W* w; g
MCI_PLAY_PARMS mciPlayParam;# G! P% K  a7 x8 m) r- R  v0 ?! R
DWORD dwPlayFlag;
! e6 F2 b6 [0 h8 Z! K; s dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
9 {8 s4 e7 I3 v$ |9 x) H1 @3 B if (dwPlayFlag)//播放失败
5 }8 O% [4 W# t2 P7 j. [8 b- U1 ^. `  return dwPlayFlag;//返回错误代码6 D. T; T9 N- G  s/ Y; x1 ^' T! _
else
" E0 K* ^8 t$ h  K1 C* _/ K4 a9 E4 ^ {
! S' b8 B+ s6 `5 {9 k  m_bPlaying = TRUE;. \# t1 w( a  }
  return 0;3 `+ |& f8 v! z" j4 P6 L
}
' h& Z$ T! V3 G, y}
2 j5 m7 I, k( A2 Evoid CMyMCIWave::StopWave()//停止播放波形文件% H% x+ @: \$ E3 ?8 ~  y& @
{( O0 n- R" e7 b& D9 x
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放- L( {  t- X4 m; S) X6 r. ]
}
9 g+ k3 U. p& a* ~3 \DWORD CMyMCIWave::RecordWave()
5 ]7 N0 |- s! j. M2 H{
0 q! Z# M" v$ J if (m_bOpen)//如果有文件打开
( @  b4 g# u! H& l  CloseWave();//关闭文件
- Z6 l" Z! u) |1 h3 i; n+ q DWORD dwRecordFlag;5 H! j7 q/ d5 a5 l
MCI_OPEN_PARMS mciOpenParam;
) C0 s2 {& W$ w$ t mciOpenParam.lpstrDeviceType = " waveAudio ";! Q! S9 x% S4 U
mciOpenParam.lpstrElementName = NULL;- N' z4 V) Q) W  ]/ u: m0 }- P
//初始化MCI设备2 e$ A5 [' Z) }5 }
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);- M2 J6 u9 m, D( o
if (dwRecordFlag)//初始化失败/ L& J; b0 {7 c# F' T2 @4 @
  return dwRecordFlag;//返回错误代码9 b2 t8 D) |5 B0 s* j' M! L
m_wDeviceID = mciOpenParam.wDeviceID;
* U7 I* [4 S$ v8 u MCI_RECORD_PARMS mciRecordParam;* J; q- W, |* _1 B
//开始记录数据+ Z8 c7 L1 T5 \% w7 ]
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);1 U$ R; Z+ t+ n0 a- {# i! W
if (dwRecordFlag)//记录数据失败
/ V' m3 M$ o% D# ^, |. S- J% x  return dwRecordFlag;//返回错误代码+ J8 n) u: \5 i8 J$ u/ y; F
m_bRecord = TRUE;2 |6 q( ~6 F& Q8 [6 z! j
m_bOpen = TRUE;
. Z! q/ N7 k  R( }1 Y) `9 B return 0;) E, }8 {* G9 g1 N2 [
}$ @5 I# {2 u; I* O
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件" w0 F% Q+ e3 ^0 K
{
1 F& |' x3 {& a& L    if (m_bRecord)//正在录音
8 t6 o* A4 j6 k" ]6 X  C4 w" _( H        return 0;//返回' e1 |/ j( q9 ]6 n0 C
StopWave();//停止录音
' Y# ]/ v4 _& i6 ^8 R9 b/ i MCI_SAVE_PARMS mciSaveParam;: f, ]7 L2 x: B% Y: t
mciSaveParam.lpfilename = strFileName;//设置保存的文件3 R9 \5 X& F! I, }
//保存WAV数据到文件
8 m) D+ O3 f, X' R' r% {$ I7 i DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);8 B# v3 H1 E$ v. q# X) H1 H, Z5 s" W
if (dwSaveFlag)//保存失败0 p" `& [( A( P
  return dwSaveFlag;//返回错误代码
+ M* o3 @7 A% g+ B m_bRecord = FALSE;
  y  E( i8 q, e" p/ I- m/ O+ ^  | return 0;
( h5 X% d: g' J}) M& _. B6 G5 u- d8 l& W/ w
DWORD CMyMCIWave::CloseWave()$ Y8 U" e6 }: Z# T, Y
{- X0 [% U7 ~/ }! O( J8 X
if (m_wDeviceID)//有MCI设备在工作
2 [! H+ y, v: S( T% [3 `8 M {6 x! S; U- u( u6 `
  DWORD dwCloseFlag;' C' B% B3 r% o& l% p
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
# v; Q5 e/ D4 H& F# f  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备. u; Z# o0 k" Q" o6 f
  if (dwCloseFlag), `% w- _" Z1 y: r/ w" ~
  {& h: C; S8 i3 E( b( A8 C; t
   AfxMessageBox("关闭时出现错误");
& u& O* u: b& P# d5 M, k   return dwCloseFlag;
- L  ]% f. s* y2 G: X9 y" E  }
1 w; w# t3 _2 U" M$ `3 } }# [! W9 C' ]/ v, w) r* ~. R
//设置状态变量
/ Z( S4 M4 D7 n0 f9 m8 w m_bRecord = FALSE;
  b) ^7 \6 h: \3 ~) ~3 a m_bOpen = FALSE;
0 a& p1 p" M4 L- S1 t m_bPlaying = FALSE;
# N+ z. o" K/ v7 X m_wDeviceID = NULL;
+ R! d( [5 y* X6 c; U$ a3 g4 Q return 0;
1 f! K! }9 R+ y3 Z}
) z) K4 [+ K6 D5 e/ T: \2 C: oDWORD CMyMCIWave::GetSampleRate()//获取采样率9 x& S: a9 k+ }* R% ~
{
& P5 B1 u& k; P* B. j! r: j MCI_STATUS_PARMS mciStatusParam;7 W4 e; s( j8 @# R, N! v0 y
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率/ `5 Z  x# |- K" v# L) M
//MCI设备的状态信息(采样频率)1 a2 G4 N- q% S% c. \
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);3 }# k4 T! Y. ~2 {5 o
if (dwStatusFlag)
# u( l! f/ p7 R& s% D3 V  return dwStatusFlag;//返回错误代码1 q7 C, Z  C% k1 z9 E; @0 ^; S
else5 }5 E5 D1 E" Y( j: g
  return mciStatusParam.dwReturn;//返回采样频率
+ q% r* s6 F  I/ D- v1 T) C}: d0 e, S2 v4 V
DWORD CMyMCIWave::GetChannel()//获取声道数
, ?- S9 k) ~) e1 m4 l5 d( }{7 ^% ^- G( K+ b7 d" Z4 ^
MCI_STATUS_PARMS mciStatusParam;
& d% _6 J! q) ~. o) b' r) x* a2 G mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
# I4 b8 K7 x4 G! k" Y# u //MCI设备的状态信息(声道数)! B# E/ J& F* ^; W0 v
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
" Y" n$ K, h0 ~$ C0 }$ R5 P if (dwStatusFlag)4 W) U' d8 C# N" `& O
  return dwStatusFlag;4 i( c- w/ m8 G% |7 r% E4 |9 }/ \) O
else
6 _4 \+ y% ], b' G2 h: f* r; d& w  return mciStatusParam.dwReturn;//返回声道数" F; I6 n' _1 k" s7 @9 R
}' }. M, ?/ j* F0 A5 m& D1 h3 w* a
DWORD CMyMCIWave::GetBitLength()//获取声音位长, E3 ?+ l/ C) y1 n  N1 y
{
; |4 A2 K8 y- G, @! ]( E) N# R MCI_STATUS_PARMS mciStatusParam;6 w& f# L: U- l2 X
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长* r# V6 U! R7 B. P8 D' J; q
//MCI设备的状态信息(声音位长); h- L  E6 m' D$ f* k3 F! o3 Y- {% c
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);$ ^7 H9 X9 ~$ g! H& J0 h& Y
if (dwStatusFlag)! D5 |+ \8 s2 u1 Z. V
  return dwStatusFlag;/ E/ R4 V( u0 M# w$ w/ o+ k1 m* m
else, `- {& Z% z8 X1 c% X8 f/ F
  return mciStatusParam.dwReturn;//返回位长
. m3 N4 W) d; X9 u* b# X}+ A& g0 }5 W  w4 F, h! |% P, k* [
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
! L! [' \' v6 l. ?8 R1 K0 [{1 H" r3 C( @5 D4 t7 x
MCI_STATUS_PARMS mciStatusParam;
+ S$ m+ q' ?3 K  f' C* u: |7 P3 R mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度# g* ?6 r! P: A0 {
//返回MCI设备的状态信息(音频长度)7 J' o0 O) [, [- O+ u
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);! ^# ^' f0 B1 q! I
if (dwStatusFlag)
  Z" S1 v7 W. J3 \/ {3 n  return dwStatusFlag;% K7 \1 v4 W6 D6 J8 w" Q) O- c1 z& i4 ~
else4 j3 L" @8 v0 b, O( j. |" T
  return mciStatusParam.dwReturn;//返回音频长度! ^) @8 f$ N* {+ X; Z
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 23:23 , Processed in 0.036183 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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