找回密码
 注册
搜索
查看: 3052|回复: 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., C/ P4 Y! ?, B3 C# Q7 i
//& _$ u* l/ F% g5 {8 g' o
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
7 b' W" O0 O$ {1 v! G#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
" s8 t$ K* T+ T6 z# T' N2 W#pragma once
% E- @& S- L4 p% [6 Y# C( F#endif // _MSC_VER > 1000
0 S3 c: I( S- ]6 q. u* K+ H2 b' H2 y#include <Mmsystem.h>   0 d1 S) [$ ~  h! G: Z: k; I
#pragma   comment(lib,   "Winmm.lib")   % V9 s! v" ]2 ^% S/ ?$ t
class CMyMCIWave  
4 ^. L3 E* F- ?6 K{
6 |' w7 F6 t6 q! g5 ]public:
: p( p( I' j; S7 {! \" m, ~ CMyMCIWave();//构造函数5 c0 x! @% h3 E% x
virtual ~CMyMCIWave();//析构函数) p% W+ C! J' s- R
DWORD OpenWave(CString strFileName);                  //打开文件4 R1 g! k% r; p' W6 [3 T- u
DWORD CloseWave();                  //关闭文件
  J, C" {( y+ l  T* Z' V DWORD PlayWave();                   //播放5 L3 S/ d& G2 y
void  StopWave();                   //停止播放- S9 k- W( N6 K2 A
DWORD RecordWave();                 //录制/ c& u8 o  Q6 J5 `0 n# I) Z* I
DWORD SaveWave(CString strFileName);  //保存
1 R0 q$ u/ a" V DWORD  GetBitLength();          //得到位长: p" u! P6 V* ]2 K& y+ w' v
DWORD GetSampleRate();          //得到采样率  N* [* `# X# [5 [9 P: X" M
DWORD  GetChannel();             //得到当前声道' \( b/ i' _  M
DWORD GetWaveLength();         //得到音频长度- @' k$ x6 M- ]1 c, O! |* {
public:
' Y+ Y. f$ ~( v. f, U BOOL m_bPlaying;               //是否正在播放
. w! \7 [2 M' F- N BOOL m_bRecord;                //是否在录音/ H0 J" [) [0 l6 }5 ]2 g
BOOL m_bOpen;                 //文件是否打开
1 ^! Q  S/ J" i, q! N' G; [% e WORD m_wDeviceID;            //播放设备ID
! E8 m& F. Q" A# E3 ]& g};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.7 |# A- q5 ]( n; T
//% n* o4 j3 P# }+ {6 ]7 f
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
/ S( Q9 D& Y7 ?5 G#include "MCIWavPlay.h"0 r/ {; z# ~8 B) U/ f
#include "MyMCIWave.h"#ifdef _DEBUG
& y/ N3 Y* Z0 |, ?' H#undef THIS_FILE
) k3 m3 ?+ {$ I: i, a- F5 N1 Qstatic char THIS_FILE[]=__FILE__;8 f2 f$ N% R. Q) A7 \: k
#define new DEBUG_NEW4 p1 j# c  i/ }1 S7 V) F' ^
#endif/////////////////////////////////////////////////////////////////////// C8 ^0 z, P9 |" {
// Construction/Destruction
0 s" P+ {( u4 W" S3 ^//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()
/ V% e$ k/ q/ i2 q{
4 o& S; H$ O9 d3 N4 X( ] //进行状态指示变量的初始化
6 b, s5 @9 v+ R% p m_bPlaying = FALSE;
1 j9 `$ K8 q4 {* w    m_bRecord = FALSE;/ P& B1 F2 S; G$ p
    m_bOpen = FALSE;
2 @  F) i. U% R; o    m_wDeviceID = 0;
3 c0 ~& O, v6 A( j! Y- I1 W2 i}CMyMCIWave::~CMyMCIWave()  W, r4 Q4 @% N% o) P2 G$ D
{, W( u/ Q$ j$ ?7 g# W
CloseWave();//关闭WAV文件
# \- o- K) R& G}) X+ U8 L4 H+ Y7 Q
DWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件
5 A# P  l8 }+ M* a2 [) {' z+ c{
) @4 |; B7 S5 \' ^, ]3 g if (m_bOpen)//如果文件已经打开
# T# n! E7 n: \! u. F( e& c {
7 @( _, x# O* _9 i# y  CloseWave();//关闭该文件
9 k) c% }8 a5 [% i5 l8 ~0 M* b }
3 t) p0 A+ y7 V$ B; _ DWORD dwOpenFlag;//打开标记
7 [" d1 f% @! {4 H6 a( f MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构4 }+ o) C; M$ `. B8 C/ W4 K$ m
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型% u. j# Z; z, `. O3 ?5 c
mciOpenParam.lpstrElementName = strFileName;//打开文件名0 S& {2 F% D3 a$ g( J/ R) I% d6 q
//初始化MCI设备) O9 d1 w- o) B- L" n( n* \% U
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
- n1 v2 R" H/ G. ^3 a if (dwOpenFlag)//初始化失败- I! Z0 B0 ]2 R4 d/ P4 P; a. V! w
  return dwOpenFlag;//返回错误代码
+ d7 e$ ~% i, m& R& O2 @ m_wDeviceID = mciOpenParam.wDeviceID;//设备ID" y( e2 K. H7 A; L
m_bOpen = TRUE;
- Y4 X$ j3 N1 I4 B) [8 `6 l8 H dwOpenFlag = 0;2 W! {1 f- K$ p
MCI_SET_PARMS mciSetParam;
5 a0 r7 z8 W( p0 T: b* d( q  X mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
' ]6 V" m* W+ a+ i, W- y //改变时间控制设置' s1 f/ H$ r: c" N( X- w
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);" Z; a' E. B' i" [' v: U9 ~
if (dwOpenFlag)//设置失败5 {/ D, q' I/ S  }
  return dwOpenFlag;//返回错误代码; M: r2 C9 R. Y, l/ y
return 0;1 j" N* v! [# h. o0 e
}DWORD CMyMCIWave::PlayWave()//播放波形文件8 _* R9 \" n3 ^7 W* [+ t8 N9 G" R- s
{
: z4 A: P# Y1 z+ b0 }1 ]: }2 S: v- i MCI_PLAY_PARMS mciPlayParam;" X' t9 n* m( ^0 @# F; `
DWORD dwPlayFlag;
+ s4 C: W- I  j, z6 D dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据$ x) @4 c8 B: n& |0 I* b
if (dwPlayFlag)//播放失败: t% {" b* |5 S
  return dwPlayFlag;//返回错误代码
0 P3 A. u8 ]8 S/ R else
9 g1 w3 a/ N5 X8 B {
3 J4 p; T7 h/ T# Y, U1 R  m_bPlaying = TRUE;. r/ A3 {( f1 D0 I1 Z0 D+ L+ }8 }
  return 0;$ d7 Q/ \8 c# R: e1 f% i
}
3 F9 d. j" x" M}5 f( K; g6 v- i, z9 u
void CMyMCIWave::StopWave()//停止播放波形文件5 E+ M1 e# v& a$ R
{
8 Z+ S! J( A: p- R; {7 | mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放. i# G7 {2 U: ?$ j) H) m
}
6 W$ \9 D6 e  z% M# [* R' h) v2 ^9 {DWORD CMyMCIWave::RecordWave()" ~2 b( G& z# P
{
0 x' z+ Y( K4 w if (m_bOpen)//如果有文件打开
2 B5 z, o9 D# j8 `9 |  CloseWave();//关闭文件# K1 G+ ~! s4 {0 I2 o
DWORD dwRecordFlag;
6 d. a: f! e3 `3 U MCI_OPEN_PARMS mciOpenParam;- e" l6 _( t! e4 o0 R' z
mciOpenParam.lpstrDeviceType = " waveAudio ";0 Y, a) [% J) |6 B' g% U; G3 B
mciOpenParam.lpstrElementName = NULL;
% W* |1 s) N! U# X" f7 u  m. p //初始化MCI设备
% O3 I  T& A; o# ~0 t dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
# O5 D- n, q, ~- v3 { if (dwRecordFlag)//初始化失败6 G9 Z5 b: V$ P7 p# C
  return dwRecordFlag;//返回错误代码' c) `- y' _8 o& S2 ]7 i8 Y7 Y. l
m_wDeviceID = mciOpenParam.wDeviceID;
' B6 i& F* t& A0 N1 \ MCI_RECORD_PARMS mciRecordParam;
" `3 M0 I* x% P! U' @9 | //开始记录数据
* u( j/ u. ~3 q' ?+ s dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);
7 q! U% _% F. i/ v& T/ G if (dwRecordFlag)//记录数据失败4 j/ A7 a  X/ y8 n# t$ C* ^
  return dwRecordFlag;//返回错误代码8 w4 Z! j( r% y3 p1 X; L8 I
m_bRecord = TRUE;
: }* ^, I6 H0 d* l9 w" G4 W! }6 g# I m_bOpen = TRUE;
7 M6 O  X$ Q- ]( G( q return 0;
1 A6 }/ v0 y1 v9 T3 p* F# t}
( I" ]4 ?; Q/ @* O4 @9 c  L: mDWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
, D2 r1 F* o' j{" ~( n, n& B4 `5 h8 j2 h1 {4 Q
    if (m_bRecord)//正在录音
- ^# R. O8 O7 ^7 K        return 0;//返回
! ]: [% ]: K! V StopWave();//停止录音
8 e; B. A5 g+ y4 @% j( t MCI_SAVE_PARMS mciSaveParam;8 p4 F) q5 l4 a! n; _  F) H3 c
mciSaveParam.lpfilename = strFileName;//设置保存的文件! y6 n- H9 e. u* _( h
//保存WAV数据到文件' T& |, z2 A" n( v2 ?( Z( G1 A: }
DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);
; A! R6 i6 ^+ B; z& x, k% h if (dwSaveFlag)//保存失败8 Y0 q) v  i, U0 ^) V$ `2 M
  return dwSaveFlag;//返回错误代码# ^% P5 f3 }2 g) w
m_bRecord = FALSE;5 N% T/ t' t1 Y0 J
return 0;' ~; g  B* e- E, Y! ^1 O
}
+ \# ]% |- @0 k: S! ^- _6 r  o. wDWORD CMyMCIWave::CloseWave(): D' E8 E) ]" d& f
{
2 L" G  W' O5 M4 }, p/ M7 c if (m_wDeviceID)//有MCI设备在工作
# X6 c3 o# }1 H- |4 y" i {
8 C  ~, B' X  N  M  DWORD dwCloseFlag;
- p: P# Z9 Z+ ]. g% g' n2 p  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作3 z# B  q9 S% u+ t) T4 L: ]
  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备' B7 [+ J% c4 C4 g, U# A0 n
  if (dwCloseFlag). L& |9 `; ?. v
  {' w8 E& i7 t9 u! l7 E5 C$ ~
   AfxMessageBox("关闭时出现错误");
; Z6 A3 c8 d* \4 b8 G4 d7 {- a   return dwCloseFlag;* N3 T: S+ m  J/ z  X, c0 a
  }
, c" K0 y% k. U" f }
& r1 c7 e/ a5 h) W% _$ t //设置状态变量
: ?. @( P; R- Z. Z5 d m_bRecord = FALSE;2 A, d% P6 I+ k) _* }( U; j
m_bOpen = FALSE;3 m1 t: o, d& @: Y
m_bPlaying = FALSE;
: _0 D, ~  o5 ?3 i0 N6 _' T m_wDeviceID = NULL;, t" F( p. G+ Z" I( |# q" B
return 0;" |) I5 @1 t- V$ E  G  G& k  @
}
* t: D) p* @) P$ |DWORD CMyMCIWave::GetSampleRate()//获取采样率5 s3 n! n* M1 v$ y9 @) Z+ Y7 }2 J
{4 V$ a9 y+ h, u6 Z4 u! {! l$ Z: u( D
MCI_STATUS_PARMS mciStatusParam;( R2 }0 l: O4 G, L- e' \
mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率
% ^* E, k* x0 z //MCI设备的状态信息(采样频率)
/ V3 X. _% y; Z8 W; W6 d. w DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);# p3 \6 ]2 O* P$ m, S2 }
if (dwStatusFlag)
# M$ I/ E* G6 c2 _6 P0 o, I8 H! A  return dwStatusFlag;//返回错误代码
2 _5 G: s- M8 w9 P* h: S$ c8 o else
" e; M% y5 i$ s: X& j+ ^' @" p( M  return mciStatusParam.dwReturn;//返回采样频率
) [3 S. J" l9 L7 L3 c}
0 m# R0 `8 B3 ^! v& p. H9 ~DWORD CMyMCIWave::GetChannel()//获取声道数* `, l; a* I" A$ z
{! _+ D) v. H5 B) @2 t& j( X2 V0 r
MCI_STATUS_PARMS mciStatusParam;
3 s- u; U! }- Q7 C$ E mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数- \; H9 }0 N! ^, K8 L. j
//MCI设备的状态信息(声道数): r: {- r4 D+ L; t7 x
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
, S4 F" v4 [+ E if (dwStatusFlag)8 A8 s% M4 P& t. r$ I$ n4 v
  return dwStatusFlag;
0 S: g& [. c0 M" A else
  a/ I, h5 n/ }+ l; x4 T* ^  return mciStatusParam.dwReturn;//返回声道数9 [/ ?! \5 k* `
}
1 f' ^) d6 H0 }6 z/ fDWORD CMyMCIWave::GetBitLength()//获取声音位长
4 b( U" d6 k" L4 t( ~3 w$ Z{
" X8 v0 N( {- ?  @: z$ y1 u0 E MCI_STATUS_PARMS mciStatusParam;' l7 L+ O, k: f- c( O' f: R, ^
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长& j$ {9 F1 |7 x% H6 m* w1 I
//MCI设备的状态信息(声音位长)
. K  k) i+ [# \* y/ C) G DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
9 S2 j' s8 U/ j/ h2 F2 S if (dwStatusFlag)
9 s, I' {! b$ K; i! t  return dwStatusFlag;3 ^3 l0 a) _8 u5 e3 v' i% \
else
, a9 {( g: o( K. ]+ r3 X  return mciStatusParam.dwReturn;//返回位长
& j, w5 b0 ^$ Z/ `: }. ^}
* y  L0 {/ A# U6 K3 `: g! M+ O& C2 ^+ `DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长# P& s2 H$ K- [& Y( z
{) a' \, p9 l' d. D! s
MCI_STATUS_PARMS mciStatusParam;: E1 E5 L" |3 y+ N$ V! I
mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度
( V) N* n8 A' r" h //返回MCI设备的状态信息(音频长度)
' T) i  L$ U- o DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
( C& Q; ^6 N: a* C) { if (dwStatusFlag)
, Z" B: }% A4 D0 _$ g  return dwStatusFlag;
# U- e% ~( r; S* ]. L, U$ y1 ` else7 W1 h& c- y# i- T
  return mciStatusParam.dwReturn;//返回音频长度
* e6 \8 A  D& D/ q5 z/ e}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 07:39 , Processed in 0.017802 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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