找回密码
 注册
搜索
查看: 2526|回复: 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.; i' \- d7 I7 t4 r
//1 a9 B3 z- Y- j. Y+ I- y, I
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)
4 j3 z% x1 f  G: n: z% n#define AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_#if _MSC_VER > 1000
+ ^3 a: i" t& N0 k#pragma once
7 @4 u) x! _2 l. u1 z) {#endif // _MSC_VER > 1000: v" Y9 ?( O' a" E& m3 E
#include <Mmsystem.h>   " n* r  C, ^3 |/ k  N
#pragma   comment(lib,   "Winmm.lib")   
# F; z; |" {9 b7 w1 g& G& _, dclass CMyMCIWave  ' Y! Y4 R' x$ S# E+ Z: i/ l/ p
{
% }* i" K/ t4 E1 Wpublic:
8 B/ S# i/ q1 u* A) k9 n9 u CMyMCIWave();//构造函数
9 H9 b0 H" B* M" X7 [9 {" U, E& T virtual ~CMyMCIWave();//析构函数! |- g. `" V* \4 |
DWORD OpenWave(CString strFileName);                  //打开文件
2 ]( A* `; G3 T' B% X* E) \ DWORD CloseWave();                  //关闭文件
5 S7 D- H! t3 B5 b8 d3 S DWORD PlayWave();                   //播放
* H6 ?0 K" C/ ]5 R6 C  @ void  StopWave();                   //停止播放
7 ^7 x5 |  O! k: T3 x) K DWORD RecordWave();                 //录制
3 C2 i* ?& J+ K  z0 Q5 I6 d DWORD SaveWave(CString strFileName);  //保存
! ~; j& w. F% H/ F DWORD  GetBitLength();          //得到位长; A' {: \, N! L7 J2 i$ g$ S
DWORD GetSampleRate();          //得到采样率
; Q. x7 N3 K3 o8 h  r3 u DWORD  GetChannel();             //得到当前声道
' F; C& h: g' E# |% T, d9 y DWORD GetWaveLength();         //得到音频长度
$ ^; Z# p2 H' A  ypublic:8 I( l/ G# \5 h! y# @/ ]: u
BOOL m_bPlaying;               //是否正在播放
, q$ J$ u+ k2 k5 d. D- R1 g' z BOOL m_bRecord;                //是否在录音" ^( k! h9 f6 n# P; }% A
BOOL m_bOpen;                 //文件是否打开0 c3 m' G+ M, ]* ^1 E9 O/ I& ]
WORD m_wDeviceID;            //播放设备ID9 M$ z: N, }8 a
};#endif // !defined(AFX_MCIWAVE_H__4D73F398_C689_46D2_AD2A_446EC8C3137F__INCLUDED_)  // MCIWave.cpp: implementation of the CMyMCIWave class.
9 @4 k% I  x3 N! _0 ]6 I//
3 a% D0 ]5 b' _//////////////////////////////////////////////////////////////////////#include "stdafx.h"2 Y: I' l# H% y$ D1 r
#include "MCIWavPlay.h"; {- a: q3 r" F! [8 e0 F
#include "MyMCIWave.h"#ifdef _DEBUG
% H: b6 Z( ]# f/ w7 F9 f#undef THIS_FILE8 w7 E3 a6 ?# Y( n7 U: {
static char THIS_FILE[]=__FILE__;( f2 J5 d- s' L1 c9 m1 Q
#define new DEBUG_NEW
+ R8 @, j: q1 Y- X8 z- q+ {#endif//////////////////////////////////////////////////////////////////////
/ D7 p6 Y) H5 q// Construction/Destruction' h; \! H' J" B  _4 P6 @8 L# V: r
//////////////////////////////////////////////////////////////////////CMyMCIWave::CMyMCIWave()9 K- ^/ m% |: i9 @
{+ E1 r2 h0 B% D  p2 M7 q# @
//进行状态指示变量的初始化+ {5 P- ]0 \4 {2 \& L6 ~5 x/ ^9 }
m_bPlaying = FALSE;
1 k" n# I% Z) F/ V, Q    m_bRecord = FALSE;
$ a% C  R3 {1 n# c' o. O    m_bOpen = FALSE;5 m# m$ n7 X* M' y0 o# X
    m_wDeviceID = 0;/ v" g; G. p$ K! x4 N, w
}CMyMCIWave::~CMyMCIWave()
6 w; r. l( B' y( \  X! U) A{* g- L+ w5 u( M
CloseWave();//关闭WAV文件& Y* o$ D$ @6 ~2 f
}
" m* d8 @) j- Y+ o( tDWORD CMyMCIWave::OpenWave(CString strFileName)//打开波形文件; l, i# g: `% Q# Y1 T9 G
{
& p  J; K9 z* |- ^5 U4 ?" z if (m_bOpen)//如果文件已经打开& o7 r; ^& }5 Q7 L; o* ]" H
{
; C$ }' \# b+ m( e" J  CloseWave();//关闭该文件3 `2 v2 y6 R0 ?) t6 `, ^
}' M( U# \7 J" c! m8 g
DWORD dwOpenFlag;//打开标记
/ O+ x' r$ ]" G2 {2 ?- d- I MCI_OPEN_PARMS mciOpenParam;//MCI_OPEN_PARMS结构) T4 q/ m; J% A  f6 l, L) C
mciOpenParam.lpstrDeviceType = "WaveAudio";//MCI设备类型8 Q( r+ c/ k1 A7 y' M" h" v- |7 q
mciOpenParam.lpstrElementName = strFileName;//打开文件名
% W/ D" k1 r- h2 q& D. p& k //初始化MCI设备2 f! R% D2 {% q
dwOpenFlag = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD)(LPVOID)&mciOpenParam);
) r5 Q, z" z5 |" v2 i. _, R if (dwOpenFlag)//初始化失败
- b! w2 \+ j4 k. |  return dwOpenFlag;//返回错误代码- O, ]0 b* ]. N
m_wDeviceID = mciOpenParam.wDeviceID;//设备ID3 l1 l0 m: n: v9 c& a7 @( a; b6 s  v* l
m_bOpen = TRUE;
" t+ c& q2 X+ `( { dwOpenFlag = 0;2 {$ [+ ]3 `7 ^
MCI_SET_PARMS mciSetParam;& T* x8 Z9 }, w- q5 O  [
mciSetParam.dwTimeFormat = MCI_FORMAT_MILLISECONDS;//时间参数设置为毫秒
; {6 O7 x% N' t5 u+ Z( K7 g //改变时间控制设置- B& V6 q# e& `, H' {. r8 Z
dwOpenFlag = mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&mciSetParam);- P/ e2 y% {0 z+ F
if (dwOpenFlag)//设置失败
( g  Y6 _5 t5 h  return dwOpenFlag;//返回错误代码
4 M( t: Y* g8 E4 f return 0;
; z- }- w" b: V9 r( F/ U}DWORD CMyMCIWave::PlayWave()//播放波形文件5 u1 `7 k2 f+ k6 e: N. L6 J
{) X' y' w3 G- h. }; d7 X
MCI_PLAY_PARMS mciPlayParam;
8 K& z8 D( K! T" G* M DWORD dwPlayFlag;
5 p0 C+ n# t$ v' @' a3 F dwPlayFlag = mciSendCommand(m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID)&mciPlayParam);//开始播放数据& ?, `: L- R  P. z: W
if (dwPlayFlag)//播放失败
" A+ \# |6 M5 N1 y8 l+ o, a8 {  return dwPlayFlag;//返回错误代码
- T" P. r' M( X8 Y  M! A else) y6 A8 B& Y$ K: [8 q3 P- M7 L
{( ?2 F7 I; \. ?0 B% G, l- ^
  m_bPlaying = TRUE;9 w4 q7 j* |/ g( K4 B5 t
  return 0;
# O9 l" d( q- i }: J5 C+ S% @  C
}
4 r9 o! f$ u, j4 |$ Jvoid CMyMCIWave::StopWave()//停止播放波形文件/ p" c  g) U- A0 T/ i0 g
{
! G+ ~9 E1 k: |5 p( Y5 Q) }1 J mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);//停止播放
; r; ?' a2 \( ^1 D0 q; u4 J/ D! o" X}
/ Z# r) K/ k% i' _3 c6 _: U- r  KDWORD CMyMCIWave::RecordWave()+ L! e% F+ d6 T4 ?6 v3 n1 x5 ~# k& x$ s8 }
{4 U) U& V. J3 B( ?4 U" U
if (m_bOpen)//如果有文件打开4 j. i# N( m" R9 Q
  CloseWave();//关闭文件
* G$ a/ \& A! w DWORD dwRecordFlag;
) Y/ b2 i' ^4 |( r MCI_OPEN_PARMS mciOpenParam;& P' \: r( Y; z4 g+ l' A
mciOpenParam.lpstrDeviceType = " waveAudio ";* g$ N; v+ }% K  C* x
mciOpenParam.lpstrElementName = NULL;$ ?- e, @8 O% G9 B/ C
//初始化MCI设备2 J- l; F: C' h& a
dwRecordFlag = mciSendCommand(NULL, MCI_OPEN,MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID)&mciOpenParam);
, d: T! D% I) o1 o0 x if (dwRecordFlag)//初始化失败0 Z$ {1 m* y! T  K
  return dwRecordFlag;//返回错误代码# e( A/ }- c& f
m_wDeviceID = mciOpenParam.wDeviceID;- f9 i! ]9 U: a2 b/ |# Y
MCI_RECORD_PARMS mciRecordParam;  c6 U' p2 \- h7 A9 B0 Z. E
//开始记录数据
5 ^( n, U! @8 E8 K, ~( r dwRecordFlag = mciSendCommand(m_wDeviceID, MCI_RECORD,MCI_RECORD_OVERWRITE, (DWORD)(LPVOID)&mciRecordParam);# g9 F9 T$ |0 d! w
if (dwRecordFlag)//记录数据失败9 z2 @' }0 K, H% S
  return dwRecordFlag;//返回错误代码2 ]9 R7 w, _1 U/ J. ~' T9 h
m_bRecord = TRUE;8 h" R1 d% w, `$ m
m_bOpen = TRUE;) F4 y* P0 Q6 t, l1 z
return 0;
. o, f4 L3 s8 r8 ~! b}
. ]6 V5 V& V, m6 f: i* f& m* C( E6 k* _DWORD CMyMCIWave::SaveWave(CString strFileName)//保存波形文件
7 m' o* l8 R$ z{+ F' f1 R, ?8 p- X; p+ G
    if (m_bRecord)//正在录音6 l8 C; s6 D6 [
        return 0;//返回- M) ]& Q: y! t' B# m1 h
StopWave();//停止录音
% p) P: [/ C5 r- L: N' V MCI_SAVE_PARMS mciSaveParam;
3 I7 _% ]0 d* R1 X mciSaveParam.lpfilename = strFileName;//设置保存的文件
# A! w% g$ j+ v' T //保存WAV数据到文件
1 f( k( K: G$ e4 G- }0 z3 Q% ] DWORD dwSaveFlag = mciSendCommand(m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID)&mciSaveParam);/ p+ ^: U" ~) l2 p  z, l
if (dwSaveFlag)//保存失败
/ W* F7 p( U" z  return dwSaveFlag;//返回错误代码7 Q  ]2 ~$ O# v# F
m_bRecord = FALSE;1 F- ]) u  D" c0 R4 F& G
return 0;2 ]% v% M+ M9 Z3 i5 @: N9 {0 f3 H
}, A( i: \/ c& j0 P0 ~
DWORD CMyMCIWave::CloseWave()# k/ F$ m3 H% \' i+ Q
{
; P/ S# G# r, h7 b0 d/ ^ if (m_wDeviceID)//有MCI设备在工作3 W7 [$ [$ j( x9 t6 M
{3 F- K+ a# Q7 U' B# C. p6 T
  DWORD dwCloseFlag;
5 L/ Z9 B5 x4 C2 E+ x" F: C  mciSendCommand(m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);//停止工作
4 u' R- ]% Z; J+ w6 ~- u  dwCloseFlag = mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);//关闭设备
# l" A. w0 N! q9 v5 B  p  if (dwCloseFlag)8 b6 E2 U4 S$ N1 s; K+ `5 T
  {
+ A: y$ A" Z5 |1 ]& k3 J6 V# R* E   AfxMessageBox("关闭时出现错误");
# _* u+ U2 i8 W8 E- B, w   return dwCloseFlag;
2 E" V7 H0 l( [  }+ p7 s  |. y% R1 g2 W
}: y+ {: L# x/ r) F0 a% ?/ t
//设置状态变量
" ~% w2 t' M' R- Y8 y$ Q m_bRecord = FALSE;7 _- D4 l2 t, d
m_bOpen = FALSE;
, j+ Q1 L8 N! l% k! [' ~ m_bPlaying = FALSE;$ d' Z# [: x0 W9 ~6 f1 }# @1 j
m_wDeviceID = NULL;! D2 A$ X3 C7 |$ B. F
return 0;
- B8 u$ _; E( Y6 {" d# J}' l5 Z: j- J8 ~
DWORD CMyMCIWave::GetSampleRate()//获取采样率
' V. V1 G1 g2 w' x8 }$ W{$ V3 y4 }4 i" ]$ b
MCI_STATUS_PARMS mciStatusParam;
, v1 Q, q& h; r2 s( M9 I9 V mciStatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;//采样频率  C# l8 h0 p( N+ P& F* ~
//MCI设备的状态信息(采样频率)
! D. I- ~' F" T1 Y/ U1 f( v; ^ DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
' V; u/ M4 @. z; A! }  ~5 e if (dwStatusFlag)
- p  R3 K% I# Y: A! i6 n& n1 I  return dwStatusFlag;//返回错误代码- b8 X9 F$ |- S% I! `; p& j
else
! h$ t6 E) T! `' C) ?0 K  return mciStatusParam.dwReturn;//返回采样频率7 u0 Z1 J/ I! X# x9 x3 W: I: q4 t2 O5 M
}1 s% D4 J+ X- i; t# b- M
DWORD CMyMCIWave::GetChannel()//获取声道数
. ?, r) M" w+ ?. _/ @{
/ T0 M5 z0 \3 V0 L$ n MCI_STATUS_PARMS mciStatusParam;
) Z, P( m3 V. s! A& z$ O mciStatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;//声道数. P. }  d. k' a5 [' k( Z% Z, w
//MCI设备的状态信息(声道数). ]! O! m* `9 n, g2 K
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);; x& L, k$ M4 c" f# _) u
if (dwStatusFlag)
: ?' Z0 n6 k9 G( k  return dwStatusFlag;8 E, Z- f! R/ }; a& J  z9 b
else# ~, k$ n; n: Q3 P7 l
  return mciStatusParam.dwReturn;//返回声道数
: V" b1 |2 _+ H: h/ |% o- D}4 c" ^: u: k& Q+ ^# L
DWORD CMyMCIWave::GetBitLength()//获取声音位长1 E% Q- Y1 }3 W. J. ?
{
1 R1 I& q# g( v2 F MCI_STATUS_PARMS mciStatusParam;0 S4 S' j2 c& }& ]
mciStatusParam.dwItem = MCI_WAVE_STATUS_BITSPERSAMPLE;//声音位长
: ]; Q8 [7 g8 f2 A6 R" x) e //MCI设备的状态信息(声音位长), }1 H  j, q% L: N4 k/ `
DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
; S; M6 [# u2 S1 S( C! H if (dwStatusFlag). t. _8 Z) A+ p' ?
  return dwStatusFlag;' d( E% o# E4 H
else
0 U) |% @6 C8 H- l; l  return mciStatusParam.dwReturn;//返回位长0 B/ _. z0 _3 |/ [6 P1 A
}- J' ^8 F0 \! d, h
DWORD CMyMCIWave::GetWaveLength()//获取波形文件的时长
! G2 W4 F3 D" ~% {) |  r+ q{
' }) d" n1 Z3 L% b  d) l- q- ~$ { MCI_STATUS_PARMS mciStatusParam;
4 ~0 R2 V. V( L$ W7 b/ y mciStatusParam.dwItem = MCI_STATUS_LENGTH;//音频长度7 y4 ~" H0 p9 v4 ?
//返回MCI设备的状态信息(音频长度)
+ w+ m7 D. d6 |4 k6 `/ _$ c$ ^ DWORD dwStatusFlag = mciSendCommand(m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParam);
' M4 x! d% q/ |$ J if (dwStatusFlag)
' B% O% y5 M% Q  return dwStatusFlag;' _5 X  P4 N5 Z
else
7 J5 f! K: q: D/ n3 c8 G. @  d  e2 {  return mciStatusParam.dwReturn;//返回音频长度9 q. q4 v6 J/ O# Z
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-20 03:46 , Processed in 0.040312 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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