2012-04-07 8 views
4

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

класс Sound

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 

За 1-й раз, playerExplosion state before start() - 200 (REALIZED).

Для 2-го, 3-го, 4-го, 5-го раз, игрока. Состояние взрывозащиты перед запуском() равно 300 (ПРЕДВАРИТЕЛЬНЫЙ).

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

ответ

0

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

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

Удалить

playerExplosion.setLoopCount(1); 

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

Благодарности

:)

2

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

playerExplosion.setLoopCount(1);