找回密码
 注册
搜索
查看: 2744|回复: 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.  I4 R9 |# u; }: n' @) h+ W# m
//
+ N! V7 i# I# S3 g9 E* \+ y//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)1 F! B8 T7 T4 z; \0 ]2 H7 M6 x
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
' \4 N, J1 x/ `+ j; T#pragma once
/ S: ?% g2 h% W2 x5 c#endif // _MSC_VER > 1000$ o1 B7 L( Z& J5 g
#include <Mmsystem.h>   
- z" H3 K2 B# U8 [' D3 B#pragma   comment(lib,   "Winmm.lib")   
7 b  n3 [0 B) q4 Dclass CMyMCIWave  ( [& p( x( o2 G8 m& K
{
! N, |% P' c" }5 B' Cpublic:
" k8 x+ v; O0 B) `/ ]- m3 g* e. S CMyMCIWave();//构造函数
( o1 ~" m4 a/ p$ k virtual ~CMyMCIWave();//析构函数+ \* _% }& y$ x' e4 P+ t7 O
DWORD OpenWave(CString strFileName);                  //打开文件9 ]9 ]  v3 Y; H, z9 L
DWORD CloseWave();                  //关闭文件+ U0 b7 |* u9 r9 Y' `
DWORD PlayWave();                   //播放
4 w, x: {/ k1 t8 B" K% W: X. h9 R void  StopWave();                   //停止播放
+ K) }3 l& Z) A2 ] DWORD RecordWave();                 //录制
- \  N4 ^. k" V DWORD SaveWave(CString strFileName);  //保存) Y. x) o5 J8 S/ z' p9 J/ Z+ w  j
DWORD  GetBitLength();          //得到位长
3 D3 c) T; V8 y DWORD GetSampleRate();          //得到采样率
+ |; ?  v: A( H" T DWORD  GetChannel();             //得到当前声道
* b: b/ z  V, s) w DWORD GetWaveLength();         //得到音频长度
6 @' _9 D1 S) ]% S1 T, u0 hpublic:! q: l& \8 ]( Q: K/ B/ X
BOOL m_bPlaying;               //是否正在播放
7 D. V. n  h. v2 d0 q$ Q BOOL m_bRecord;                //是否在录音
* i- z$ w' e' _$ s/ o BOOL m_bOpen;                 //文件是否打开2 g  l! s/ \2 ^1 o5 |0 ], s3 U
WORD m_wDeviceID;            //播放设备ID6 ]' u& E3 A- ^8 X. l# r
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.0 U6 K. |- ~9 V7 g
//
+ i4 g& @/ {  [/ c! S, ]6 [& @//////////////////////////////////////////////////////////////////////#include "stdafx.h"
2 ]+ {' C, C$ b8 W+ M" |. c4 l#include "MCIWavPlay.h"
# Z# k9 g( h* y: U0 o5 m#include "MyMCIWave.h"#ifdef _DEBUG/ G; ^1 j4 ~- j4 J
#undef THIS_FILE% s' Q/ G  K8 q) ?
static char THIS_FILE[]=__FILE__;! Q  m$ E! m) h1 V$ Z2 o: |: r" e$ U% W
#define new DEBUG_NEW! c" ~" t" L0 r- L; C
#endif//////////////////////////////////////////////////////////////////////
1 z! j: i& ?* z3 `" U4 e- k// Construction/Destruction" I1 {* Y- F3 y  F- O, b7 O- h
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
8 c/ D; @+ A" O; w{/ k* U2 _" E5 k! X5 m
//进行状态指示变量的初始化+ u8 x# o( f  K2 L, b( w
m_bPlaying = FALSE;- t( t0 P5 |- S) R& C: v$ G
    m_bRecord = FALSE;
, {2 J. q2 D, V# N* }- Z    m_bOpen = FALSE;
  v' ?. e2 Z: g  ^2 |( q  M4 f  e2 K9 }    m_wDeviceID = 0;' F. r0 |" {, {
}CMyMCIWave::~CMyMCIWave()1 n6 q& t3 v. _9 ~. M
{! V8 h5 X% _4 L/ I! e/ U
CloseWave();//关闭WAV文件
0 j) D% ~. ]- |! D}
8 r; B- f+ _1 kDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件% |! a  m+ y3 k
{
" B: d* A" q* M* R/ g3 S if (m_bOpen)//如果文件已经打开
. {2 ^7 N' a+ z1 J+ B  Y3 m! T  f {2 L' y- `  f$ k9 s( S& Y
  CloseWave();//关闭该文件" a- T$ C9 @% E; o4 Q* P* v( O! [
}
5 D; H8 e6 t9 H9 X+ T0 @  A( h DWORD dwOpenFlag;//打开标记, H9 H* q6 x/ S: k# z. C
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构! g2 c* e% t+ r0 G% L+ H
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
* p# _7 v. `; _( c$ U3 Z. k mciOpenParam.lpstrElementName = strFileName;//打开文件名
( p1 g$ F  b/ q" \7 ` //初始化MCI设备# \& t0 C2 c5 [; R2 J2 v5 R0 Z
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
, F# J) t* @0 k) z4 n/ x* K2 a if (dwOpenFlag)//初始化失败
3 s+ N" s( Z# W" b  return dwOpenFlag;//返回错误代码
, j  V# ?, V7 l; z7 h5 y2 A# b m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
; H  o/ j/ Y, I& ?0 m) f m_bOpen = TRUE;( v2 e2 Q( R/ [2 C
dwOpenFlag = 0;/ U' c: G1 N4 g: p/ w3 o
MCI_SET_PARMS mciSetParam;
/ u; |4 z" j# ?( t6 k8 [0 _ mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
+ {# M: C* I; t# `; Z //改变时间控制设置
' S8 q  ~0 s3 w+ g" g dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
5 I" |  ]2 k6 D; ?1 q if (dwOpenFlag)//设置失败
/ |! h" M# _5 o; D! R! U: n- k  return dwOpenFlag;//返回错误代码' L0 t2 {% j$ x( ?# t
return 0;: o6 U* M2 Y, X0 ~* V2 o* {, b
}DWORD CMyMCIWave::PlayWave()//播放波形文件
$ j7 p2 J3 P/ G4 ^% L{( k1 H; h5 P! E. p
MCI_PLAY_PARMS mciPlayParam;* j( J2 Q( ?$ q, \4 h
DWORD dwPlayFlag;
  a$ s( u6 g8 T( R- o* n' \; w dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
5 ~9 f/ @" I; {0 P- A6 e) p if (dwPlayFlag)//播放失败" p$ J" w+ {" `& B( E9 s- r: h% r
  return dwPlayFlag;//返回错误代码
2 Z, f$ L  k- ]. B& p+ W else
# [( W6 ~, X7 H6 V+ l* Y {
/ Y2 D/ U% [6 ~- [, K  m_bPlaying = TRUE;
2 G: J" `% z, I: Q  return 0;
% U4 i' u! Y: l6 D }" {3 y5 x; t) [. f5 \
}; v/ a/ l+ V% p$ p. J/ X" R
void CMyMCIWave::StopWave()//停止播放波形文件
+ ~4 [6 i+ J! H{  F/ F: Y0 [7 |6 Z- |: t7 G
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
7 l) x1 G$ q; M3 ]}
# H4 ~7 l' K- q% l! j) {& bDWORD CMyMCIWave::RecordWave()
+ g' G7 x  T1 W/ t, ]2 q& P{* ?1 r' |( h  w7 ]3 k" s+ v- ]; e( N
if (m_bOpen)//如果有文件打开
% X* r: @( F. _5 @) E  o  CloseWave();//关闭文件
' v+ i* v" O3 ?4 b3 W" [- `7 Y DWORD dwRecordFlag;6 Q/ n9 u' V" d# w
MCI_OPEN_PARMS mciOpenParam;
9 P6 J- ?0 W! ?: |  z mciOpenParam.lpstrDeviceType = " waveAudio ";
3 Z6 ?# i+ n; {: E2 L4 D mciOpenParam.lpstrElementName = NULL;
6 S/ c& Q# A! @1 p& P! E& V //初始化MCI设备
1 H% Q' b* ~0 ]5 I. U dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
: m7 K# u) z  x" @2 { if (dwRecordFlag)//初始化失败
* w% H' m8 u8 i+ V3 Y; l  return dwRecordFlag;//返回错误代码
( M6 ?" I4 O* {5 p0 d m_wDeviceID = mciOpenParam.wDeviceID;
$ r/ u1 I) ?# g5 u! @9 Y MCI_RECORD_PARMS mciRecordParam;* n4 _, n; N8 G  d" ~. |  v) Z
//开始记录数据
& ^1 h! J' d1 o: g4 M* X) T+ I dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
% h9 r, q; _  R1 o if (dwRecordFlag)//记录数据失败
, B! t) v0 O/ a0 ?- N3 |, b& e# p# _  return dwRecordFlag;//返回错误代码
) M9 K' m2 K4 k8 Q, O3 s m_bRecord = TRUE;
9 h) m6 B/ a$ |( O. o- X4 h m_bOpen = TRUE;
* k# i: p! M& G5 i  _& V* ^" S return 0;
, u0 h& Z" _$ |$ y8 A4 l, Q8 _}
& N- f! [: r* r9 a. }DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
6 Z. {1 V5 G5 L- P) d{7 a& z. M( h8 d- H) X8 A' e# `
    if (m_bRecord)//正在录音; h* v9 t7 I! P* G  `; ]
        return 0;//返回
# q3 u- S8 T& U StopWave();//停止录音
* n1 m- ]7 `* f; U MCI_SAVE_PARMS mciSaveParam;
2 c, z* {7 F9 G3 d2 j& e mciSaveParam.lpfilename = strFileName;//设置保存的文件
: y9 K, N  Z1 ]4 w  R //保存WAV数据到文件
# k0 v, C+ |1 u/ O- Q7 O DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
# H# c- l/ U- C' \ if (dwSaveFlag)//保存失败3 f9 s4 v8 c1 B& G
  return dwSaveFlag;//返回错误代码& H8 I0 n6 Z; D: a5 \- r* X. h
m_bRecord = FALSE;
; _+ V/ \5 W( | return 0;
( q* b5 s2 X$ H0 d$ S}( S' y( u2 y1 f/ t- n
DWORD CMyMCIWave::CloseWave()
6 F9 m! `- F+ V{
; @' w3 C" W2 Y1 p# p0 }( U if (m_wDeviceID)//有MCI设备在工作, s4 ]" X; [) z% j4 V4 n  {
{
6 K$ X4 |& b* F  DWORD dwCloseFlag;
" }3 I) P$ n$ p  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
+ `% B, {! {- z: R7 C  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备' H" U) I* o! E8 O, Q1 D
  if (dwCloseFlag)
& _4 O/ m& Z! C9 [/ w- H$ @  {
+ g$ V; n% `& q/ U$ s- ?$ d   AfxMessageBox("关闭时出现错误");
6 ~' N. [- D7 B! }   return dwCloseFlag;
" L$ M7 @" D( N% ~$ R, z) Q% [  }1 r$ S+ N& l9 k1 \: I1 y2 z
}
9 g; @& b9 T4 ~$ b7 H4 O' f //设置状态变量
$ s$ E; `! o1 s9 Z0 w' |4 w m_bRecord = FALSE;
5 Y1 ^" w1 [4 m" N m_bOpen = FALSE;# y* I. \( K" P% }
m_bPlaying = FALSE;
. T- k+ ?1 g9 Z* ?' t9 Y. e8 k7 o m_wDeviceID = NULL;
: d5 Z9 z) {( N9 e$ P9 m; h return 0;
+ b* z/ i* z% m}7 Q/ @: ], v. m7 Z
DWORD CMyMCIWave::GetSampleRate()//获取采样率
; H, d  M6 {! k) K{# D" H9 v3 w: p
MCI_STATUS_PARMS mciStatusParam;& ^1 u7 d  [- b/ @
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率2 I/ A+ C' M, V5 Z
//MCI设备的状态信息(采样频率)
3 b. n+ q$ h' e, c7 w) E DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
4 Z5 N, L" w/ b# o/ l if (dwStatusFlag)! U3 W5 e' p0 T6 V1 M4 D
  return dwStatusFlag;//返回错误代码* W: ^' U& }0 K
else' l9 j4 c0 a; Y) q* l8 w+ k6 S% l7 R
  return mciStatusParam.dwReturn;//返回采样频率
; H. ~( L9 w9 Y, E; f( K$ L2 F}$ o$ {5 ?1 P- D3 Q
DWORD CMyMCIWave::GetChannel()//获取声道数
4 \" Y* o% h6 v+ ]6 O2 \{. [: H$ U0 h4 g6 ^3 w' s+ @
MCI_STATUS_PARMS mciStatusParam;$ [8 J5 P, \# h; N5 h+ w  P' g" c
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
1 c. G0 U0 c( ^ //MCI设备的状态信息(声道数), L  ~/ V& Y) M
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);; X3 x. z+ Z. F& F6 W$ M+ f
if (dwStatusFlag)/ F! D9 i" g) l- w: S! m( r
  return dwStatusFlag;! `2 k' g: ?  W+ @) ]
else
  s+ R$ }' d9 p1 [+ x8 a& R  return mciStatusParam.dwReturn;//返回声道数
/ l7 q; s  Y8 `" a}
3 `/ q" C4 M' z+ k* B8 vDWORD CMyMCIWave::GetBitLength()//获取声音位长/ L" H& u( |' Q; \) Z. H0 ~
{9 a) C2 W/ r7 K& f
MCI_STATUS_PARMS mciStatusParam;8 Z0 y6 t3 S! R, s# B3 L7 ]
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
" u  D# E& U8 ?6 A: e //MCI设备的状态信息(声音位长)
/ l% L5 o6 s  x5 S% k$ v DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
- t' H6 m1 n6 {/ M' X8 o( h if (dwStatusFlag)
: ?: C0 f# u+ ~+ y9 K' }7 E: y% ?7 B  return dwStatusFlag;
( A! y9 l* _* w' ~1 R else# _; b8 h$ N8 d. U1 ^
  return mciStatusParam.dwReturn;//返回位长8 K) N0 A. P* k: _3 |$ i7 K
}+ s5 j% R5 p: s" h6 Q* k
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
/ d+ H9 a% }; P" I8 }. z1 h; c0 d{9 U5 P! T/ A7 e& e5 f
MCI_STATUS_PARMS mciStatusParam;
+ k1 b$ S+ y$ R9 D mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
+ E" \: B8 ?. G //返回MCI设备的状态信息(音频长度)
# Q" V3 c4 c4 w. T0 H. G& v DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
, w1 i5 @3 W) @ if (dwStatusFlag)8 Z% A' z- {- x$ _% y8 u% u
  return dwStatusFlag;7 T# p# u+ \  ^# u: n  |) W0 S/ f5 {
else# ~% e5 m3 `/ u' v3 [: ^
  return mciStatusParam.dwReturn;//返回音频长度
) L; S" M* i) T}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 16:28 , Processed in 0.019822 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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