找回密码
 注册
搜索
查看: 3107|回复: 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.: R1 h# t) H5 q4 ]
//
7 |- h5 x- h. a' e//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)9 Y4 H$ S: H/ ^
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000! k4 ^# h* e7 ]$ ~, I
#pragma once
/ o) J3 P9 X4 R/ w9 s" c8 S#endif // _MSC_VER > 1000% f  F. {2 R) v1 t
#include <Mmsystem.h>   
6 u  ?( g3 h5 O" W+ p: ?. k#pragma   comment(lib,   "Winmm.lib")   4 \" w# F5 w1 z( g6 Q- V
class CMyMCIWave  
0 h+ y/ X9 I' ]  f- @9 U7 _{. O& Z& _* j( g% j" ^
public:/ G. E5 h. p/ j  q0 ^) o! I$ J  g% T
CMyMCIWave();//构造函数2 P: m8 Z5 e! v& R
virtual ~CMyMCIWave();//析构函数
; |: A! \- z; A DWORD OpenWave(CString strFileName);                  //打开文件
9 u7 P* ]8 P. c  R& D& I1 G3 U DWORD CloseWave();                  //关闭文件/ P9 J3 ~" Y: z! h
DWORD PlayWave();                   //播放
% x) R; C$ n9 m) n3 t, A7 t' Q+ b void  StopWave();                   //停止播放
4 u8 H" _8 r# U% |7 i/ ^ DWORD RecordWave();                 //录制
# _1 P8 W4 G! y3 j$ x% K3 B DWORD SaveWave(CString strFileName);  //保存$ ^. {9 E# A! L3 S, l  K  ]$ T
DWORD  GetBitLength();          //得到位长# l4 H) q- b$ D" }; m. X- {: ?
DWORD GetSampleRate();          //得到采样率
  L1 h2 W) ?* u0 s6 N* l3 ^ DWORD  GetChannel();             //得到当前声道! f# G- @  M) M$ K# p- q% T5 `
DWORD GetWaveLength();         //得到音频长度3 o/ x' E  n+ ?3 ]8 ~3 \& Q
public:
( \8 G/ N0 a2 O) H) _% s BOOL m_bPlaying;               //是否正在播放
: q, O) O0 L/ x& ^  l2 c; @  Y' c* W5 G BOOL m_bRecord;                //是否在录音% f* }0 ~% Q& _
BOOL m_bOpen;                 //文件是否打开
2 ]/ V  _  e3 \* y1 `- S WORD m_wDeviceID;            //播放设备ID" }( O, F- x4 E: R' o0 y
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.0 ~; [7 h( z# l  {' {
//3 p  S7 w4 T' n! D2 {3 Q5 B
//////////////////////////////////////////////////////////////////////#include "stdafx.h"# u- w  [6 e% b
#include "MCIWavPlay.h"
" ^4 u# J" J, H7 d; X#include "MyMCIWave.h"#ifdef _DEBUG
$ g7 ]& q; t8 E2 p- X1 V#undef THIS_FILE
1 G6 O0 y. e% c- T5 K% D% Dstatic char THIS_FILE[]=__FILE__;; v+ Z+ u- z7 X6 Q3 {
#define new DEBUG_NEW
0 u/ B# J# [  Q+ p2 H8 _#endif//////////////////////////////////////////////////////////////////////
2 v, O4 t; D. J4 S, l// Construction/Destruction
+ ?% j  C- O/ f3 ?7 @//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()$ ^  w4 q4 q7 L, q$ h) g
{" ^1 t" h( M8 N/ H, z
//进行状态指示变量的初始化" ]$ V7 z2 I* u2 }+ J" s
m_bPlaying = FALSE;/ O% }$ b# B% W  B9 X% T
    m_bRecord = FALSE;
. O: J8 T# ?6 k! N& f; x    m_bOpen = FALSE;
; |, H8 p$ j0 o/ W# R    m_wDeviceID = 0;
7 j1 ?; n; x! Y1 F( `- D% y2 \}CMyMCIWave::~CMyMCIWave()' X) X- {7 X! ~/ z. M
{; Q+ {: S( ]  i
CloseWave();//关闭WAV文件1 h8 p6 [! e: X: q5 _' U; J+ C
}
9 w/ F5 r2 x9 p* k9 r6 zDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件; L( o2 P0 a3 t+ K* p1 x9 r
{2 g- c& G. J( O8 ]- z. n. N3 t6 m
if (m_bOpen)//如果文件已经打开1 Z) S- C4 h/ I9 v
{; T8 g/ c7 u. F( B
  CloseWave();//关闭该文件
4 f) ^4 Q' s1 [0 f/ | }5 ?6 Y, y; z2 z3 O, l) W1 _8 m
DWORD dwOpenFlag;//打开标记. q. D2 w) X- ~2 r. s
MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构$ p) }4 v2 N/ g: I
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
" ~* X4 K; ^2 s& ]  u mciOpenParam.lpstrElementName = strFileName;//打开文件名
! c3 `! l  W3 o' R# J //初始化MCI设备6 k/ V( {6 }8 \+ e) |) \. d
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
8 B9 z. {6 j4 x6 L! K3 U  n; k if (dwOpenFlag)//初始化失败
+ j/ ^; W, \6 [* c- ^+ n  return dwOpenFlag;//返回错误代码3 B$ w" Z  m' `4 \
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
) z9 \8 @/ \9 `+ d% N; A m_bOpen = TRUE;
7 U, d& ^+ U& Q6 D+ N* O, M dwOpenFlag = 0;
" s! I# C& U" V: {, a MCI_SET_PARMS mciSetParam;! p7 i5 D  P' I* D) y
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
' T5 @# m+ b/ ]+ d* E* K+ l) K //改变时间控制设置
' a( M$ ]+ z/ S* Y; ` dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);% I: X/ c4 ^# `! F- {$ W
if (dwOpenFlag)//设置失败
7 r& S& |. n* t! x* O/ o  return dwOpenFlag;//返回错误代码9 v  ^: A( M* e, M
return 0;
/ h7 R: ?; K. X3 h}DWORD CMyMCIWave::PlayWave()//播放波形文件
! s; o7 @2 u1 L{
9 f1 k1 u0 I5 g5 N- v& g MCI_PLAY_PARMS mciPlayParam;1 b/ c. \8 t( l  q
DWORD dwPlayFlag;
- \8 a* }. g# q8 G! \$ i dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
1 G# H! v$ n# p if (dwPlayFlag)//播放失败
  Y4 s1 r% a8 K& n3 e  return dwPlayFlag;//返回错误代码
0 U6 R" p' z( v$ u) I else% j3 h* c0 X. M2 z" J3 }: e
{
3 {, k' u9 T! Q5 h5 _  m_bPlaying = TRUE;& m4 j: Z1 `% }3 u6 h5 a
  return 0;
8 h2 @2 }& f$ L! V$ d }% @4 K5 W: A5 B& [
}& Q4 L. N" a) p7 I1 A+ J4 {
void CMyMCIWave::StopWave()//停止播放波形文件
6 o3 @, T" p7 s. |1 h" y* J{% Z" F: o; d' T7 _
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放& G) l, B4 ^9 y, s6 ~- N
}7 x/ J/ @- k0 y+ j2 |3 H# G
DWORD CMyMCIWave::RecordWave()4 N( O5 o8 e- R) J2 v2 Q
{4 u" k5 [6 u2 W* z5 Q
if (m_bOpen)//如果有文件打开
- b3 O5 Y; n- [7 ~1 F+ D7 G: C  CloseWave();//关闭文件% T( o' Y5 p: ^
DWORD dwRecordFlag;& k0 Q+ v! x- D) X* y5 o
MCI_OPEN_PARMS mciOpenParam;
1 _; x9 R- [$ H8 E7 p; X mciOpenParam.lpstrDeviceType = " waveAudio ";
" x" `# x( H. V! u& E mciOpenParam.lpstrElementName = NULL;
3 U+ g- }' l8 P0 d  g& E' R2 r //初始化MCI设备8 Z7 X- \$ O  s4 `' B4 v
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);+ o# l% U7 t& M/ ^: r% X3 Z
if (dwRecordFlag)//初始化失败  y" D4 w2 p8 T1 ?
  return dwRecordFlag;//返回错误代码
" x' o4 x# B5 P: t; z; c$ t m_wDeviceID = mciOpenParam.wDeviceID;
& s3 v5 O1 W+ \! M  B1 R$ _ MCI_RECORD_PARMS mciRecordParam;
% ]# R1 {- ^$ R- p! b% D //开始记录数据# g3 T* }/ {( \" C5 i
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
7 f  n/ f) H, a if (dwRecordFlag)//记录数据失败% u7 Q1 W: C8 L
  return dwRecordFlag;//返回错误代码/ O- q/ v  E. z, t
m_bRecord = TRUE;
' M0 X- Z' `! b" _6 O2 ^. W/ p. ? m_bOpen = TRUE;+ t: K3 T+ D! X# Z% U, P! L' o
return 0;6 }, s' M: t& C6 b
}
4 @* X  R+ g  ~) TDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件) \' S& R5 D6 m$ m* P  S/ [
{0 z! [. O0 U$ V, m' [% j7 S3 x6 p
    if (m_bRecord)//正在录音6 V# c2 `! a! a. o' v
        return 0;//返回
! S9 w' O9 w; S, U+ u" \7 w StopWave();//停止录音; L) p- D- Q& D# N
MCI_SAVE_PARMS mciSaveParam;
) w) M/ k0 u$ N7 Z mciSaveParam.lpfilename = strFileName;//设置保存的文件
, f# @# g  b8 M6 g* ~5 u //保存WAV数据到文件
# \5 |7 O. X6 f7 Z! [. q6 g9 h. e DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
+ I5 B. O% S, b% l) u( \ if (dwSaveFlag)//保存失败" @& o( o8 d' d) ~3 R% `
  return dwSaveFlag;//返回错误代码
& |" r0 ], h) ~( P m_bRecord = FALSE;% W; J6 a% B) _/ U/ r# R: H
return 0;1 J4 E/ D; E5 }
}( _) @- v) J  E+ j+ ^
DWORD CMyMCIWave::CloseWave()$ f$ J) ]  w  r* c
{+ V. \& F  u' f! Q! W9 O* u
if (m_wDeviceID)//有MCI设备在工作  j- |8 }$ j# @. R- [, \
{# y- u# Z; `4 {' ]% |: H  d
  DWORD dwCloseFlag;) k: `: H2 I6 Z* \0 K: R- T
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作* J* K6 l& @9 P$ U% `5 v
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备9 u# f) n3 s! i7 V" _/ A( t5 Y
  if (dwCloseFlag)0 h7 l& f3 H3 p) N& j  f
  {2 F) m/ W$ B% Z- v* V1 V
   AfxMessageBox("关闭时出现错误");
! u5 C! o8 v9 [   return dwCloseFlag;9 B1 b( `3 S" U. ^( \$ }, e' Q7 o
  }
- Z% J. V* M: F  I0 M$ T" k }
+ @' ?5 m- R* b$ n% x //设置状态变量: i) K! R4 w$ G. c; p( r
m_bRecord = FALSE;
# P- z# P/ I$ ^4 P" h m_bOpen = FALSE;
9 W( O; N0 l$ F6 r m_bPlaying = FALSE;; T/ r# i" t$ V  P
m_wDeviceID = NULL;
. b: u2 b3 y* x8 d return 0;
8 V5 ?0 m6 e, L3 W' u! Y6 N}% M" K, g# ]3 o! @0 U% z
DWORD CMyMCIWave::GetSampleRate()//获取采样率5 l' K  N: ]0 Y1 Y% |& c
{0 T" v8 P% H! o2 t: a5 }0 C. @
MCI_STATUS_PARMS mciStatusParam;
1 A1 i8 {" _8 I- g mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率2 B: `- e) U- @" S$ V+ b8 t4 L
//MCI设备的状态信息(采样频率)
. s+ S5 Y2 ^3 M! P1 `1 G DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
5 W8 H: p$ H+ _ if (dwStatusFlag)
9 r8 t) P3 s0 z) q* a& x, V  return dwStatusFlag;//返回错误代码
  K- O5 _6 K3 }+ V6 L/ ~ else
1 k: v! q3 X" Z. y, g  return mciStatusParam.dwReturn;//返回采样频率
* `8 s" \! y0 _/ l8 E+ q( _% o, j( n}' ?  F2 b3 Y% ]5 T0 P
DWORD CMyMCIWave::GetChannel()//获取声道数
" a" r0 d2 @' A7 t3 B" Y{' F1 r: U* L4 e9 _3 v
MCI_STATUS_PARMS mciStatusParam;  I8 M1 W) E2 j) w, s' ~; I
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数0 n  z1 ]1 M0 z/ q# x. C4 P
//MCI设备的状态信息(声道数)
! w1 w, x5 W* N DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
8 e; X, `$ E/ E: k" s! B6 I if (dwStatusFlag)
0 h: \. {5 r- [4 G# N& Y  return dwStatusFlag;9 t  y* w1 m3 W7 y  a% `
else
$ J* ?+ T$ ^* [8 o9 @6 B# B  return mciStatusParam.dwReturn;//返回声道数+ J0 C  u8 t4 o/ J0 \8 G' P
}
% o3 x8 P' B. r" y2 p3 a" ]! M6 UDWORD CMyMCIWave::GetBitLength()//获取声音位长. j% r  c" b5 ?8 I) R
{# n& ^. R* m1 r& h- O3 M
MCI_STATUS_PARMS mciStatusParam;; y4 w* @9 E) J' C: I
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
! Z  J, o$ O: J8 T+ Y9 p //MCI设备的状态信息(声音位长)! m- f+ H( e" q9 p1 C
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);5 f/ x- L' q- a  F, {! z) a
if (dwStatusFlag)
; _9 [9 {" i: r! n" A  return dwStatusFlag;
5 Q2 W" c% U" U; K& g2 S4 W, d' u else9 a  `. |, n; }5 B
  return mciStatusParam.dwReturn;//返回位长
% O8 [: t  A- B9 D, D% A' d}
" B1 ~1 A& `) B8 ]4 ?, \1 LDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长4 s# p# G* Q- T% [  O6 J
{7 c- i' L0 p  {9 Y6 o. |+ M
MCI_STATUS_PARMS mciStatusParam;
( z/ A/ ]9 ]9 [; E mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
( \& A3 l* u3 C1 B! ~ //返回MCI设备的状态信息(音频长度)
1 n7 ~- H& l) b7 z+ @ DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
% u; W. u! A2 C# c2 p if (dwStatusFlag)$ j' G1 H. s! w) f3 q. Z
  return dwStatusFlag;
& K  }1 F3 Z3 b" \; ~) J else
' O* O+ A' @6 @  return mciStatusParam.dwReturn;//返回音频长度
  M/ L" t: }( d" P' W1 G# I* F}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:21 , Processed in 0.016565 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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