c_breaker
-
Постов
12 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные c_breaker
-
-
-
А это в принципе нормально, что после смены sdk, забилдив и установив на то же самое устройство рабочтавший ранее релиз, причем совершенно без измнений, вылез этот баг?
Конечно я не сразу бросился сюда писать, я заходил и в отладчик, и logcat поизучал. стэк пустой, там только системные модули.
-
Переустановил SDK и NDK - выкачал свежие с гугла. После этого приложение которое нормально работало, стало падать при запуске с ошибкой Exception class Segmentation fault (11)
Переустанавливать все снова очень не хочется - что можно сделать кроме этого?
-
Может кому поможет - проблема решилась использованием андроидовского SoundPool:
создание:
FSoundPool := TJSoundPool.JavaClass.init(10, TJAudioManager.JavaClass.STREAM_MUSIC,0);
добавление звуков:
FSoundPool.load(StringToJString(FileName),1);
проигрывание:
FSoundPool.play(i,1,1,0,0,1);
-
android
тот же код под виндой работает как и предполагалось.
currenttime обнуляю.
begin Logger.Log(Format('-->>Enter TSoundBank.PlaySound(SoundType(%d))',[Ord(SoundType)])); if not FSounds.TryGetValue(SoundType, mp) then raise Exception.Create('Cannot find sound of such type : TSoundTypes('+ IntToStr(Ord(SoundType)) + ')'); case mp.State of TMediaState.Unavailable: raise Exception.Create('Sound of such type : TSoundTypes('+ IntToStr(Ord(SoundType)) + ') is UNAVAILABLE!') ; TMediaState.Playing: begin Logger.Log(Format(' mp.State = Playing',[Ord(SoundType)])); mp.Stop; end; end; mp.CurrentTime := 0; mp.Play; Logger.Log(Format('<<--Exit TSoundBank.PlaySound(SoundType(%d))',[Ord(SoundType)])); end;
в метод входит и замечательно выходит, вероятность возникновения при этом звука - пока не определена)
-
В приложении есть коллекция медиаплееров, в каждый экземпляр медиаплеера загружен определенный файл.
По таймеру проигрываются те или иные файлы.
Проблема: не все звуки проигрываются. метод play вызывается, но звука нет. закономерности не обнаружил - просто какие-то съедаются.
Если кто-то сталкивался с подобной проблемой, или знает, в чем дело - проконсультируйте.
-
Добрый день.
Пытаюсь запустить под отладчиком приложение под OS X.
PAServer пишет
>listen
Process Control Server Started pid 1007 exe built Jul 18 2014
sentinelFunc 1009
и на этом дельфя подвисает.
Если срубить PAServer - дельфи возвращается в режим редактирования.
Не из под отладчика приложение запускается нормально.
-
У вас случайно TMediaPlayer не распускается после выхода из процедуры? Проверьте вызов деструктора....
Опытным путем выяснил, что если закомментировать строчки, как ниже:
// if mp.CurrentTime <> mp.Duration then// mp.Stop;mp.CurrentTime := 0;mp.Play;то плеер проигрывает звуки, правда некоторые пропускает (почему?)Если же раскомментировать mp.Stop, то не проигрывается ни одного звука (на андроиде; если забилдить приложение под винду - все хорошо).Все же не очень понятно, что я делаю не так.Фактически мне необходимо, чтобы по определенным событиям проигрывался определенный звук, причем если звук до конца еще не доиграл, а событие снова возникло - запускать звук сначала.По деструктору - проверил, TAndroidMedia.Destroy вызывается при закрытии приложения. -
В общем, вопрос решился созданием коллекции родных JMediaPlayer, к сожалению. Динамически созданные TMediaPlayer на андроиде проигрывать что-либо отказались. Надеюсь, разработчики предпримут какие-либо меры.
-
Коллективный разум не может помочь?
-
Добрый день!
Пытаюсь побороть странную проблему.
Есть задеплоеный звук формата 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 медиаплеер - он нормально работает на устройстве, но почему-то падает на виртуалке. но это уже другой вопрос)
Помогите разобраться в тонкостях динамического создания медиплеера, уж очень хочется пользоваться возможностью написать один код под все приложения.
Segmentation fault после установки свежего sdk и ndk
в Отладка
Опубликовано
Поставил родной Сиэтловский SDK&NDK - все снова заработало. Танцы с бубном, как всегда.