Добрый день!
Пытаюсь побороть странную проблему.
Есть задеплоеный звук формата 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 медиаплеер - он нормально работает на устройстве, но почему-то падает на виртуалке. но это уже другой вопрос)
Помогите разобраться в тонкостях динамического создания медиплеера, уж очень хочется пользоваться возможностью написать один код под все приложения.