找回密码
 注册
查看: 3237|回复: 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.
+ p, T" d* G" |* x  d//- r8 r- ]9 a. R- C3 w8 {
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_), {3 x6 }* l+ l: j$ E) J
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000# w$ t' y; e6 S4 U0 p
#pragma once* G( x9 G; U  c+ h; J  v) n
#endif // _MSC_VER > 1000$ H* ]' O& X. Z: q! O% r4 C$ U) {% W
#include <Mmsystem.h>   
1 X4 ^; _, Y! X+ {( R3 B, G#pragma   comment(lib,   "Winmm.lib")   " l3 R3 h/ ~. i7 ]/ W
class CMyMCIWave  
0 U- F& p5 Y; E{/ J8 l+ c: r- s" h. R
public:
# f" i$ u! `9 b7 \% R) [ CMyMCIWave();//构造函数
" }% Q; p  _  j8 |. e virtual ~CMyMCIWave();//析构函数
" R: r: U- W9 l% f: T5 c1 O" \ DWORD OpenWave(CString strFileName);                  //打开文件
6 a6 ]1 U6 F! O6 @& O( r# D9 [ DWORD CloseWave();                  //关闭文件  M' }" K! u) `! W8 a
DWORD PlayWave();                   //播放$ b8 `% s9 J+ E9 t9 x4 Y2 W6 i
void  StopWave();                   //停止播放
$ Z7 ^/ {' {' g9 W DWORD RecordWave();                 //录制
2 P+ L* J* L: H# G DWORD SaveWave(CString strFileName);  //保存
* }5 A# P3 x# H# O DWORD  GetBitLength();          //得到位长6 _; H- u) I/ _) N6 w4 a8 D
DWORD GetSampleRate();          //得到采样率/ ]1 c. _2 r1 Z* q7 a' T9 M: t4 N
DWORD  GetChannel();             //得到当前声道' `; C6 V% C4 ^
DWORD GetWaveLength();         //得到音频长度
% b! P+ [8 W" S' }% {# c" Apublic:  ~, V+ a" Z" o* Z
BOOL m_bPlaying;               //是否正在播放6 J4 b2 r& {0 `, U. {% n
BOOL m_bRecord;                //是否在录音. ]3 v- z; p9 y* f5 q; m# \* }
BOOL m_bOpen;                 //文件是否打开; E! C/ O3 k7 U/ U# A) @, ~
WORD m_wDeviceID;            //播放设备ID0 v, p+ a; W4 |( f$ p
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.3 A) P$ Q: w2 k" W
//! G$ {) @0 z1 H
//////////////////////////////////////////////////////////////////////#include "stdafx.h"4 j1 g5 m( b7 o( v# X0 Y. ]. n
#include "MCIWavPlay.h"1 ~3 t2 l# f( G9 O
#include "MyMCIWave.h"#ifdef _DEBUG
; P2 ]3 k  O; B4 i#undef THIS_FILE
. o/ \$ z+ C3 `5 T2 Qstatic char THIS_FILE[]=__FILE__;$ T9 Z& u) V) D8 J7 E
#define new DEBUG_NEW% a4 [# j! C' V; w
#endif//////////////////////////////////////////////////////////////////////) U7 M: V& x. q7 {8 ?0 A. c
// Construction/Destruction  D: t( x3 h& O2 Z# ~
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
5 ^# u8 K) r" \% S{2 b% F% e$ u0 g) y/ W0 S. C9 V
//进行状态指示变量的初始化
7 O. m6 n8 w  D5 [$ i/ T m_bPlaying = FALSE;
1 _( I- H4 q. h+ @6 J5 A    m_bRecord = FALSE;8 V) S! F7 |% s( R  ^( {$ n# n
    m_bOpen = FALSE;
8 h0 c5 I/ x; |1 m    m_wDeviceID = 0;
* _) ]5 O* D# C2 r4 y/ ~}CMyMCIWave::~CMyMCIWave(). O6 d- U; w" {' a$ ^* N
{+ r3 X" ^0 ]* w: n; n
CloseWave();//关闭WAV文件
) @$ S/ v& \* u/ s- n/ z/ a}
7 H9 S3 {8 o: F& [' ?! ^6 M7 ?DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
6 g& |2 }% |4 `& t$ F4 ~1 ^  b{, N" T+ ]8 P# D) U9 _- O! m# _* ]
if (m_bOpen)//如果文件已经打开% Y$ S% ~$ _7 _/ D7 l" l5 B* v
{
, Z8 b' J  N9 F$ p! ?/ P. \9 R  CloseWave();//关闭该文件0 E/ ~8 L  Q  W0 B) E' [2 L
}
" |' F/ _9 Z" I: P DWORD dwOpenFlag;//打开标记
: z' Y8 f8 Y' j% J MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
' J: j. g5 v; G& ~0 Q% |0 c mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型6 B" h" Y/ u9 W9 v& ]& r
mciOpenParam.lpstrElementName = strFileName;//打开文件名
3 @' N4 X3 t' s$ v5 a+ {3 ]! t //初始化MCI设备
9 h* z$ \! r4 C/ Z7 A dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);2 h# l. e, k  j& g3 L) p1 g2 R. K" b
if (dwOpenFlag)//初始化失败8 ]/ v. ~3 C* Z
  return dwOpenFlag;//返回错误代码# G3 A5 w; J: J+ ]0 ^8 h
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID3 H" b9 ?, {& n
m_bOpen = TRUE;( g4 a) W9 X3 N0 `8 B8 @5 V
dwOpenFlag = 0;, }9 Z$ c: s' j& T! [
MCI_SET_PARMS mciSetParam;0 F5 l/ |# D9 I
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒; {+ S2 }; C7 i2 [( |5 \
//改变时间控制设置
  s- I: k/ I9 @0 c/ Q! m dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);0 H5 F7 L& J& {5 n( a
if (dwOpenFlag)//设置失败
2 ]9 V% G# p" y  return dwOpenFlag;//返回错误代码
8 ?8 e0 o$ M, x0 O) j return 0;7 J) f8 N0 g! e6 H: T/ p
}DWORD CMyMCIWave::PlayWave()//播放波形文件4 B! E3 _4 _# a& y
{$ j8 S/ R. u' s7 e, A1 ]7 l+ @
MCI_PLAY_PARMS mciPlayParam;/ @) T, h, h" ?4 K4 ?' G7 a
DWORD dwPlayFlag;, G! K  I% F0 S
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
: ^. k' b" y( o/ Q/ Y if (dwPlayFlag)//播放失败- O2 C8 n6 r& j. L) m
  return dwPlayFlag;//返回错误代码
, l& h, N; o) [" U) T" P  k5 w2 l else& L# v2 g- m8 [, V
{5 k$ m* b8 f" v2 b
  m_bPlaying = TRUE;
6 H2 V* r9 [1 D1 c3 J9 f5 A  return 0;
" I* T0 N5 o8 Y4 G/ c1 y8 P% X' u }
, _8 A8 I/ }% E9 V. N5 j3 f. z}
$ G& a, E. q' G, u! L4 M  \0 y% n3 \void CMyMCIWave::StopWave()//停止播放波形文件
$ c5 _, T$ b8 z% b: }6 S4 l{
- u6 M- c1 I7 d! [! ] mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
  |/ c$ C7 A: Y- d}7 l0 l+ I7 E) @# P. N' a( d
DWORD CMyMCIWave::RecordWave(), i+ i9 t4 o' ^
{! N2 \6 k% P$ W6 S# R
if (m_bOpen)//如果有文件打开
+ c- h( q2 q2 I3 S( N: N9 Q- s  CloseWave();//关闭文件# z8 _) E3 r0 V7 e) G6 }) c# ?
DWORD dwRecordFlag;
" H* w$ P9 P; r5 ]* z MCI_OPEN_PARMS mciOpenParam;$ B' u& _; k9 h8 X2 @) O* `* N3 x
mciOpenParam.lpstrDeviceType = " waveAudio ";
0 j9 ?7 \- k9 q; x! u8 l9 V5 r$ }! D; { mciOpenParam.lpstrElementName = NULL;1 C; r4 P8 E! g2 L
//初始化MCI设备, D# Z1 D6 B: M: Z0 n7 I. t; o) g
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);5 o' c5 b0 c, x6 I9 b
if (dwRecordFlag)//初始化失败
$ g2 O3 v( D' I$ N: d  return dwRecordFlag;//返回错误代码) U$ z) Y0 W- f2 a3 O- T' t& l
m_wDeviceID = mciOpenParam.wDeviceID;
+ c4 {$ |& d1 @ MCI_RECORD_PARMS mciRecordParam;
0 L$ J0 b# W1 m( h9 r) B. u; N1 r //开始记录数据
  O( ]5 v, {4 g0 _5 x3 R dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);6 i/ H5 M, [9 w8 [# u
if (dwRecordFlag)//记录数据失败
" L  Y2 @' V5 B( [, c  return dwRecordFlag;//返回错误代码
  N6 h, G. p0 S% I- w' ~3 g, t m_bRecord = TRUE;& v' y; @$ R) E2 ~/ A5 l
m_bOpen = TRUE;. j* K: F2 [' ?/ S2 V  f
return 0;
7 g: G* e9 M5 W  _}" N3 H/ s/ x. y/ B* ?
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件' d, B2 z& J$ `) L5 V' n" p
{) X# }0 t; z' K5 ^9 H! `5 }( e+ j
    if (m_bRecord)//正在录音
7 k$ {$ V- a4 P: {! a        return 0;//返回' e( N. m5 f/ z9 o9 H5 L$ L; |
StopWave();//停止录音
0 z0 J$ I! a0 l: O: _ MCI_SAVE_PARMS mciSaveParam;
+ c- l2 Y7 I; z' h! j7 c8 a mciSaveParam.lpfilename = strFileName;//设置保存的文件9 |7 N0 c& |4 h
//保存WAV数据到文件
' F. M; u0 V; e% |0 B" R# T$ Z& T. {2 x DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
% e* T1 w, b9 T! G if (dwSaveFlag)//保存失败
8 e( y& B  |: t5 n2 I) A9 o) {  return dwSaveFlag;//返回错误代码
, H6 z5 G, J5 P; m6 \' T( @ m_bRecord = FALSE;* j/ {9 W& f% O* O) v+ Q
return 0;
% D- k7 k( L' a}7 A" X$ V1 n9 F- n
DWORD CMyMCIWave::CloseWave()9 p& o7 Z  q, Q+ E& k  c8 @
{
& x: z7 r, T. F+ f if (m_wDeviceID)//有MCI设备在工作
0 m+ `8 z/ @+ i1 F. B$ P2 g {
( b0 w, K6 ?& m/ l6 G; I( O  DWORD dwCloseFlag;
. R3 _/ |, U% q) p1 R# A! l  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
$ p, _6 `# d8 D. V8 l  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
5 E8 z9 {( g# V" n4 F  h3 N  if (dwCloseFlag)
: `; K7 G* k" g: x2 s6 I9 N  {
% g' t" u7 c1 x" i8 g- f' X; k) y   AfxMessageBox("关闭时出现错误");
. T' K: j2 H4 W$ |3 d" O$ `; Z   return dwCloseFlag;
$ C0 i8 }$ h0 t& ~  }
( e3 M: T; m8 V1 p1 l }
  g. ^  S7 H/ m' Y //设置状态变量/ W, Q5 ]) `8 |5 x2 ]
m_bRecord = FALSE;
( z4 ]9 w) K# _9 q2 t+ G9 l. p2 `3 ~ m_bOpen = FALSE;1 D$ J4 w7 t+ ~$ W1 g( u. g0 S2 Y, e
m_bPlaying = FALSE;* u0 r8 \, d4 O
m_wDeviceID = NULL;
; j6 q7 q" t9 h  r6 t return 0;
% M+ f8 s( o5 L' j# r2 L; Z, Y; ~}
- t, W  V- Z, o, w4 PDWORD CMyMCIWave::GetSampleRate()//获取采样率
0 ?" l" l  f2 K# x{: w. _" v& }' @* z* z( K0 T
MCI_STATUS_PARMS mciStatusParam;
& i! D6 `8 ~( p2 o0 r# @4 H mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率' V3 a$ J' N! \+ S7 A3 [4 I
//MCI设备的状态信息(采样频率)
6 D; W( v$ v3 J; k1 y; w! \/ ~0 { DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
9 j/ S! r: X& t! d* f; X if (dwStatusFlag)1 C$ r& u' n# y& ~7 [/ n0 `
  return dwStatusFlag;//返回错误代码2 f- J  A% E- ^; t, m, N: C
else
! D* \+ x8 _; @. S  return mciStatusParam.dwReturn;//返回采样频率6 T! E4 `: p: E7 Z' W$ i+ ^& o
}0 m5 `3 r& e2 D- \
DWORD CMyMCIWave::GetChannel()//获取声道数
  W4 e) `0 j# L7 v) i{
9 H$ J* B$ l- N; r: v, z7 o8 h MCI_STATUS_PARMS mciStatusParam;9 k- Q) a9 t/ I1 o
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数: v1 y: V$ H2 ?5 e0 {
//MCI设备的状态信息(声道数)
/ D4 @3 X) A3 g5 W5 f! v DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);  c. w+ G# \4 {. i0 r4 Z& V
if (dwStatusFlag)' x# b3 O% X6 s! _
  return dwStatusFlag;
+ s+ F: ^, Y1 e5 @ else$ P2 T3 [& @: [
  return mciStatusParam.dwReturn;//返回声道数
- T9 n& X$ a4 T7 r: @: S7 A7 ^}4 ?) P; H& C1 N/ R# m4 `
DWORD CMyMCIWave::GetBitLength()//获取声音位长
0 \  B0 V, F6 k/ W0 @+ J) i{
, i, B, U$ I- w& s; [ MCI_STATUS_PARMS mciStatusParam;
3 B' ~! l- t1 d) E mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长% K* z$ [# E. P* i/ e% x- w6 }
//MCI设备的状态信息(声音位长)1 a7 j2 f/ S2 d# w2 N9 J% v
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
. W1 K# X% [1 ~# E* l* h5 { if (dwStatusFlag)/ `4 ?5 j) d( x5 F  N$ @+ E: b' ^* Q
  return dwStatusFlag;
' D8 @, J% m* I" w# v else
5 g( S- }- X- n; e  return mciStatusParam.dwReturn;//返回位长
$ }+ Q/ j8 K5 V* B* w}
7 N4 n8 u' S( q) g( TDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
5 ^* Y  M+ m" l' g: T2 f{/ U7 x( l5 E6 H7 a5 z3 x
MCI_STATUS_PARMS mciStatusParam;
& z/ ^, t2 o6 B: ]; J mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
4 Q" d0 H; e, }/ |% a7 e. }. k //返回MCI设备的状态信息(音频长度)
/ z8 m2 r1 N" \9 |8 s3 p' F DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
# ?& h  E: k: {9 q4 j% r3 i if (dwStatusFlag)
5 r3 |& o9 r+ f4 W2 r+ n  return dwStatusFlag;# u2 h) S& ]( y: c+ `
else
  B& k4 h- L# p' h2 l  return mciStatusParam.dwReturn;//返回音频长度
/ U7 F2 L3 @$ K" B  E5 g" s}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 02:34 , Processed in 0.017136 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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