Я создаю приложение метронома с kivy. Поскольку галочки должны быть точно в точку, я столкнулся с множеством проблем.
Я запланировал события часов как «бесплатные» события:
Config.set('kivy', 'kivy_clock', 'free_all')
Config.write()
Clock.schedule_once_free(self.callback, self.delay)
Если я отслеживаю время обратных вызовов, все они великолепны. Виджеты обновляются в этих обратных вызовах, и они как раз на месте.
Но если я воспроизвожу звук в начале обратного вызова, он каждый раз выполняется с разными задержками. Таким образом, звук не относится к предполагаемому удару в минуту.
Разные Sound-загрузчики ведут себя по-разному: «SoundPygame» не имеет задержки, но не может использоваться для Android (отсутствует поддержка pygame) Некиви-модуль "воспроизведение звука" прекрасно работает, но его нельзя использовать с билдозером из-за отсутствия модуля "ги". «SoundSDL2» используется по умолчанию и не подходит для этой задачи.
sound_norm = SoundPygame(source='sounds/tick.wav')
def callback(self, dt):
self.sound_norm.play()
Есть ли способ воспроизвести звук на Android с помощью kivy без задержек на основе событий?
Это мой первый вопрос здесь, поэтому, пожалуйста, извините меня, если я задал что-то неправильно или мне нужно улучшить свой вопрос. С наилучшими пожеланиями!
Использование Pyjnius решило проблему. Теперь у меня есть код, зависящий от платформы. Для Android:
from jnius import autoclass
MediaPlayer = autoclass('android.media.MediaPlayer')
mPlayer_norm = MediaPlayer()
mPlayer_norm.setDataSource(SOUND_NORM)
mPlayer_norm.prepare()
позже я могу воспроизвести звук в обратном вызове:
self.sound_norm.play()
Таким образом, нет заметной задержки, поэтому это работает для меня.