這幾天一直在用MOTO SDK來開發一款用於Moto E680i的Java游戲,利用BLOG發表一些心得:
MOTO系列手機中Java程序播放一個聲音文件比較簡單,但是用於交互式音效時就有問題了。
根據MOTO的一些資料顯示,在MOTO手機中播放聲音有下面幾條約束:
1、除了同時播放一個MIDI和一個WAV以外,MOTO手機無法同時播放多個聲音,而且必須是先播放MIDI然後播放WAV;
2、除了MIDI或音階序列以外,不能同時實現player的多個實例進入prefetched狀態(預讀取聲音流);
3、播放新的聲音之前,前一個player必須停止並釋放資源(stop();deallocate())。
如果你遇到以下問題,可以試試我的解決方法:
1)只能播一次,或幾次,接著就無法發出聲音;
2)播放新的聲音時,總是會多播放一次前一個聲音;
3)或者其他奇怪的問題。
我的代碼:
//引用以下
import Javax.microedition.media.Player;
import Javax.microedition.media.PlayerListener;
//定義多個聲效及聲音文件的類型
private String[] arrSoundFile = {"start.mid","right.wav","wrong.wav","help.wav","end.wav"};
private String[] arrSoundType = {"audio/x-midi","audio/x-wav","audio/x-wav","audio/x-wav","audio/x-wav"};
//定義播放器實例
public Player player;
//定義一個變量,控制是否發聲
public boolean isSoundOpen = false;
//播放聲音主過程,參數為前面定義的聲音數組的索引號
public void playMedia(int iKey) throws Exception {
// 創建實例
player = Manager.createPlayer(
getClass().getResourceAsStream("/midi/"+arrSoundFile[iKey]), arrSoundType[iKey]);
// 綁定狀態更新事件過程
player.addPlayerListener(this);
//播放聲音
player.setLoopCount(1);
player.prefetch(); // prefetch
player.realize(); // realize
player.start(); // and start
}
// 播放器狀態更新事件過程
public void playerUpdate(Player player, String event, Object eventData) {
//調試 跟蹤過程
// System.err.println("event:" + event);
//如果播放結束,就釋放和關閉播放器實例
if (event.equals("endOfMedia")) {
player.deallocate();
player.close();
}
}
//播放聲音調用過程
public void playSound(int iKey) {
if(isSoundOpen)
{
try {
playMedia(iKey);
} catch (Exception e) {
System.err.println("Unable to play: " + e);
e.printStackTrace();
}
}
}
/*
歡迎轉載,請保留以下版權說明
========================
風雨雷電堂在學J2ME
========================
不保留以上版權說,說明你很差
*/
大家可以在MOTO的機子上測試。