• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
在VC中如何播放大型WAV文件
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
在VC中如何播放大型WAV文件
软件发布 在VC中如何播放大型WAV文件
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> VC教程 >> 在VC中如何播放大型WAV文件

在VC中如何播放大型WAV文件

添加时间: 2006-2-12 3:24:12  作者: VC教程  阅读次数:260   来源: http://d9soft.com

          在多媒体软件的设计中经常要处理声音文件,用Windows提供的API函数sndPlaySound可

  以实现小型WAV文件的播放。但是当WAV文件大于可用内存时,sndPlaySound函数就不能

  进行播放,那么如何利用MCI播放大型音频文件呢?本文将介绍一种方法。

  Windows支持两种RIFF(resource interchange file format,“资源交互文件格式”)音

  频文件:MIDI的RMID文件和波形音频文件格式WAV文件,本文将介绍如何用MCI命令播放

  大型WAV文件。

  用sndPlaySound播放音频文件只需要一行代码。比如实现异步播放的方法为

  sndPlaySound("c:\windows\ding.wav",SND_ASYNC);

  由此可以看到,sndPlaySound的使用是很简单的。但是用sndPlaySound播放音频文件有

  一个限制,即整个音频文件必须全部调入可用的物理内存。因此应用sndPlaySound播放

  的音频文件相对较小,最大约100K。要播放大一些的音频文件(在多媒体设计中是经常要

  遇到的情况)需要使用MCI的功能。

  本文创建了一个Cwave类,可以处理播放音频的MCI命令,因为该类能够执行很多的MCI命

  令和建立了数据结构,所以只需要简单的成员函数(如OpenDevice, CloseDevice, Play

  和Stop)。在CWave类中抽象了特定的MCI命令和数据结构,只含几个简单的成员函数Ope

  nDevice, CloseDevice, Play和Stop。波形音频设备是一个复合设备,如果打开波形设

  备,然后打开并关闭每个波形元素,最后关闭波形设备,这样可以使得播放性能更好。

  调用Cwave::OpenDevice就可以打开波形设备,OpenDevice将MCI_OPEN命令传递给mciSe

  ndCommand函数,如果调用成功,就用数据结构MCI_OPEN_PARMS的wDeviceID成员返回波

  形设备的标识符,该标识符保存在一个供以后使用的私有数据成员中。

  一旦打开了Cwace对象,通过Cwace::Play播放WAV文件就就绪了,WAV文件名和一个窗口

  指针被传递给Play方法以便将MCI通知消息发送到制定的窗口。

  WAV文件的播放分为两步。首先要通过分配一个MCI_OPEN_PARMS结构并给所要播放的WAV

  文件设置lpstrElementName成员打开WAV文件。将该结构和MCI_OPEN传递给mciSendComm

  and,打开WAV文件并用MCI_OPEN_PARMS结构的wDeviceID成员返回元素标识符。

  第二步是命令波形音频设备播放WAV文件。分配了MCI_PLAY_PARMS结构并将dwCallback成

  员设置为窗口句柄。如果要同步播放音频波形文件,就增加MCI_WAIT标志并跳过窗口句

  柄。这样做会使应用程序在mciSendCommand函数返回之前等待WAV文件播放完毕。最可能

  的情况是异步播放大型WAV文件,可以象下面那样指定MCI_NOTIFY标志并设置dwCallbac

  k成员做到这一点。

  MCI_PLAY_PARMS mciPlayParms;

  MciPlayParms.dwCallback=(DWORD)pWnd->m_hWnd;

  DwResult=mciSendCommand(m_nDevice,MCI_PLAY,MCI_NOTIFY,

  (DWORD)(LPVOID)&mciPlayParms);

  这样就开始了WAV文件的播放,并且在播放完毕后,MM_MCINOTIFY消息会发送到指定的窗

  口,图1给出了一个WAV文件播放所发生的事件序列:(1)命令播放WAV文件并立即返回;

  (2)播放WAV文件;(3)完成后发送通知消息。

  图1 播放WAV文件

  完成播放后关闭WAV文件元素是程序员的责任,简单的调用Cwave类的Stop成员函数

  就可以了。Stop成员函数将WAV文件标识符和MCI_CLOSE命令传递给mciSendCommand函数

  ,不必为该命令分配一个MCI结构,下述代码关闭了WAV文件

  mciSendCommand(m)nElement,MCI_CLOSE,NULL,NULL);

  播放完所有的WAV文件后必须关闭波形音频设备,Cwave类的析构函数调用Cwave::C

  loseDevice自动完成。

  将本文中介绍的CWave类加入到自己的程序中,就可以方便的应用它播放音频文件了

  。

  //建立Cwave类,放在Wave.h文件中

  class CWave:public CObject

  {

  //Construction

  public:

  CWave();

  virtual ~CWave();

  //Operations

  public:

  DWORD OpenDevice();

  DWORD CloseDevice();

  DWORD Play(CWnd *pParentWnd,LPCSTR pFileName);

  DWORD Stop();

  //Implementation

  protected:

  void DisplayErrorMsg(DWORD dwError);

  //Members

  protected:

  MCIDEVICEID m_nDeviceID;

  MCIDEVICEID m_nElementID;

  };

  //Cwave类的实现代码,Cwave.cpp

  #include

  #include "cwave.h"

  CWave::CWave()

  {

  m_nDeviceID=0;

  m_nElementID=0;

  }

  CWave::~CWave()

  {

  if(m_nElementID)

  Stop();

  if(m_nDeviceID)

  CloseDevice();

  }

  DWORD CWave::OpenDevice()

  {

  DWORD dwResult=0;

  if (m_nDeviceID)

  MCI_OPEN_PARMS mciOpenParms;

  mciOpenParms.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;

  //open the wave device

  dwResult=mciSendCommand(NULL,MCI_OPEN,

  MCI_OPEN_TYPE MCI_OPEN_TYPE_ID MCI_WAIT,

  (DWORD)(LPVOID)&mciOpenParms);

  //save device identifier,will use eith other MCI commands

  m_nDeviceID=mciOpenParms.wDeviceID;

  //display error message if failed

  if(dwResult)

  DisplayErrorMsg(dwResult);

  }

  //return result of MCI operation

  return dwResult;

  }

  DWORD CWave::CloseDevice()

  {

  DWORD dwResult=0;

  //close if currently open

  if(m_nDeviceID)

  {

  //close the MCI device

  dwResult=mciSendCommand(m_nDeviceID,MCI_CLOSE,NULL,NULL);

  //display error message if failed

  if(dwResult)

  DisplayErrorMsg(dwResult);

  //set identifier to close state

  else

  m_nDeviceID=0;

  }

  //return result of MCI operation

  return dwResult;

  }

  DWORD CWave::Play(CWnd* pWnd,LPCSTR pFileName)

  {

  MCI_OPEN_PARMS mciOpenParms;

  //initialize structure

  memset(&mciOpenParms,0,sizeof(MCI_OPEN_PARMS));

  //set the WAV file name to be played

  mciOpenParms.lpstrElementName=pFileName;

  //first open the device

  DWORD dwResult=mciSendCommand(m_nDeviceID,MCI_OPEN,

  MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);

  //display error message if failed

  if(dwResult)

  DisplayErrorMsg(dwResult);

  //if successful,instruct the device to play the WAV file

  else

  {

  //save element indentifier

  m_nElementID=mciOpenParms.wDeviceID;

  MCI_PLAY_PARMS mciPlayParms;

  //set the window that will receive notification message

  mciPlayParms.dwCallback=(DWORD)pWnd->m_hWnd;

  //instruct device to play file

  dwResult=mciSendCommand(m_nElementID,MCI_PLAY,

  MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);

  //display error and close element if failed

  if(dwResult)

  {

  DisplayErrorMsg(dwResult);

  Stop();

  }

  }

  //return result of MCI operation

  return dwResult;

  }

  DWORD CWave::Stop()

  {

  DWORD dwResult=0;

  //close if element is currently open

  if(m_nElementID)

  {

  dwResult=mciSendCommand(m_nElementID,MCI_CLOSE,NULL,NULL);

  //display error message if failed

  if(dwResult)

  DisplayErrorMsg(dwResult);

  //set identifier to closed state

  else

  m_nElementID=0;

  }

  return dwResult;

  }

  void CWave::DisplayErrorMsg(DWORD dwError)

  {

  //check if there was an error

  if(dwError)

  {

  //character string that contains error message

  char szErrorMsg[MAXERRORLENGTH];

  //retrieve string associated error message

  if(!mciGetErrorString(dwError,szErrorMsg,sizeof(szErrorMsg)))

  strcpy(szErrorMsg,"Unknown Error");

  //display error string in message box

  AfxMessageBox(szErrorMsg);

  }

  }

 

上下文章:

 

上一篇文章: 为MFC应用程序添加全屏幕显示 下一篇文章: VC中利用钩子实现菜单阴影效果

相关文章:

  • 教你如何用零框架技术加密网页
  • PS教程:看看如何用Photoshop把照片演变成水墨画
  • Photoshop教程:教你如何创出发丝的炫彩莹亮效果
  • 新蠕虫伪装成文件夹图标,让你防不胜防
  • Vista找不到Config文件夹的解决办法

相关软件:

  • 文件管理精灵 V3.21
  • Coopen播放器(开屏桌面画报) 5.0 正式版
  • FTP远程文件同步更新程序 1.0.0.0
  • 系统文件备份工具 1.0a
  • BSPlayer Pro (万能播放器) V1.38.828 汉化绿色版
  • 冥王Flash播放器 V1.29 alpha

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • 深入编程:控制面板知多少?

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有