找回密码
 注册
查看: 3238|回复: 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.; Q2 q' t* H0 `2 o# m
//
  b% {. C* w1 l6 g0 l' s//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
1 h" Z9 G" |3 A  n  @7 `#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10000 y: R. n* \* r3 H  T
#pragma once
, Y( H5 v# m, g  h#endif // _MSC_VER > 1000
6 X! @8 ]  q& @* s$ p#include <Mmsystem.h>   
/ \% K! a9 g: P  z! d/ P#pragma   comment(lib,   "Winmm.lib")   % w* m! V2 ]3 [6 m  v
class CMyMCIWave  5 r2 |" x0 `8 z) m% y* t
{
4 S( R& b! G! ?/ b' n9 n& X  M  {public:
+ H; D( S, l9 b* b2 O CMyMCIWave();//构造函数' r/ ]" S0 b0 K, _4 ]
virtual ~CMyMCIWave();//析构函数
- U  A$ B! k: l2 ^0 X1 X2 o DWORD OpenWave(CString strFileName);                  //打开文件; r2 d9 N  A0 d( [9 d! Q; |+ d+ Y
DWORD CloseWave();                  //关闭文件( a& v* N! u$ N2 p. T% b6 ?
DWORD PlayWave();                   //播放7 W) S4 g! a; P6 X4 e2 H
void  StopWave();                   //停止播放
0 B" g$ }4 f2 t  K& \ DWORD RecordWave();                 //录制$ p/ M" X( y  r" P( A0 A
DWORD SaveWave(CString strFileName);  //保存
4 T! R- g; K7 l6 E# u2 X DWORD  GetBitLength();          //得到位长
3 G4 v6 S4 s) I  f9 R+ W5 A DWORD GetSampleRate();          //得到采样率2 {- l6 |6 t1 D6 Z" K8 g& Z
DWORD  GetChannel();             //得到当前声道( c; O1 O7 j. B
DWORD GetWaveLength();         //得到音频长度
& q8 P" ~2 I# w  bpublic:: v& f: X% ~! n; q5 j2 q) V
BOOL m_bPlaying;               //是否正在播放
* T  I' e, `: ?" |0 D BOOL m_bRecord;                //是否在录音* N; m1 f- X" c2 _! V
BOOL m_bOpen;                 //文件是否打开  }, q4 Z  }3 F; c6 L1 a* \
WORD m_wDeviceID;            //播放设备ID! B6 x9 @/ Y: y7 @0 N4 c# T
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.# |+ _: k6 S9 z) _
//) F: O- U+ Q+ y
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
) G. q. ~$ w  m9 J#include "MCIWavPlay.h", h+ M) n1 Q# j0 `
#include "MyMCIWave.h"#ifdef _DEBUG1 r, g3 A6 V8 t$ p
#undef THIS_FILE
3 z" e* p1 p! c* |static char THIS_FILE[]=__FILE__;1 N& g; D6 A: Z
#define new DEBUG_NEW6 g9 J  i, k, B" Y  r
#endif/////////////////////////////////////////////////////////////////////// S6 V/ q+ q% ]* t/ @' q9 L5 e" m
// Construction/Destruction
) z$ s# h/ L% f//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()2 w3 {1 Y  q: P8 ~; \
{( O, R% U( |! W/ @( _" B
//进行状态指示变量的初始化
/ x7 i' j2 s! j m_bPlaying = FALSE;
9 B( b$ v# p' d/ P+ G    m_bRecord = FALSE;2 e6 Q* U! W) L& i% w. Y! I
    m_bOpen = FALSE;, _$ W2 q7 ~& w/ G! g0 F9 u0 Q
    m_wDeviceID = 0;. K8 L9 K5 e4 x5 u* S% Y
}CMyMCIWave::~CMyMCIWave()0 n" H! B4 i9 f3 ]1 h
{7 b$ f+ {3 c8 K. O* j1 d6 @  d
CloseWave();//关闭WAV文件' R  f* |. ^/ R: O$ ~
}! t# R) N( [! l5 O# y3 w
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
5 G4 C$ U( f3 P  P" }: i, e{* [& R2 A; [. l! g+ }( A) R
if (m_bOpen)//如果文件已经打开+ \, Y# |/ t* B  ~9 }& t
{& w9 G1 X  x4 D" V
  CloseWave();//关闭该文件
/ M0 ]7 h+ h1 o- k2 g6 F5 p% L }$ g/ P4 Q5 c/ y1 Y4 a+ W
DWORD dwOpenFlag;//打开标记
# L$ K6 m5 Q' W* Q9 [1 Z MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构) t: y7 n5 @- T
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
) W" G0 E) |1 _: ? mciOpenParam.lpstrElementName = strFileName;//打开文件名1 c9 T2 S! X" S) _+ v0 \
//初始化MCI设备  ~) V$ l0 u$ z, K( S5 }
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
( K. r9 m: [$ O( i# m4 l; { if (dwOpenFlag)//初始化失败: {' i" P7 \0 U% E1 g& Q
  return dwOpenFlag;//返回错误代码) M6 ?+ G8 L- x- i. F& ^& F
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID0 X, A0 u& O$ [  \! q! W) H7 U1 u
m_bOpen = TRUE;. \0 W7 V8 n9 @# h
dwOpenFlag = 0;" B. c5 R8 x, J7 W
MCI_SET_PARMS mciSetParam;  g) X( D8 ~* j, E) W% c
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
; a& Y, a7 l& @5 L //改变时间控制设置9 }7 M  [  I1 y" M/ C& J5 A
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);
! T0 Y; d) }! `. B& c2 v if (dwOpenFlag)//设置失败' z4 \- D  L. }3 {# x; ?' E4 c
  return dwOpenFlag;//返回错误代码* p* U( r) o1 E+ `6 V: o( a- N; R3 x
return 0;! i; l6 H  f$ X6 ]2 Y% W  F, @
}DWORD CMyMCIWave::PlayWave()//播放波形文件8 h7 m' B1 J+ K8 H# N
{
0 i8 W& a! d/ Z1 S$ H( y' U" Y5 `" p MCI_PLAY_PARMS mciPlayParam;& A( @* d. C+ n2 [9 G, K8 T$ n# J
DWORD dwPlayFlag;
3 }$ v" q# q5 F! V2 o+ P dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据
* P- u% X, f) \! }% E if (dwPlayFlag)//播放失败
$ q0 ?; ]+ }2 ~; X2 ^$ \  return dwPlayFlag;//返回错误代码
' g! s* ?; E0 F else; C1 `' A6 s/ w* r
{
* g( E. S4 H% B/ [  m_bPlaying = TRUE;
# V, ]- [, ?' w4 t( R0 c6 s  return 0;0 A8 j) J0 q' J7 u7 q" S' z0 D
}8 u9 w0 ^4 }/ w/ `
}
& @0 z: I9 f' E, ~! vvoid CMyMCIWave::StopWave()//停止播放波形文件! M7 J7 T, w3 T( W
{! t/ Y8 }& m4 W2 U* J
mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放  g) e  F) K# [8 B4 x
}
; r4 l5 d( b, L% M( QDWORD CMyMCIWave::RecordWave(): d3 p  ]! N* P  A* g! S- i
{' k9 n2 \# y: y7 q+ b( {
if (m_bOpen)//如果有文件打开
, X9 z; o4 V. y; [$ e6 J  CloseWave();//关闭文件6 t7 i- x! o7 ^: ]. o( U) ^" M
DWORD dwRecordFlag;
8 r! D5 P& l* l/ g8 T4 P# Y* A) B MCI_OPEN_PARMS mciOpenParam;
* e  w  ^" s3 F3 R mciOpenParam.lpstrDeviceType = " waveAudio ";
$ J' o1 `5 S3 g* X mciOpenParam.lpstrElementName = NULL;
  N, i3 f' f' ^) x% l$ S" @6 c2 T //初始化MCI设备
0 T; \( b# Q; a( ]9 f7 `" } dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
  D: {1 w# {, p: c0 W if (dwRecordFlag)//初始化失败
4 M+ k3 u& S+ D  return dwRecordFlag;//返回错误代码, M0 Q  e9 q- b" p  s
m_wDeviceID = mciOpenParam.wDeviceID;
7 x: ]- u# Q! d6 r7 R3 T* J2 D9 a MCI_RECORD_PARMS mciRecordParam;
2 m; u+ m" Q" t  g7 { //开始记录数据
4 f! G, s) p. e6 P+ x dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
' w  f1 C; I* e. r+ P# C2 q2 O7 B if (dwRecordFlag)//记录数据失败: B3 R+ e1 u. h9 U9 `8 m: v' |
  return dwRecordFlag;//返回错误代码
& H/ [+ W" O4 B  G m_bRecord = TRUE;  Z. r0 m' X. E0 C* d
m_bOpen = TRUE;8 ]1 [; ?: Y- `
return 0;( i8 I/ f6 \$ U! F. v
}* `; [7 y7 `" Q# G7 Y7 A
DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件7 Y- P6 L$ G, u6 ^4 Y  H! {8 E: A
{4 k6 U3 t3 }) G+ j+ P6 n
    if (m_bRecord)//正在录音4 y4 x. V$ n" }' o8 q( Q: h
        return 0;//返回
* U" C' x0 y. [3 I! `* T* C7 ]7 J StopWave();//停止录音, \4 Q2 L8 {9 ~+ t& }
MCI_SAVE_PARMS mciSaveParam;2 q! K/ v5 B3 j2 O, n- a% Q7 S4 F4 G
mciSaveParam.lpfilename = strFileName;//设置保存的文件6 {2 j1 S" U9 K& k3 A9 C
//保存WAV数据到文件
0 l* r: I, C5 E) ] DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
5 N3 W! Q; h& m% d! C  F if (dwSaveFlag)//保存失败
% e" I5 |' i8 y  return dwSaveFlag;//返回错误代码" c0 \8 e( i/ w5 M  V8 [
m_bRecord = FALSE;7 E' Q5 \% e3 U1 s
return 0;. L. E9 U9 q' n" z
}# m+ W* X$ t& `: e  N
DWORD CMyMCIWave::CloseWave()/ D! J8 U, ]. A+ {7 N
{; }8 }; E2 |- @
if (m_wDeviceID)//有MCI设备在工作
: y1 {2 ^+ z+ M0 G' V+ A6 w {5 R, H# I* m: A( a
  DWORD dwCloseFlag;3 m. T  Q) E$ a4 z( i. s
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
8 i; B) E$ ~, {9 {: Y2 \" m& [  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
+ q: B# \$ j( i- h5 N0 C" n+ n  if (dwCloseFlag)
! r% z9 ?6 j  w$ r% i. C  {
3 a' c3 x; u$ H$ R) H/ ]. _' {+ [   AfxMessageBox("关闭时出现错误");, @$ G' w/ R6 I' k' G
   return dwCloseFlag;* I! S; {) N% b2 @# K9 D
  }( M. X) ^/ K0 y1 q& B
}3 m( v+ N6 B, O3 v3 C# I
//设置状态变量+ F( m$ J2 @+ D/ X
m_bRecord = FALSE;
' U: w' v/ R0 I$ @, f: }+ q m_bOpen = FALSE;
1 o' C( [8 {* j* m4 k m_bPlaying = FALSE;1 ?* C; K! H& b* n9 `- j( `1 ]2 o+ I
m_wDeviceID = NULL;/ F! Z$ S4 y( V& X) B4 m
return 0;! x" T: `3 S1 s7 f) C( Q
}/ m; {% H9 F9 O: n1 U% g& O4 X
DWORD CMyMCIWave::GetSampleRate()//获取采样率; o  E- r! z+ I: k5 l# e9 J  r
{
6 a. N9 W8 G* m! @" d. K MCI_STATUS_PARMS mciStatusParam;0 ?( H7 ~4 L% z) O( q
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率$ N- C1 ?2 C" g( {8 U! A2 p
//MCI设备的状态信息(采样频率)
3 b. f' i5 U3 B- k DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);5 s, E  D  B1 r1 ^, S
if (dwStatusFlag)
2 l, a, O6 ~0 y# t4 g5 b. q  return dwStatusFlag;//返回错误代码
  e$ |2 M8 o" d* A+ d% ^ else
1 r* ^/ h3 R1 @  return mciStatusParam.dwReturn;//返回采样频率$ w' x0 R2 m0 c+ j  Z8 }2 A: j1 S" z# Y
}$ T+ H) ~. }' y: o: e, T3 `
DWORD CMyMCIWave::GetChannel()//获取声道数
  ^, j1 e$ \3 Z) |$ ?2 J/ N" w{
8 g2 c( y/ K$ E- A* a: P" l MCI_STATUS_PARMS mciStatusParam;" `: }% M3 l  A, J) E
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
( W3 g# d( u  Y% D //MCI设备的状态信息(声道数)) n* P$ j1 d& S# G2 ]7 V8 \7 G* M
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);2 C4 G  w  {2 Y. t' {
if (dwStatusFlag): S' X, y' [- t1 Q$ W
  return dwStatusFlag;
, K/ D( F7 r4 d' } else
$ d3 L2 b6 A8 k' J  return mciStatusParam.dwReturn;//返回声道数& K: G0 y: X3 M" _6 D  s% f
}* w9 e9 A( z3 a
DWORD CMyMCIWave::GetBitLength()//获取声音位长: b, m3 E: Y, i# F/ k( J
{
$ S; G& p( [; R8 B6 _! O: p9 l MCI_STATUS_PARMS mciStatusParam;
7 ^2 K: R/ `, u% l mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长* G, f3 i% A7 M2 J
//MCI设备的状态信息(声音位长)& O+ J' X7 G) r6 w! B1 q
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
7 V8 ?( {: ?6 \- T) p* r if (dwStatusFlag)6 y) h& X. G, D; A
  return dwStatusFlag;2 T  B- U: ]0 d* _" O8 Z' A9 @' _" |0 `
else
) x( o- ~: l) c6 X1 ~  return mciStatusParam.dwReturn;//返回位长) U! h  y; n2 O& z
}9 }  X* |- ^8 C
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长2 ^' a0 b4 p  r
{
7 }# L9 P( s6 d3 S* p# d% g MCI_STATUS_PARMS mciStatusParam;2 k" Y3 Y$ N, F! G/ u
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度1 S/ D; p' u  X' o, s8 N
//返回MCI设备的状态信息(音频长度)
8 O7 w. n: t: G/ l  F. @$ M" t DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);. o& d$ S6 `2 k
if (dwStatusFlag)' {" u' D0 j" ?/ c- m9 ~, y) r2 D. j, ?
  return dwStatusFlag;
4 J) A3 Y4 M; N( x else3 ?7 f/ g: z; Y" J$ r1 _
  return mciStatusParam.dwReturn;//返回音频长度  ]4 {$ ]/ I* O% c. f8 s
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 03:52 , Processed in 0.016539 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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