直接使用MCI函数进行CD音频编程还是比较麻烦的,对于编程者来说十分不方便。为了在应用程序中提高MCI对CD音频播放的安全性和应用程序的开发效率,我们设计并实现了一个封装所有对MCI接口函数调用的可重用类。
1. 可重用类CComDisc的设计
设计一个可重用类CComDisc 需要在类的数据成员中包含对一个CD音频操作状态的完整描述;类的成员函数需要包含所有CD音频会遇到的基本操作,尽量在应用程序中不要出现必须调用MCI接口函数的局面。综合以上考虑,我们设计的可重用类CComDisc的声明见程序清单7-49。
程序清单7-49 ComDisc.h文件
2. 可重用类CComDisc的实现
(1)类的构造函数和析构函数。
在类的构造函数中,我们需要为类的成员变量设置初始值,在类的析构函数中需要关闭对象正在进行的操作,把资源归还系统。构造函数和析构函数的实现见程序清单7-50。
程序清单7-50 构造函数和析构函数
(2)打开CD音频设备函数。
该函数先根据m_bOpen成员的值判断当前是否已经有打开的CD音频,如果有则提示用户不能同时打开两个CD音频。如果没有则打开一个CD音频,设置音频播放的格式为MCI_FORMAT_TMSF,并把m_bOpen成员的值置为TRUE。Open()函数的实现见程序清单7-51。
程序清单7-51 CComDisc::Open ()函数
(3)关闭CD音频函数。
该函数向设备发送MCI_CLOSE命令关闭CD音频后,需要把类的数据成员的值都置为NULL或FALSE。关闭CD音频函数的实现见程序清单7-52。
程序清单7-52 CComDisc::Close()函数
(4)播放CD音频函数。
播放CD音频之前,首先要保证CD音频已经打开,如果没有打开,则需要先打开一个CD音频。该函数如果调用成功,则返回0,否则返回错误码。播放CD音频函数的实现见程序清单7-53。
程序清单7-53 CComDisc::Play()函数
(5)停止CD播放函数。
通过向CD音品设备发送MCI_STOP消息,可停止CD音频的播放。停止播放后,把音频设备的当前位置设为播放的初始位置。函数调用成功后,m_bPlaying和m_bPause变量的值赋为FALSE,表示处于非播放音频状态。停止CD播放函数的实现见程序清单7-54。
程序清单7-54 CComDisc::Stop()函数
(6)暂停CD播放函数。
该函数用来暂停CD音频的播放。暂停CD音频播放函数的实现见程序清单7-55。
程序清单7-55 CComDisc::Pause()函数
(7)获得CD播放信息函数。
为了获得CD播放信息,需要通过对MCI_STATUS_PARMS结构体的dwitem进行赋值,dwItem的取值决定需要向设备查询何种信息。
dwItem取MCI_STATUS_NUMBER_OF_TRACKS表示需要获得CD的音轨数;MCI_STATUS_LENGTH表示需要得到CD音频的长度,如果此时还设定了dwTrack参数为指定音轨数,并在向设备发送MCI_STATUS命令时MCI_STATUS_ITEM标识的同时指定MCI_TRACK标识,将得到指定音轨的长度。dwItem取MCI_STATUS_POSITION表示获得CD音频的当前播放位置,该位置的返回值为32位的DWORD型,需要通过MCI_MSF_MINUTE宏获得分钟数,MCI_MSF_SECOND宏获得秒钟数,MCI_MSF_FRAME宏获得当前帧数。dwItem取MCI_STATUS_MODE表示需要获得CD音频设备的模式。
mciSendCommand函数指定了MCI_STATUS_ITEM标识后,MCI_STATUS_PARMS结构的成员dwReturn用来接收查询后得到的信息。下面是具体的几个查询函数源代码。(www.xing528.com)
获得轨迹数函数的实现见程序清单7-56。
程序清单7-56 CComDisc::GetTracks()函数
获得CD总长度函数的实现见程序清单7-57。
程序清单7-57 CComDisc::GetAudioLength()函数
获得指定音轨长度函数的实现见程序清单7-58。
程序清单7-58 CComDisc::GetTrackLength()函数
获得当前音轨号函数的实现见程序清单7-59。
程序清单7-59 CComDisc::GetTrack()函数
获得播放秒钟数函数的实现见程序清单7-60。
程序清单7-60 CComDisc::GetSeconds()函数
询问当前设备是否准备好函数和是否为CDAudio函数的实现见程序清单7-61。
程序清单7-61 CComDisc::IsDriveReady()和IsAudioTrack()函数
(8)跳转播放CD音频函数。
MCI的MCI_SEEK命令可以把当前的播放位置设置在MCI_SEEK_PARMS结构对应的dwTo数据的位置。dwTo是32位的DWORD值,通常我们采用轨道、分、秒、帧数来记录CD音频的播放位置。所以需要通过MCI_MAKE_TMSF宏来实现。需要注意的是,在跳转前我们需要先向设备发送MCI_PAUSE命令暂停CD音频的播放。跳转后,调用类的成员函数Play()播放CD音频。跳转播放CD音频函数的实现见程序清单7-62。
程序清单7-62 CComDisc::SeekTo()函数
(9)前进和后退函数。
前进和后退函数同样需要用到MCI_SEEK命令使CD音频的当前位置为原位置前移或后移某个固定位置,然后再调用Play()函数播放CD音频。考虑到快进快退需要的精度不是很高,我们把快进快退的进退单位设为秒而不是最小单位帧。
往前跳转函数的实现见程序清单7-63。
程序清单7-63 CComDisc::Forward()函数
往后跳转函数的实现见程序清单7-64。
程序清单7-64 CComDisc::Backward()函数
(10)弹出或关闭光驱函数。
该函数是CD音频操作的辅助部分,实现对光驱打开关闭操作。使用MCI_SET_DOOR_OPEN 或 MCI_SET_DOOR_CLOSE表示向设备发送MCI_SET命令就可以实现光驱相应打开或关闭的操作。如果参数nFlag = 1表示打开,参数nFlag = -1表示关闭。
弹出或关闭光驱函数的实现见程序清单7-65。
程序清单7-65 CComDisc::OpenCDDoor()函数
通过以上步骤,我们完成了CD音频播放器的可重用类CComDisc的设计与实现,该类是使用MCI播放CD音频的集成,有了该类就可以不使用MCI命令而达到实现控制CD音频的目的,简单地播放CD的操作如下所示:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。