Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MMAPI - проигрывание одновременно нескольких миди 
:(
    Опции темы
604
Дата 21.11.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2005

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) 604 - 21.11.2006, 21:44
PM MAIL   Вверх
Dancer
Дата 22.11.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



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


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
604
Дата 22.11.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2005

Репутация: нет
Всего: 1



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

PM MAIL   Вверх
Dancer
Дата 22.11.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



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


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
604
Дата 22.11.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2005

Репутация: нет
Всего: 1



Вот мой класс
Код

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 и соответственно дальнейшие его запуски игнорируются.
В идеале хотелось что бы звуки накладывались друг на друга... а еще лучше перезапускать звук если сработало то же событие быстрее чем играется звук

Это сообщение отредактировал(а) 604 - 22.11.2006, 14:29
PM MAIL   Вверх
Dancer
Дата 23.11.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



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


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
604
Дата 27.11.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2005

Репутация: нет
Всего: 1



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

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1231 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.