首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

解決 Motorola E680i 音效播放問題:多音效管理實作

     編輯:J2ME

問題背景

使用 Motorola SDK 開發 E680i Java 遊戲時,單一聲音播放簡單,但互動音效常出現:只能播幾次就靜音、播放新音效時重複播上一個、其他詭異行為。

Motorola 手機音效播放限制

  1. 除同時播放一個 MIDI + 一個 WAV 外,無法同時播放多音效,且須先播 MIDI 再播 WAV。
  2. 除 MIDI 或音階序列外,無法讓多個 Player 同時進入 prefetched 狀態(預讀音訊流)。
  3. 播放新聲音前,前一個 Player 必須 stop() 並 deallocate() 釋放資源。

解決方案:單一 Player 實例循環復用 + 事件驅動釋放

核心策略:全程僅保持一個 Player 實例,播放結束時透過 PlayerListener 自動釋放關閉,下一次播放重新 createPlayer。

完整程式碼實作

import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import javax.microedition.media.Manager;

// 定義音效檔案與 MIME 類型
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"};

// 單一 Player 實例
public Player player;

// 音效開關控制
public boolean isSoundOpen = false;

// 主播放流程
public void playMedia(int iKey) throws Exception {
    // 1. 建立新實例(每次播放重新創建,避免狀態殘留)
    player = Manager.createPlayer(
        getClass().getResourceAsStream("/midi/" + arrSoundFile[iKey]), 
        arrSoundType[iKey]
    );

    // 2. 綁定狀態監聽
    player.addPlayerListener(this);

    // 3. 設定播放參數並啟動
    player.setLoopCount(1);
    player.prefetch();  // 預讀
    player.realize();   // 實現
    player.start();     // 開始播放
}

// PlayerListener 介面實作:播放結束自動釋放
public void playerUpdate(Player player, String event, Object eventData) {
    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();
        }
    }
}

關鍵設計點解析

  • 每次播放重新 createPlayer:避免舊實例狀態導致無法播放或重複播放。
  • prefetch → realize → start 標準流程:確保音訊資料就緒再播放。
  • endOfMedia 事件釋放資源:滿足 Motorola 「必須釋放前一個 Player」的硬性限制。
  • 單執行緒串列播放:隱含符合「同一時間只能有一個非 MIDI Player 運作」的限制。

測試建議

請在真實 Motorola 機型(E680i 或同平台機種)上測試。模擬器行為可能與真機不同,真機驗證不可省略。

原作者註記:歡迎轉載請保留版權說明。風雨雷電堂在學 J2ME。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved