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


Автор: 604 21.11.2006, 21:28
Привет!
Возникла такая проблема!
Требуется по наступлению некого события проиграть миди... но проблема в том что в след. раз это событие может наступить быстрее чем отыграет музыка...
Попробывал setMediaTime(0) что бы просто с начало игралось.. на стандартном эмуле работает.. на эмуле BS S68 звука нет эксепшенов нет... а телефон выкидывает эксепшен Error setting media time smile
Попробовал другой вариант, создать 2 плеера и в зависимости от того какой занят игрой запускать второй, и наоборот. В стандартном эмуле работает на эмуле S68 нет, на телефоне почему то 1 плеер залипает в состоянии СТАРТЕД :-(

Хе хе.. getDuration() возвращает -1... теперь понятно почему setMediaTime не работает :-(

Автор: Dancer 22.11.2006, 11:43
ориентируйся на то, что два плеера у тебя многие девайсы поддерживать не будут (можно сказать почити все), я имею ввиду из мидлета. Поэтому создай класс, который у тебя будет мониторить твой текущий плеер. И если тебе критично проигрывать что-то в тот момент как это пришло, то либо останавливаешь, то что у тебя в данный момент играет, то есть делаешь остановку плеера и проигрование нужно файлика запускаешь. Или же делаешь очередь из того, что нужно проигрывать. И помере проигрывания кусочков (файликов), ты очищаешь совю очередь до полного её изничтожения smile 

Автор: 604 22.11.2006, 13:28
Dancer
Вот блин.. а что же делать с тормозами вo время остановки и запуска миди?
Такой код приводит к жутким фризам даже на стандартном эмуляторе:
player.stop();
player.start();
а если еще учесть что надо будет подгрузить новый звук... будет еще хуже :-(

Автор: Dancer 22.11.2006, 13:36
во первых огранизовать в отдельно потоке работу с плеером, плюс я делал (правда не с мидюшками), вектор, в котором у меня уже были готовые объекты типа плеер, и я их просто брал из вектора и проигрывал. Ты скорее всего каждый раз откуда то пытаешься подгружать свои сэмплы (с тЫрнета или из JAR, а может быть и из файловой системы телефона) для проигрывания, попробуй это как то минимизировать.
Ну или опиши, что ты пытаешься делать немного более развёрнуто, и что ты этим хочешь получить.

Автор: 604 22.11.2006, 14:17
Вот мой класс
Код

import javax.microedition.lcdui.*;
import javax.microedition.media.*;

public final class Sound
{
  public static final byte EAT = 0;
  public static final byte DEATH = 1;
  public static final byte SCARY = 2;

  private static Player[] pl = new Player[3];

  public Sound()
  {
    try
    {
      for (int i = 0; i < pl.length; i++)
      {
        pl[i] = Manager.createPlayer(getClass().getResourceAsStream(
            "res/tone_" + (i + 1) + ".mid"), "audio/midi");
        pl[i].realize();
        pl[i].prefetch();
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public void play(byte b)
  {
    try
    {
      switch(b)
      {
        case 0:
            //Thread.sleep(100);
            pl[0].start();
          break;
        case 1:
          //pl[1].prefetch();
          pl[1].start();
          break;
        case 2:
          //pl[2].prefetch();
          pl[2].start();
          break;
      }
    }
    catch (Exception e)
    {
      Midlet.display.setCurrent(new Alert(e.toString(),e.toString(),null,AlertType.WARNING), new ScreenAbout());
      e.printStackTrace();
    }
  }

  public void close()
  {
    for (int i = 0; i < pl.length; i++)
      pl[i].close();
  }
}

На стандартном эмуляторе все отлично, на эмеле BenqSiemens S68 вобще ничего не слышно, изредко доносится какой то скрежет. На железе ситуация следующая:
если сработала ситуация из case 1. а потом сразу же из 2(при этом свук 1 еще должен играть) звук1 пропадает и начинает играть звук 2. А потом все становится еще хуже... плеер 1 непредсказуемо залипает в состоянии STARTED и соответственно дальнейшие его запуски игнорируются.
В идеале хотелось что бы звуки накладывались друг на друга... а еще лучше перезапускать звук если сработало то же событие быстрее чем играется звук

Автор: Dancer 23.11.2006, 10:24
604, звини, хотел дома посмотреть, но времени не оказалось. Попробую сегодня в течении дня, ну или погоди до завтра. Дома вечером - точно погоняю.

Автор: 604 27.11.2006, 20:17
Всем еще раз привет!
Выяснил все эксперементальным путем!(относится к проигрыванию миди на BenqSiemens S68)
1. Одновременно может играть только 1 плеер.
2. одновременно может быть prefetch() только 1 плеер.
3. методы setMediaTime и getMediaTime не реализованы (спасибо большое сименс)
Мой код глюкал, поскольку prefetch() были все 3 плеера.
Исходя из всего этого получается:
Если мы тормознули звук,  а потом снова захотели его запустить, он начинает играть с прерваного места.
Это правильно, но поскольку метод setMediaTime не реализован, запустить звук с начала мы не можем  smile Так что для этого придется создавать новый плеер  smile

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