Не удается воспроизвести звук в J2ME

У меня проблема с перезапуском звука в J2ME. Я хочу создать проигрыватель в конструкторе, а затем вызвать playExplosion(), чтобы воспроизвести его, но он воспроизводится только один раз. Я использую Wireless Toolkit.

Класс звука

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

В первый раз состояние playerExplosion до start() равно 200 (РЕАЛИЗОВАН).

Во 2-й, 3-й, 4-й, 5-й раз состояние playerExplosion перед start() равно 300 (PREFETCH).

На данный момент мне нужно снова создать playerExplosion в методе playExplosion(), но на реальном устройстве это слишком медленно.


person Hung Vu    schedule 07.04.2012    source источник


Ответы (2)


Попробуйте после удаления

playerExplosion.setLoopCount(1);
person SIVAKUMAR.J    schedule 11.04.2012

Понимание того, что Player может быть ресурсоемким и трудоемким процессом, отсутствие создания playerExplosion означало бы повторный вызов playerExplosion.realize();, поэтому процесс занимает так много времени.

Когда ваш игрок находится в PREFETCHED State, вам нужно просто позвонить playerExplosion.start();, но он не платит снова, потому что существует общее ограничение на количество раз, когда он должен платить.

Удалять

  playerExplosion.setLoopCount(1); 

И вы сможете оплатить свой файл несколько раз

Спасибо

:)

person Baba    schedule 07.04.2012