From 722ab65ebdf738eb3d4bd3d005cd9b87524826be Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Tue, 24 Feb 2026 21:44:36 +0100 Subject: [PATCH] MusicPlayer: show playing song --- .../assets/music_player.py | 68 +++++++++++-------- .../lib/mpos/audio/audiomanager.py | 21 ++++++ 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/internal_filesystem/apps/com.micropythonos.musicplayer/assets/music_player.py b/internal_filesystem/apps/com.micropythonos.musicplayer/assets/music_player.py index 79ae88e9..2a3760c0 100644 --- a/internal_filesystem/apps/com.micropythonos.musicplayer/assets/music_player.py +++ b/internal_filesystem/apps/com.micropythonos.musicplayer/assets/music_player.py @@ -15,6 +15,13 @@ class MusicPlayer(Activity): screen = lv.obj() # the user might have recently plugged in the sd card so try to mount it sdcard.mount_with_optional_format('/sdcard') + + active_track = AudioManager.get_active_track(stream_type=AudioManager.STREAM_MUSIC) + if active_track: + self.startActivity(Intent(activity_class=FullscreenPlayer).putExtra("filename", active_track)) + self.finish() + return + self.file_explorer = lv.file_explorer(screen) self.file_explorer.explorer_open_dir('M:/') self.file_explorer.align(lv.ALIGN.CENTER, 0, 0) @@ -107,36 +114,41 @@ class FullscreenPlayer(Activity): super().onResume(screen) if not self._filename: print("Not playing any file...") - else: - print(f"Playing file {self._filename}") - AudioManager.stop() - time.sleep(0.1) + return - output = AudioManager.get_default_output() - if output is None: - error_msg = "Error: No audio output available" - print(error_msg) - self.update_ui_threadsafe_if_foreground( - self._filename_label.set_text, - error_msg - ) - return + print(f"Playing file {self._filename}") + active_player = AudioManager.get_active_player(stream_type=AudioManager.STREAM_MUSIC) + if active_player and active_player.file_path == self._filename and active_player.is_playing(): + return - try: - player = AudioManager.player( - file_path=self._filename, - stream_type=AudioManager.STREAM_MUSIC, - on_complete=self.player_finished, - output=output, - ) - player.start() - except Exception as exc: - error_msg = "Error: Audio device unavailable or busy" - print(f"{error_msg}: {exc}") - self.update_ui_threadsafe_if_foreground( - self._filename_label.set_text, - error_msg - ) + AudioManager.stop() + time.sleep(0.1) + + output = AudioManager.get_default_output() + if output is None: + error_msg = "Error: No audio output available" + print(error_msg) + self.update_ui_threadsafe_if_foreground( + self._filename_label.set_text, + error_msg + ) + return + + try: + player = AudioManager.player( + file_path=self._filename, + stream_type=AudioManager.STREAM_MUSIC, + on_complete=self.player_finished, + output=output, + ) + player.start() + except Exception as exc: + error_msg = "Error: Audio device unavailable or busy" + print(f"{error_msg}: {exc}") + self.update_ui_threadsafe_if_foreground( + self._filename_label.set_text, + error_msg + ) def focus_obj(self, obj): obj.set_style_border_color(lv.theme_get_color_primary(None),lv.PART.MAIN) diff --git a/internal_filesystem/lib/mpos/audio/audiomanager.py b/internal_filesystem/lib/mpos/audio/audiomanager.py index fac23dd6..e0e3bf08 100644 --- a/internal_filesystem/lib/mpos/audio/audiomanager.py +++ b/internal_filesystem/lib/mpos/audio/audiomanager.py @@ -209,6 +209,27 @@ class AudioManager: def get_volume(cls): return cls.get()._volume + @classmethod + def get_active_player(cls, stream_type=None, file_path=None): + manager = cls.get() + manager._cleanup_inactive() + for session in list(manager._active_sessions): + if isinstance(session, Player): + if stream_type is not None and session.stream_type != stream_type: + continue + if file_path is not None and session.file_path != file_path: + continue + if session.is_playing(): + return session + return None + + @classmethod + def get_active_track(cls, stream_type=None): + player = cls.get_active_player(stream_type=stream_type) + if player and player.file_path: + return player.file_path + return None + @classmethod def player( cls,