如何在MIDP应用程序中播放声音
发布时间:2023-06-25 23:02

现在我们利用MIDP应用程序九游会ag播放音乐。但是,MIDP标准API不支持声音播放功能。机种不同,则声音播放方法也不同,所以每个厂商都会使用他们各自扩展的API。N800使用NEC扩展的API,所以能用MIDP应用程序播放声音。

■N800的音乐播放功能

N800只能播放SMF(format0)格式的音乐数据,最大文件尺寸为10Kbyte。SMF格式即StandardMIDIFile的缩略语,就是为了能实现互换性而设定的文件形式,互换性是指在不同的应用程序中也具有能处理数据的特性。SMF分为format0和format1两种格式。N800所采用的是format0格式。这两种格式具有以下不同特点。(表1)

360截图20120507112828392.jpg

表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)

360截图20120507112928693.jpg

表2

■音频事件

音频演奏过程中,演奏开始时、停止时、结束时都会发生音频事件,能定义此时的处理。要定义音频事件发生时的处理,有必要安装AudioListener接口和记述audioAction方法内的处理。

然后,使用AudioClip对象的addAudioListener方法进入AudioListener。

publiCClassAudioTestimplementsAudioListener{

/**

*构造函数

**/

publicAudioTest(){

AudioClipaudio=Media.getAudioClip("/test.mid");//读取音乐数据

audio.addAudioListener(this);//注册audio事务监听器

}

/**

*音频事件的处理

**/

publicvoidaudioAction(AudioClipsound,intevent,intparam){

//记述处理

}

}

ex.1

记述处理的audioAction方法的自变量如下所示。

360截图20120507113031936.jpg

表3

此外,事件的种类(audioAction方法的自变量、事件)在AudioListener接口文件夹中定义如下。(表4)

360截图20120507113207575.jpg

表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();

}

}