找回密码
 注册
搜索
查看: 2599|回复: 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.% ?0 q) a3 Y; G# Z
//1 F' R" t; m0 h7 ~8 ~2 H
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)1 N0 J8 Q3 h5 t' v
#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 10003 N- g  h$ l6 O. R6 W) ]
#pragma once* G( H% C+ J  ^$ z2 p8 K, Z
#endif // _MSC_VER > 1000- ?8 S: g* N1 j
#include <Mmsystem.h>   0 {/ M( o9 [$ ?7 T/ i7 A" n' W' w
#pragma   comment(lib,   "Winmm.lib")   
- ~  h. z! J# }9 X$ iclass CMyMCIWave  7 R1 l& G2 [; O; y4 y9 O0 \. D) w
{
. K3 T' ^% W+ U7 Gpublic:* A& O2 l- u0 B& ?& R; S0 v
CMyMCIWave();//构造函数- y3 c, S) e  D" W, K
virtual ~CMyMCIWave();//析构函数" s8 J7 G$ h/ P! V% f5 l4 K0 \
DWORD OpenWave(CString strFileName);                  //打开文件
/ t/ D/ G  h7 x4 \* }: \ DWORD CloseWave();                  //关闭文件
: I/ b# Q; Z# f. w, ^# T6 g" `9 Y DWORD PlayWave();                   //播放
5 v6 {3 f' R4 b  y$ @) X* ]& W void  StopWave();                   //停止播放3 \1 y; p3 R% `/ n3 A5 _
DWORD RecordWave();                 //录制
& A/ s# b% F% M2 K# O DWORD SaveWave(CString strFileName);  //保存
; ]/ n6 E7 P% G& o, r! y DWORD  GetBitLength();          //得到位长) y; n" y; d  k0 _/ B+ j* J; H
DWORD GetSampleRate();          //得到采样率! a( `5 G/ u! E7 M  n
DWORD  GetChannel();             //得到当前声道: W6 {& H$ j. |- N+ j: I9 v( {
DWORD GetWaveLength();         //得到音频长度
* M. V6 n1 a+ o1 ]. c! spublic:
& i4 L" a* l: h7 m) A BOOL m_bPlaying;               //是否正在播放1 k4 Z) u" J9 ]" t3 ?- W  `7 O
BOOL m_bRecord;                //是否在录音
0 d7 A( `. r+ n: g# Q BOOL m_bOpen;                 //文件是否打开( r1 }' ~9 Y! U6 f9 G# i' a2 I) f
WORD m_wDeviceID;            //播放设备ID; F+ Q& v& z% O  b9 B
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.3 U  \0 H6 B0 [0 X
//; R* q/ T+ ?) J4 |
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
8 Z7 N: d1 c7 t4 v5 ^+ [4 G#include "MCIWavPlay.h"
3 Y" g+ u3 o, x+ B# x#include "MyMCIWave.h"#ifdef _DEBUG5 u3 l( J' E) h$ p+ w+ I6 |  p
#undef THIS_FILE
$ o0 b9 `4 }3 t1 A7 vstatic char THIS_FILE[]=__FILE__;
/ c3 V) b5 \8 `8 o#define new DEBUG_NEW  ~. e8 z" e* q4 o2 ]  y
#endif//////////////////////////////////////////////////////////////////////
6 k- Q( K  U  d, g// Construction/Destruction/ j6 A! T8 f. [9 e
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
9 I  a- s, R  Z( c. B7 o& L{1 a& W0 ^6 s- |- D5 p6 [
//进行状态指示变量的初始化
6 d$ C+ a5 s* N m_bPlaying = FALSE;
; V& _- ^& R. S  q  q! B' _    m_bRecord = FALSE;2 t: r' p. e2 u7 V; c, _
    m_bOpen = FALSE;0 W* H8 s3 i# E7 ?1 R
    m_wDeviceID = 0;  x" u! j0 a$ d
}CMyMCIWave::~CMyMCIWave()2 F  j9 O1 L* v+ D) E& V3 C
{6 r, S+ n7 ^: P2 M9 h) I
CloseWave();//关闭WAV文件; J8 f6 _1 c$ v% T3 b/ j
}, d7 [0 U" e: O! X: z- g
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件/ c$ q" ?" w1 O9 C( D# Q9 m
{: Z6 i& L$ I- ~; z% N/ Z
if (m_bOpen)//如果文件已经打开
+ R0 G9 }. s* o1 B6 J" `; A* P {; e/ F8 q& Y' S
  CloseWave();//关闭该文件
' A4 S6 Q% n. T% C8 ` }( p7 w8 C0 M( F$ e
DWORD dwOpenFlag;//打开标记
' z( M' w( ]0 f" ?( x$ }! J MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构
/ ], g) P8 d" }3 x9 c5 [: V mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型
1 v5 N! P( f8 | mciOpenParam.lpstrElementName = strFileName;//打开文件名
4 r7 K' T! \# X, c& Y& g9 {+ N  v //初始化MCI设备
* _8 c8 z  Y  Q$ _- e dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
7 k/ `! L0 l6 d. N1 C$ D! y/ X if (dwOpenFlag)//初始化失败
9 a2 y1 h1 D/ B3 y$ d  p  return dwOpenFlag;//返回错误代码! U" |! J; N7 B  y& x8 K: k
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID
' X" n! S2 u& {" B3 n" D m_bOpen = TRUE;, ~& k1 P( f/ G& [# e5 `: k
dwOpenFlag = 0;
' |. u. l9 W5 V% [ MCI_SET_PARMS mciSetParam;
$ N6 f( K4 Y  P/ I mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
, [/ f5 ^! A& V  C0 h+ y% f //改变时间控制设置
2 B  K0 I+ ~. ?5 x7 u6 p' \0 M dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);( Y( r5 d" h8 F$ v+ V8 k0 }# y* e
if (dwOpenFlag)//设置失败* Z% x9 t( W# K  D% f" i( G; H
  return dwOpenFlag;//返回错误代码( X! E2 @5 S0 }! n
return 0;
9 p) _0 ]& T5 @, ~' Z}DWORD CMyMCIWave::PlayWave()//播放波形文件
7 l0 x: F7 Y1 F3 K) ?& H{1 n3 w6 [% g2 [( Q+ E5 H! t  V& y
MCI_PLAY_PARMS mciPlayParam;' p( \& h! w& k, {4 b* n' Q
DWORD dwPlayFlag;+ x2 T* v5 @3 |/ N3 d0 q
dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据8 X) K2 g. t8 V4 l! p; }
if (dwPlayFlag)//播放失败4 |$ }9 D, F, p0 m+ F% _
  return dwPlayFlag;//返回错误代码) H" A" y* ]& J) `8 y4 i% e
else7 e5 e$ h* }  H. v; x5 S
{
# m% @0 Y/ S9 p+ ^7 B, w  m_bPlaying = TRUE;4 M( h! M9 [! z+ e$ ~
  return 0;
5 |* R! M* `) C+ y# k }
1 K0 }+ p! G* k, [0 c1 c}
, X) \" P$ X  r. T" d# E1 X' @void CMyMCIWave::StopWave()//停止播放波形文件5 ]2 {% _0 o" T& i7 @6 e! Q% H, R
{
8 Q! ~2 k) o$ Z- c2 ^ mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
9 I$ N" @# n# G- r}
3 m9 @) A! _/ }- EDWORD CMyMCIWave::RecordWave()% P2 q+ `. U! y: [7 u0 _7 M
{
, n1 I8 w4 L2 m7 U: J7 U0 D if (m_bOpen)//如果有文件打开! W" ^: R/ [$ h8 W+ A: {
  CloseWave();//关闭文件6 q3 K/ b; }3 s  _
DWORD dwRecordFlag;
  `. e7 ~9 ~/ Y. x MCI_OPEN_PARMS mciOpenParam;
  Z5 e6 @" q- o: q, b) e! D mciOpenParam.lpstrDeviceType = " waveAudio ";
1 S! e6 ?4 g! [, E mciOpenParam.lpstrElementName = NULL;# l1 s1 r* d" \4 r6 N7 L5 O
//初始化MCI设备
2 r; Q* X/ ^! d- z. Q2 m4 t dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
; ^( t" }, K0 b1 r if (dwRecordFlag)//初始化失败# v. J" Y% q( e
  return dwRecordFlag;//返回错误代码( I0 d0 x1 }8 ], T
m_wDeviceID = mciOpenParam.wDeviceID;
2 r. H* G! m4 ?: h7 N$ b/ N0 @ MCI_RECORD_PARMS mciRecordParam;
7 z* T" J! J! P/ |6 E //开始记录数据" F7 _0 S! Q" k! h( s! ~" p
dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
  f( Z2 r4 H! {: r/ C) E if (dwRecordFlag)//记录数据失败8 A2 E- {, O1 B2 R' P3 v
  return dwRecordFlag;//返回错误代码: ]0 B* w" {; |
m_bRecord = TRUE;
3 X( t3 D2 i! A  v% H# N m_bOpen = TRUE;
, Q" y( N/ F+ Z9 i8 N return 0;7 Z% A! D5 b* U% ^2 o5 c
}
8 @9 A/ s- t5 h& T1 M9 }DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
# y1 x* G! f, T3 j; _3 }{: z( ~' W: [( S# a" G
    if (m_bRecord)//正在录音
; O' _* Z, B5 c! Y        return 0;//返回
% M6 P1 H; h' G  K StopWave();//停止录音8 o' ^  P9 {' I" c7 n! ~, w, E% \: |
MCI_SAVE_PARMS mciSaveParam;
1 A! s4 Y7 C/ m9 O  @# ]" o2 e3 s8 X mciSaveParam.lpfilename = strFileName;//设置保存的文件
% }9 C6 c0 w8 J8 H$ [6 P! s6 H //保存WAV数据到文件
+ F0 E8 W5 K1 V/ z" ^ DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
1 {/ T: z8 U% t- Z# y/ T' y if (dwSaveFlag)//保存失败1 V8 R& b. `- x3 v1 A
  return dwSaveFlag;//返回错误代码- w7 h( {" F2 \  Y0 o% P
m_bRecord = FALSE;
4 G9 \, j# ~5 ?/ N( [  F return 0;2 F+ W" H% x- j& q+ R
}0 p$ B) {9 ]5 @- r: p
DWORD CMyMCIWave::CloseWave()
; _" n3 V1 p" {8 ]{7 {/ m* [: H8 ?- G
if (m_wDeviceID)//有MCI设备在工作
+ w" N- q+ l, w& m( o {7 u( Q& N5 f. v# g% L, ^" P
  DWORD dwCloseFlag;& r0 U% O) m* ~! C) h* I0 q
  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
2 j( ?- O$ p0 h' D  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备; U& f$ |9 {8 m. z! {5 H) d
  if (dwCloseFlag). @/ F/ M5 H3 n0 B
  {% u/ D  n  }% b6 N; O8 Y
   AfxMessageBox("关闭时出现错误");8 j. d  j3 x" o% s
   return dwCloseFlag;' W) I$ {5 c- F) y. f/ @! ~6 o. X
  }
; C8 d/ [7 f3 |, ^) G4 C }
* Y5 n$ h( {- u7 @4 i2 L7 A //设置状态变量! E9 W0 Q9 C( i, G
m_bRecord = FALSE;
$ q( W2 {3 E7 Y m_bOpen = FALSE;% p5 K) p8 M6 o# e& I4 m: K
m_bPlaying = FALSE;( f9 v* q: S# j& d0 _( O  U
m_wDeviceID = NULL;
) R7 `% M. [8 w# z return 0;
" F6 C5 ^  k3 Q}/ g9 m0 K: J+ E$ z8 l5 D1 f
DWORD CMyMCIWave::GetSampleRate()//获取采样率
) v+ I' F0 J  X0 d/ s, \{
) n0 B; g7 ?$ B+ O. ]9 @ MCI_STATUS_PARMS mciStatusParam;
6 E/ i+ c+ M1 e2 w mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
  j6 G+ B7 m+ M" Y; Y$ g: V //MCI设备的状态信息(采样频率)0 B# d# R7 O* Q% ?  l9 X6 ?
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
  k: P# O3 ]$ n0 b# m. o if (dwStatusFlag)3 f- u) T, o6 s' p1 O* l
  return dwStatusFlag;//返回错误代码& y/ |: g, P) E: y% H5 b: S/ ~  ~
else& @! S" o$ ~/ V6 o4 a, K
  return mciStatusParam.dwReturn;//返回采样频率3 z# T1 `, ]- M$ G# Q
}
' H% d. m% H6 v: ?" C$ [% KDWORD CMyMCIWave::GetChannel()//获取声道数
: Z% f, H$ G9 a{
! o6 N+ s! _( Z6 p; Z( c; n7 E MCI_STATUS_PARMS mciStatusParam;) s5 c4 d+ c1 i) k* D; q
mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数
6 U+ D7 j5 V7 J' N" I //MCI设备的状态信息(声道数)4 Y7 O3 E& F) Y" b! ?
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);# q4 b- H; o- N7 t: s( q
if (dwStatusFlag)
" B) z( S! x+ M  return dwStatusFlag;7 D& Y2 f# g; Q
else6 y8 l" l/ L9 I6 N2 R
  return mciStatusParam.dwReturn;//返回声道数
5 R7 `) Y) N% N1 F- `' M! L}
+ I; n8 Z  X: Z+ J2 RDWORD CMyMCIWave::GetBitLength()//获取声音位长
/ _0 D: R+ P* Z7 j' N{* M7 g0 u, S& u) u! Y# H/ x
MCI_STATUS_PARMS mciStatusParam;
9 j8 e. H; o$ g+ n: r mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
$ o: R  J( Q2 b( b7 ^; [8 ^$ f4 z //MCI设备的状态信息(声音位长)* X2 T# G& {, [" y  r8 S" K
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
/ p: I& ~" E2 e4 C) ?$ D if (dwStatusFlag)
$ L+ v) L: O0 j8 C/ N  return dwStatusFlag;; D: ^+ a& }1 ~+ u; M
else6 N  c- o3 ?0 j% S4 s. h5 T. p
  return mciStatusParam.dwReturn;//返回位长
7 Z( g( o. u1 h* y3 `}
: u6 [/ ^5 x8 Z7 tDWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
) @+ |4 x- R0 P, X  D9 L, X{; X- D  R+ ?) {, v
MCI_STATUS_PARMS mciStatusParam;
8 d; f. V* ~6 e: k6 A; W/ g mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度) q) x% r8 _( D( n/ r8 e6 j  l. b
//返回MCI设备的状态信息(音频长度)- i( E7 Q" r# ], U! o- ]
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
6 q  P* g7 F  A& {' @% x/ L8 ~ if (dwStatusFlag)
; d& h( i# F" e. {& \& M  return dwStatusFlag;
8 w7 Z* M8 S5 l: C4 W/ [" S else
' d) F/ R. F% A& b! O, ^  return mciStatusParam.dwReturn;//返回音频长度4 k3 G5 p' \7 x% O! Z: O
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 20:14 , Processed in 0.034045 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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