第12章多媒体应用程序的设计
1 第12章 多媒体应用程序的设计
121利用音频函数实现多媒体 程序设计 为了介绍多媒体程序的设计,我们 先介绍一个非常简单的例子,希望 读者能够通过这个简单的例子,了 解音频文件的播放方法
2 12.1 利用音频函数实现多媒体 程序设计 为了介绍多媒体程序的设计,我们 先介绍一个非常简单的例子,希望 读者能够通过这个简单的例子,了 解音频文件的播放方法
121.1一个简单的应用实例 【例121】设计一个简单的音频播放程序,程 序启动时,播放 windows系动启动时候的音乐 1创建工程文件Mc| Start;打开 Stdafx. h文件,在# indef AFX NO AFXCMN SUPPORT语句的上一行顶头加入 语句# include ProjectSettings ?|x 2将 winmm. ib Settings For: Win 32 Debug- General I Debug CIC++ [ Link Resources IM LD 「 MCIStar 与应用程序链 中-口 Source files Category:General Reset 中-口 Header Files 接起来 a Resource File Output file name 自 ReadMe. txt Debug/McCIStart ex Object/library modules: winmm.lib 3在 MCIStartDlg. cpp的 OnInitDialog0me 函数中的 return True之前加上代码:Lmm crementally 厂 Generate mapfile sndPlay Sound( System Start", SND_ASYNC); Project Options inmm lib /nologo /subsystem: windows incremental: yes /pdb: Debug/MCIStart pdb"/debug achine: 1386 /out. Debug/McIStart exe"/pdbtype: sept OK Cancel
3 12.1.1 一个简单的应用实例 【例12-1】设计一个简单的音频播放程序,程 序启动时,播放windows系动启动时候的音乐 1.创建工程文件MCIStart;打开Stdafx.h文件,在#ifndef _AFX_NO_AFXCMN_SUPPORT语句的上一行顶头加入 语句#include 2.将winmm.lib 与应用程序链 接起来 3.在MCIStartDlg.cpp的OnInitDialog() 函数中的return TRUE之前加上代码: sndPlaySound("SystemStart",SND_ASYNC);
121.2几个常用的音频函数 (1) Message Beep函数:用来播放系统提示音 (2) sndPlaysounde0函数:播放wav音频 (3) PlaySound函数:播放来自资源中的声音 功能包 PlaySound 含关系 endPlay Sound MessageBeep
4 PlaySound() sndPlaySound() 12.1.2 几个常用的音频函数 (1) MessageBeep()函数:用来播放系统提示音 (2) sndPlaySound()函数:播放wav音频 (3) PlaySound()函数:播放来自资源中的声音 MessageBeep() 功能包 含关系
1213用MCI控制波形声音的播放 MCIERROR mciSendCommand MCIDEVICEID DDevice,∥接收命令消息的MC设备D UINT uMsg ∥发送的命令消息 DWoRD fdw Command,命令消息的标志集 DWORD PT dwParam)消息参数的结构体地址 常用的MC设备消息见教材表125
5 12.1.3 用MCI控制波形声音的播放 MCIERROR mciSendCommand( MCIDEVICEID IDDevice, //接收命令消息的MCI设备ID UINT uMsg, //发送的命令消息 DWORD fdwCommand, //命令消息的标志集 DWORD_PTR dwParam) //消息参数的结构体地址 常用的MCI设备消息见教材表12-5
在调用MC设备时可用 mciGetErrorString(检 测错误,该函数的原型如下: BOOL mciGetErrorString( DWoRD fdw erro,川错误代码 LPTSTRIpSzErrorText,∥指向错误内容字串的指针 UINT cch ErrorText∥错误内容的缓冲区容量
6 在调用MCI设备时可用mciGetErrorString()检 测错误,该函数的原型如下: BOOL mciGetErrorString( DWORD fdwError, //错误代码 LPTSTR lpszErrorText, //指向错误内容字串的指针 UINT cchErrorText //错误内容的缓冲区容量 )
例12-2】编写一个音频播放器程序,可以选 择音频文件,并控制其播放、暂停播放、暂 停后的继续播放以及停止播放的功能 f iplAyer IDC OPEN BUTTON DC CLOSE BUTTON 打开文件 关闭文件 IDC_ START_BUTTON IDC_PAUSE_BUTTON IDC STOP BUTTON 播放 暂停/继续 停止 IDC EXIT BUTTON 退出
7 【例12-2】编写一个音频播放器程序,可以选 择音频文件,并控制其播放、暂停播放、暂 停后的继续播放以及停止播放的功能 IDC_OPEN_BUTTON IDC_CLOSE_BUTTON IDC_START_BUTTON IDC_PAUSE_BUTTON IDC_STOP_BUTTON IDC_EXIT_BUTTON
1将头文件 mmsystem. h加入到文件 Stdafx h中, 将多媒体函数库wnmm通过 project菜单中的 setings命令来与程序链接起来 2在cMc| PlayerDlg类上增加 Protecte类型的成员变量, 具体如下: BOOL m_ Sign(作为判断正在播放的标识) BOOL m Asign(作为判断正在播放的标识) DWORD dwError(用来储存错误代码) MCIDEVICEID m MC/DeviceD(用来储存打开设备的D值) charszErrorBufMAXERRORLENGTH)(用来信存出错内容)
8 1. 将头文件mmsystem.h加入到文件Stdafx.h中, 将多媒体函数库winmm.lib通过project菜单中的 seetings命令来与程序链接起来 2.在CMCIPlayerDlg类上增加Protected类型的成员变量, 具体如下: BOOL m_PSign(作为判断正在播放的标识) BOOL m_ASign(作为判断正在播放的标识)、 DWORD dwError(用来储存错误代码)、 MCIDEVICEID m_MCIDeviceID(用来储存打开设备的ID值) charszErrorBuf[MAXERRORLENGTH](用来储存出错内容)
BOOL CMCIPlayerDlg: OnInitDialogo t CDialog: OnInitDialog 0 II TODO: Add extra initialization here m_SIgn= FALSE;∥初始化正在播放标识 m_ ASign= FALSE;∥初始化正在暂停标识 m MC DeviceD=0;∥初始化设备标识 eturn TrUe
9 BOOL CMCIPlayerDlg::OnInitDialog() { CDialog::OnInitDialog(); … // TODO: Add extra initialization here m_PSign=FALSE; //初始化正在播放标识 m_ASign=FALSE; //初始化正在暂停标识 m_MCIDeviceID=0; //初始化设备标识 return TRUE; }
void cMc| PlayerDIg: OnOpen Button0打开一个文件 CString filename;∥定义 CString类的 ilename用来存文件名 CString fileext;∥定义 CString类的 iileext用来存文件力展名 MCI_OPEN_PARMS mciOpenParms;/义结构体变量用来存储打 开文件的信息和返回的设备标识信息 DWORd dwError;∥定义 dwErro用来储存返回的错误标识 static char szFilterl="波形音频文件Wa训 wavED序列mo*md0 CFileDialog dg(TRUE, NULL, NULL, OFN_HIDEREADONLYOFN_OVERWRITEPROMPTszFilter) ∥过打开按纽的显示的内容
10 void CMCIPlayerDlg::OnOpenButton() //打开一个文件 { CString filename; //定义CString类的filename用来存储文件名 CString fileext; //定义CString类的fileext用来存储文件扩展名 MCI_OPEN_PARMS mciOpenParms;//定义结构体变量用来存储打 开文件的信息和返回的设备标识信息 DWORD dwError; //定义dwError用来储存返回的错误标识 static char szFilter[]="波形音频文件(*.wav)|*.wav|MIDI序列(*.mid)|*.mid\0"; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); //通过打开按钮时显示的内容