在MIDP应用程序中播放声音
■前言
在上一讲中我们讲述的是如何制作JAVA手机多媒体功能中的动画,本讲中我们将介绍如何制作JAVA手机的另一个多媒体功能——声音,即N800的音乐播放功能。若是在动画上再配以音乐播放功能,就能制作出具有丰富表现力的应用程序了。
■音乐播放
现在我们利用MIDP应用程序播放音乐。但是,MIDP标准API不支持声音播放功能。机种不同,则声音播放方法也不同,所以每个厂商都会使用他们各自扩展的API。N800使用NEC扩展的API,所以能用MIDP应用程序播放声音。
■N800的音乐播放功能
N800只能播放SMF(format0)格式的音乐数据,最大文件尺寸为10Kbyte。SMF格式即StandardMIDIFile的缩略语,就是为了能实现互换性而设定的文件形式,互换性是指在不同的应用程序中也具有能处理数据的特性。SMF分为format0和format1两种格式。N800所采用的是format0格式。这两种格式具有以下不同特点。(表1)
表1
■播放音乐
接下来我们实际操作读取文件播放音乐的功能。
●音乐数据的读取
利用扩展API上的Media类的static方法读取音乐数据。自变量中记述了音乐数据文件的通过。AudioClipaudio=Media.getAudioClip(“/test.mid”);
另外,能够从web上获得音乐数,并且能够从RMS中得到音乐数据。但,由于形式相同,这里就不特别讲述了。详细情况请参考扩展API文档。
●播放
播放读取的音乐数据。使用AudioClip例子(在这称为audio)play方法播放。
audio.play();
而且也能同时播放两个以上的音乐数据。此时,使用AudioClip例子(在这称为audio1、audio2)play方法播放。
audio1.play();
audio2.play();
上述情况下能够同时播放audio1,audio2。
●停止
能够暂停音乐的播放。使用AudioClip例子的stop方法能够停止。
audio.stop();
●其他功能
AudioClip定义了读取其他音乐数据信息的方法和决定反复播放次数的方法。(表2)
表2
■音频事件
音频演奏过程中,演奏开始时、停止时、结束时都会发生音频事件,能定义此时的处理。要定义音频事件发生时的处理,有必要安装AudioListener接口和记述audioAction方法内的处理。
然后,使用AudioClip对象的addAudioListener方法进入AudioListener。
publicclassAudioTestimplementsAudioListener{
/**
*构造函数
**/
publicAudioTest(){
AudioClipaudio=Media.getAudioClip(/test.mid);//读取音乐数据
audio.addAudioListener(this);//注册audio事务监听器
}
/**
*音频事件的处理
**/
publicvoidaudioAction(AudioClipsound,intevent,intparam){
//记述处理
•
•
}
}
ex.1
记述处理的audioAction方法的自变量如下所示。
表3
此外,事件的种类(audioAction方法的自变量、事件)在AudioListener接口文件夹中定义如下。(表4)
表4
以下展示的是只播放音频数据的简单范例。
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*音乐播放的简单范例
*/
publicclassAudioextendsMIDlet{
Displaydisplay;
AudioCanvascanvas;
/**
*构造函数
*/
publicAudio(){
canvas=newAudioCanvas();
display=Display.getDisplay(this);
}
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(canvas);
}
protectedvoidpauseApp(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
}
importjavax.microedition.lcdui.*;
importcom.nec.media.*;
/**
*音频canvas
**/
publicclassAudioCanvas
extendsCanvas
implementsRunnable,CommandListener,AudioListener{
CommandSTART=newCommand(play,Command.OK,0);
CommandSTOP=newCommand(stop,Command.OK,0);
AudioClipa;//音乐数据
Threadth;
/**
*构造函数
**/
publicAudioCanvas(){
a=Media.getAudioClip(/_test.mid);//读取音乐数据
a.addAudioListener(this);//注册AudioListener
this.addCommand(START);
this.addCommand(STOP);
this.setCommandListener(this);
th=newThread(this);
th.start();
}
/**
*音频事件的处理
*/
publicvoidaudioAction(AudioClipsound,intevent,intparam){
if(sound==a){
if(event==AudioListener.AUDIO_COMPLETE){
sound.play();
}
}
}
/**
*描绘处理
*/
protectedvoidpaint(Graphicsg){
g.setColor(255,255,255);
g.fillRect(0,0,getHeight(),getWidth());
g.setColor(0,0,0);
g.drawString(MusicPlay?,50,52,Graphics.TOP|Graphics.LEFT);
g.drawString(
channel=+a.getChannel(),
30,
64,
Graphics.TOP|Graphics.LEFT);
g.drawStrin
- 采用DSP的声音采集系统硬件原理及设计(04-28)
- MPEG声音编码的单片DSP实现(01-10)
- MPEG声音编码系统的单片DSP实现(03-05)
- 基于DSP的声音采集系统硬件设计方案(05-04)
- 基于DSP的车辆碰撞声检测装置的设计 (08-29)
- 指纹/人脸/虹膜/心率/声音识别各有啥特点?(06-03)