第12章多媒体应用程序的设计
1 第12章 多媒体应用程序的设计
121利用音频函数实现多媒体 程序设计 为了介绍多媒体程序的设计,我们 先介绍一个非常简单的例子,希望 读者能够通过这个简单的例子,了 解音频文件的播放方法
2 12.1 利用音频函数实现多媒体 程序设计 为了介绍多媒体程序的设计,我们 先介绍一个非常简单的例子,希望 读者能够通过这个简单的例子,了 解音频文件的播放方法
121.1一个简单的应用实例 【例121】设计一个简单的音频播放程序,程 序启动时,播放 windows系动启动时候的音乐 1创建工程文件 MCIStart;打开 Stdafx. h文件,在# ifndef AFX NO AFXCMN SUPPORT语句的上一行顶头加入 语句# include Project Settings ? x 2将 winmm. lib Settings For: win 32 Debug General I Debug I cIC++Link Resources |M B-EP MCIStart 与应用程序链三m Category: General Res 接起来 中-口 Resource Files Output file name: 自 ReadMe.txt Debug/Mcistart ex Objectlibrary module 3在 MCIStartDlg. cpp的 OnInitDialog0 Generate debug info Ignore all default libraries 函数中的 return TrUe之前加上代码:Lmmp 厂 Generate mapfile sndPlaySound("System Start", SND_ASYNC); Project pti /incremental: yes /pdb: Debug/MCIStart pdb"/debt achine: 386 /out: Debug/MciStart. exe / pdbtype 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);
1212几个常用的音频函数 (1) MessageBeep函数:用来播放系统提示音 (2) sndPlaySoundo函数:播放wav音频 (3) PlaySound函数:播放来自资源中的声音 功能包 PlaySound 含关系 sndPlaySoundo MessageBeepl
4 PlaySound() sndPlaySound() 12.1.2 几个常用的音频函数 (1) MessageBeep()函数:用来播放系统提示音 (2) sndPlaySound()函数:播放wav音频 (3) PlaySound()函数:播放来自资源中的声音 MessageBeep() 功能包 含关系
121.3用MCI控制波形声音的播放 MCIERROR mciSendCommand( MCIDEVICEID IDDevice,∥接收命令消息的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设备时可用 mciGetErrorString0检 测错误,该函数的原型如下 BOOL mciGetErrorString dWORD fdw Error,‖错误代码 LPTSTR IpszErrorText,指向错误内容字串的指针 UINT cch ErrorText错误内容的缓冲区容量
6 在调用MCI设备时可用mciGetErrorString()检 测错误,该函数的原型如下: BOOL mciGetErrorString( DWORD fdwError, //错误代码 LPTSTR lpszErrorText, //指向错误内容字串的指针 UINT cchErrorText //错误内容的缓冲区容量 )
例12-2】编写一个音频播放器程序,可以选 择音频文件,并控制其播放、暂停播放、暂 停后的继续播放以及停止播放的功能 MCIPlayer x 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加入到文件Stax.h中, 将多媒体函数库 winmm. lib通过 project菜单中的 setings命令来与程序链接起来 2在cMc| PlayerDIg类上增加 Protected类型的成员变量, 具体如下 BOOL m_ SIgn(作为判断正在播放的标识) BOOL m ASign(作为判所正在播放的标识) dWoRd dwError(用来储存错误代码)、 MC DEVICED m MC/Device/D(用来储存打开设备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(; l TODO: Add extra initialization here m_SIgn= FALSE;∥初始化正在播放标识 m_ ASign= FALSE;∥初始化正在暂停标识 m MC Device/D=0;∥初始化设备标识 return TRUE:
9 BOOL CMCIPlayerDlg::OnInitDialog() { CDialog::OnInitDialog(); … // TODO: Add extra initialization here m_PSign=FALSE; //初始化正在播放标识 m_ASign=FALSE; //初始化正在暂停标识 m_MCIDeviceID=0; //初始化设备标识 return TRUE; }
void CMCIPlayerDlg: OnOpen Button(∥打开一个文件 CString filename;∥定义 CString类 filename用来存角文件名 CString fileext;∥定义 CString类的hiet用来存文件扩展名 MCI_OPEN_PARMS mciOpenParms/足定义结构体变量用来存储打 开文件的信息和返回的设备标识信息 DWORD dwError;∥定义 erRor用来储存返回的错误标识 static char szFilter="波形音频文件Wa*WaMD序列mi*mi0 C Fi/ e D i a g dIg(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"; C F i l e D i a l o g dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); //通过打开按钮时显示的内容