手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

游戏音乐和音效的播放

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
CMidi::Play()开始:

DWORD CMidi::Play(HWND hwnd,char* MidiFile)

{

// 开启Midi的硬体装置,我们使用一般内定值

mciOpenParms.lpstrDeviceType = "sequencer";

//这个叁数就是要播放的MIDI档案名称

mciOpenParms.lpstrElementName = MidiFile;

// 使用Message的方式来播放MIDI而不是STRING的方式

if (dwReturn = mciSendCommand(NULL, MCI_OPEN,

MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,

(DWORD)(LPVOID) &mciOpenParms)

return (dwReturn);

// The device opened successfully; get the device ID.

wDeviceID = mciOpenParms.wDeviceID;

// Check if the output port is the MIDI mapper.

mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;

if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,

MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))

{

mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

return (dwReturn);

}

// 为了达成重复播放的目的,必须让我们的程式能够接收到

// MM_MCINOTIFY的讯息,这个函示呼叫的方式,就是传递

// WM_PLAY讯息给装置,叫他开始播放。

mciPlayParms.dwCallback = (DWORD) hwnd;

if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,

(DWORD)(LPVOID) &mciPlayParms))

{

mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

return (dwReturn);

}

return (0L);

};

播放MIDI的方式有两种,第一种是利用字串命令硬体动作,第二种是传递讯息的方式,我们采用第二种,原因很清楚了,必须透过讯息的传递,我们才能得知音乐是否播放完毕了。

接下来我们看看Cmidi::Replay是怎麽一回事:

void CMidi::Replay()

{

mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);

mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);

}

真是不可思议地简单呀,函示里面只包含两条呼叫,第一条呼叫送讯息给装置,叫他把MIDI的播放指标移到最开头的部份,也就是MCI_SEEK_TO_START

作法就像移动档案指标相同。接着第二条指令光看也明白,就是叫他继续播放就是了,而且别忘了MCI_NOTIFY,当下次播放完毕,还是得用讯息通知我们的程式。

最後看一下Cmidi::Stop()的作法:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!