Перейти к содержанию
Fire Monkey от А до Я
  • 0

Динамическое создание TMediaPlayer


c_breaker

Вопрос

Добрый день!

 

Пытаюсь побороть странную проблему.

 

Есть задеплоеный звук формата mp3.

 

Есть кнопка, по которой этот звук проигрывается при помощи лежащего на форме медиаплеера.

  mp.FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetPublicPath, 'beep.mp3');
  mp.Play;

все гениальное просто, и сколько бы я не нажимал на кнопку - звук проигрывается как в эмуляторе, так и на устройстве.

 

Далее. Есть класс, скажем так - банк медиаплееров. Он создает их динамически:

procedure TSoundBank.AddSound(SoundType: TSoundTypes; FileName: String);
var
  mp: TMediaPlayer;
  i: integer;
begin
  for i := 0 to FSounds.Count-1 do
    if FSounds[i].Tag = ord(SoundType) then
      raise Exception.Create('Sound of type TSoundTypes('+IntToStr(Ord(SoundType))+') already added!');

  mp := TMediaPlayer.Create(FOwner); // эту и следующую строку я добавил уже потом, попробовав привязать компонент к форме
  mp.Parent := FOwner;

  FSounds.Add(mp);
  mp.FileName := FileName;
  if mp.Media = nil then
    raise Exception.Create('Filе format for the file '+FileName+' doesn''t supported!');
  mp.Tag := Ord(SoundType);
end;

И метод, проигрывающий нужный звук.

procedure TSoundBank.PlaySound(SoundType: TSoundTypes);
var
  mp: TMediaPlayer;
  i: integer;
begin
  mp := nil;
  for i := 0 to FSounds.Count-1 do
    if FSounds[i].Tag = Ord(SoundType) then
      mp := FSounds[i];
  if mp = nil then
    raise Exception.Create('Cannot find sound of such type : TSoundTypes('+ IntToStr(Ord(SoundType)) + ')');
  if mp.CurrentTime <> mp.Duration then
    mp.Stop;
  mp.CurrentTime := 0;
  mp.Volume := 1; //добавил позже на всякий случай
  mp.Play;
end;

Вот этот метод ничего не воспроизводит ни на устройстве, не на виртуалке. Причем нигде не падает, FMedia у MediaPlayer'а заполнен. Отладчик нормально проходит.

Надо отметить, что все прекрасно работает если сбилдить под винду.

 

Пробовал динамически создавать родной Android медиаплеер - он нормально работает на устройстве, но почему-то падает на виртуалке. но это уже другой вопрос)

 

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

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

В общем, вопрос решился созданием коллекции родных JMediaPlayer, к сожалению. Динамически созданные TMediaPlayer на андроиде проигрывать что-либо отказались. Надеюсь, разработчики предпримут какие-либо меры. 

Ссылка на комментарий
  • 0
  • Администраторы

У вас случайно TMediaPlayer не распускается после выхода из процедуры? Проверьте вызов деструктора....

Ссылка на комментарий
  • 0

У вас случайно TMediaPlayer не распускается после выхода из процедуры? Проверьте вызов деструктора....

 

Опытным путем выяснил, что если закомментировать строчки, как ниже:

 

//  if mp.CurrentTime <> mp.Duration then
//    mp.Stop;
  mp.CurrentTime := 0;
  mp.Play;
 
то плеер проигрывает звуки, правда некоторые пропускает (почему?)
 
Если же раскомментировать  mp.Stop, то не проигрывается ни одного звука (на андроиде; если забилдить приложение под винду - все хорошо).
 
Все же не очень понятно, что я делаю не так.
 
Фактически мне необходимо, чтобы по определенным событиям проигрывался определенный звук, причем если звук до конца еще не доиграл, а событие снова возникло - запускать звук сначала.
 
По деструктору - проверил, TAndroidMedia.Destroy вызывается при закрытии приложения.
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...