針對不同平台音效 API 差異,提供三套完整實作:Nokia 專有 Sound API、MIDP 2.0 MMAPI (Player)、MID 檔案播放。
import com.nokia.mid.sound.*;
Sound soundPlayer;
byte[] dataKill = {0x02,0x4a,0x3a,0x40,0x04,0x00,0x0b,0x28,0x83,0x28,0x28,0xd2,0x28,0x00};
void playSound() {
if (soundPlayer != null) { soundPlayer.stop(); soundPlayer = null; }
soundPlayer = new Sound(dataKill, Sound.FORMAT_TONE);
soundPlayer.setGain(255); // 音量
soundPlayer.play(1); // 播放一次
}
資料來源:MIDI → Nokia Audio Converter 轉換為 byte 陣列。
WTK 整合:從 Nokia SDK class.zip 提取 com.nokia.mid.sound.Sound 打包進專案,發布時從 JAR 移除並修正 JAD 大小。
import javax.microedition.media.*;
Player player;
void playSound(String source) { // source: "kill.mid"
if (player != null) { player.close(); player = null; }
player = Manager.createPlayer(getClass().getResourceAsStream("/"+source), "audio/midi");
player.addPlayerListener(this);
player.setLoopCount(1);
player.realize();
player.start();
}
public void playerUpdate(Player p, String event, Object data) {
Display.getDisplay(midlet).callSerially(() -> updateEvent(p, event, data));
}
private void updateEvent(Player p, String event, Object data) {
if (event == PlayerListener.END_OF_MEDIA) p.close();
else if (event == PlayerListener.CLOSED) player = null;
}
切換應用處理:pauseApp() 中呼叫 stopTone() 停止播放。
Player player;
void initSound() {
player = Manager.createPlayer(getStream("/sound/b_main.mid"), "audio/midi");
player.realize();
player.setLoopCount(100000); // 循環播放背景音樂
}
// 控制同 Nokia 7610,使用 PlayerListener
定義 EMSound 類別封裝資料與型別,實作 SoundListener 監控播放狀態,支援多音效快取、切換、停止、啟用/禁用控制。