Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 510|回复: 0

Android 游戏音乐播放 - Android学习

[复制链接]

该用户从未签到

发表于 2011-10-26 19:03:22 | 显示全部楼层 |阅读模式
java代码:
class CMidi

{

public:

DWORD Play(HWND,char* FileName);

void Replay();

void Stop();

private:

UINT wDeviceID;//MCI装置代号

DWORD dwReturn;

MCI_OPEN_PARMS mciOpenParms;

MCI_PLAY_PARMS mciPlayParms;

MCI_STATUS_PARMS mciStatusParms;

MCI_SEQ_SET_PARMS mciSeqSetParms;

};
复制代码
       将他包装成一个类别来使用也可以,而介面的部份需要单纯化,从直觉上来说,第一个动作就是播放(Play),接着是重播(Replay),最後当然是善後的工作了(Stop),不多不少,刚好三个,当然你会想到,是不是需要一个暂停的介面,没问题,这不是什麽难事,花额外的三分钟应该可以胜任愉快。

       了解类别大致上的长相以後,让我们来看看实作的部份是怎麽一回事,先从CMidi:

java代码:
DWORD CMidi:



lay(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是怎麽一回事:

java代码:
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()的作法:

java代码: void CMidi Stop()

{

mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 20:05 , Processed in 0.365465 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表