平台差異導致的適配挑戰
同一遊戲移植至不同機型,聲音 API 差異巨大:S40 專有 `com.nokia.mid.sound.Sound`、Nokia 40/60 支持 OTT 格式與 `SoundListener`、V300/MIDP 2.0 使用標準 `javax.microedition.media.Player` (MMAPI)。需針對各平台編寫差異化代碼。
三大平台實現模式
1. S40 專有 API
import com.nokia.mid.sound.Sound;
Sound soundPlayer;
void initSound() { soundPlayer = new Sound(b_main, 1); }
void toggleSound() {
m_playSound = 1 - m_playSound;
if (m_playSound == 1) soundPlayer.play(1);
else soundPlayer.stop();
}
2. Nokia 40/60 (OTT 格式 + SoundListener)
- 定義 `EMSound` 封裝 `byte[] data` + `int type` (如 `Sound.FORMAT_TONE`)。
- 實現 `SoundListener` 監聽 `SOUND_STOPPED`/`SOUND_PLAYING` 狀態。
- 資源載入:讀取 `.ott` 文件流 → `new Sound(data, type)`。
- 播放控制:單音/多音隊列管理,釋放/重用 `Sound` 實例,避免內存抖動。
3. V300 / MMAPI 通用方案 (MIDI)
- `EMSound` 改為 `String type` (如 `"audio/midi"`) + `byte[] data`。
- 使用 `Manager.createPlayer(InputStream, type)` 創建 `Player`。
- 註冊 `PlayerListener` 處理 `STARTED`/`STOPPED` 事件。
- 播放前 `realize()`、`setLoopCount()`;播放 `start()`,停止 `close()`。
工程化建議
- 抽象統一接口 `SoundManager`,內部策略模式隔離平台差異。
- 資源預載入與釋放機制,防止運行時卡頓。
- 真機測試為準,模擬器聲音表現差異極大。