4

J2ME でリスタート サウンドに問題があります。コンストラクターでプレーヤーを作成し、playExplosion() を呼び出して再生したいのですが、再生は 1 回だけです。ワイヤレス ツールキットを使用しています。

サウンドクラス

public class Sound () {

    private Player playerExplosion;

    public Sound() throws IOException, MediaException {
        // Explosion
        InputStream is = getClass().getResourceAsStream("/explosion.mid");
        playerExplosion = Manager.createPlayer(is, "audio/midi");
        playerExplosion.realize();
        playerExplosion.setLoopCount(1);
    }

    public void playExplosion() {
        try {
            System.out.println(playerExplosion.getState());
            playerExplosion.start();
        } catch (MediaException ex) {
            ex.printStackTrace();
        }
    }
}

MyMIDlet クラス

public class MyMIDlet extends MIDlet() {

    public Sound sound;

    public MyMIDlet() {
        // Init sound object
        try {
            sound = new Sound(this);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        // Test
        System.out.println("Start");

        for (int i = 0; i < 5; i++) {
            sound.playExplosion();

            // My sound is less than 1 second.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }

        System.out.println("End");
    }
}

出力

Start
200
300
300
300
300
End

初めて、start() 前の playerExplosion 状態は 200 (REALIZED) です。

2 回目、3 回目、4 回目、5 回目では、start() の前の playerExplosion 状態は 300 (PREFETCH) です。

現時点では、playExplosion() メソッドで playerExplosion を再度作成する必要がありますが、実際のデバイスでは遅すぎます。

4

2 に答える 2

2

削除してから試す

playerExplosion.setLoopCount(1);
于 2012-04-11T14:35:26.660 に答える
0

プレイヤーがリソースになる可能性があり、作成するのに時間がかかるプロセスを実現することは、再度playerExplosion呼び出すことを意味するため、プロセスに非常に時間がかかりますplayerExplosion.realize();

プレーヤーがPREFETCHED Stateいる場合、コールするだけで済みますplayerExplosion.start();が、支払うべき回数には一般的な制限があるため、再度支払う必要はありません。

削除する

  playerExplosion.setLoopCount(1); 

そして、ファイルを数回支払うことができます

ありがとう

:)

于 2012-04-07T22:57:48.903 に答える