Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > работа со звуками в J2me


Автор: voltaren 12.1.2008, 05:55
Возникла следующая проблема, в игре вообщем то всего 3 звука, они загружаются до начала игры, и потом проигрываются использую метод start()
но к сожалению...это все очень подтормаживает, вернее когда мы вызываем в потоке игрового цикла проигрывание звуков, то игра замирает на некоторое время( то есть игровые объекты перестают двигаться) а потом все отмирает звук проигрывается и все работает как работало и так каждый раз, подскажите как решить проблему можно?
Формат звуков используется wav, и телефон на котором тестируется nokia 5500d.
И еще хотелось бы узнать какие форматы наиболее желательно использовать для воспроизведения звуков, именно звуков а не мелодии, какие наиболее распространненые,
и вообще имеет ли смысл в j2me реализовывать звуковые эффекты в игре, ну так скажем в реалтайме, то есть когда время исполенения игры критично!
Заранее благодарен!

Автор: Dancer 14.1.2008, 15:14
лучше используй amr - самый правильный стандарт для мобильника smile (если конечно твоя мобилка его поддерживает), ну и как уже сам сказал, нефиг в игровом потоке пытаться ещё и звучок играть, ты это дело вынеси в отдельный поток, должно помочь. Удачи.

Автор: math64 29.2.2008, 12:51
А что писать вместо "audio/x-wav" при использовании amr?
Код

Manager.createPlayer (is, "audio/x-wav");

Автор: W0LF 29.2.2008, 13:07
У мну када-то на работе учили гуглом пользоваццо программистов =)
по логике должно быть так = Manager.createPlayer (is, "audio/x-amr");
теперь строку (Manager.createPlayer (is, "audio/x-amr");) наберем в гуле и проверим результат smile
ну, по идее так должно работать

Автор: eugine_s 29.2.2008, 14:07
voltaren, еще совет, кроме того, что звуки в другом потоке воспроизводить: создай звуки до начала игры и держи их в состоянии prefetch, а когда нужно проиграть какой-то звук, то уже вызывай start. Но учитывай, что в большинстве телефонов только один звук может проигрываться: т.е. перед тем как проиграть новый звук, нужно старый остановить (stop()).

Автор: rooman 19.11.2008, 21:57
Есть вопрос: При загрузке мидлета громкость мелодии должна постепенно нарастать(как и при включении звука, если выключен), есть функция:

Код

public void playMelody(String name){
    try{
      stopMelody();
      song=name;
      InputStream in=name.getClass().getResourceAsStream(name);
      player=Manager.createPlayer(in,"audio/midi");
      player.setLoopCount(-1);
      player.start();
      volumeControl=(VolumeControl)player.getControl("VolumeControl");
      volumeControl.setLevel(0);
      
    }catch(MediaException me){
      System.out.println("MediaException!!!!!!!");
    }catch(IOException ioe){
      System.out.println("IOException!!!!!!!");
    }
}


А наростает звук в цикле

Код

public void run() {
        
    int timeStep = 300;
    
    while (!game_is_play) {
      long start = System.currentTimeMillis();
            

      if(volumeControl!=null&&volume<100){
        volume+=5;
        volumeControl.setLevel(volume);
      }
             
      long end = System.currentTimeMillis();
      int duration = (int)(end - start);
      
      if (duration < timeStep) {
        try { Thread.sleep(timeStep - duration); }
        catch (InterruptedException ie) {}
      }
    }
 }


Только перед наростанием звук почему-то подпрыгивает(при каждом включении), в этом вся проблема. При выключении volume сбрасывается на 0.Буду рад любому совету.

Автор: Dummy 20.11.2008, 12:04
Цитата(rooman @  19.11.2008,  21:57 Найти цитируемый пост)
Только перед наростанием звук почему-то подпрыгивает(при каждом включении), в этом вся проблема. При выключении volume сбрасывается на 0.Буду рад любому совету. 

Думается мне, дело в том, что VolumeControl.setVolume() вызывается уже после Player.start(), в результате чего звучок изначально начинает проигрываться на некотором дефолтном ненулевом уровне. Попробуй поменять строчки 8-10 первого куска кода на примерно следующее (написано на коленке, так что надо проверять):

Код

player.prefetch();
final Object synch  = new Object();
PlayerListener plrListener = new MyPlayerListener(synch);
player.setListener(plrListener);

volumeControl=(VolumeControl)player.getControl("VolumeControl");
volumeControl.setLevel(0);

synchronized (synch) {
    synch.wait(500); // думается, здесь опасно ставить бесконечное ожидание, полагаясь на нотификацию VOLUME_CHANGED от платформы...
}

player.start();

...

class MyPlayerListener implements PlayerListener {
     private Object synch;

     public MyPlayerListener(Object synch) {
          this.synch = synch;
     }

     void playerUpdate(Player player, String event, Object eventData) {
            if (PlayerListener.VOLUME_CHANGED.equals(event)) {
                   synchronized (synch) {
                        synch.notify();
                   }
            }
     }
}

Автор: rooman 21.11.2008, 19:56
Спасибо ,но дело не только в этом было как выяснилось ,метод setLevel() с 0 в качестве аргумента не воспринимался.

Автор: RomkaRomka 4.12.2008, 10:17
Цитата(eugine_s @ 29.2.2008,  14:07)
...создай звуки до начала игры и держи их в состоянии prefetch, а когда нужно проиграть какой-то звук...

Помнится, у Нокий не мало устройств, которые позволяют держать в префетченом состоянии всего 1-2 плеера :(

С уважением, Роман.

Автор: eugine_s 4.12.2008, 10:57
Цитата(RomkaRomka @  4.12.2008,  10:17 Найти цитируемый пост)
Помнится, у Нокий не мало устройств, которые позволяют держать в префетченом состоянии всего 1-2 плеера


Если точнее, то Nokia S40. Для них достаточно держать плееры в released состоянии.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)