From 3834f51179f994d6dca59191e661b8fe8183ba13 Mon Sep 17 00:00:00 2001 From: Ethan Kiczek Date: Wed, 18 Feb 2026 18:13:51 -0500 Subject: [PATCH] Fix timer finished sound not looping Check if player is actually playing before calling stop(for_replacement=True) in MpvMediaPlayer.play(). When the player was already idle, stop(for_replacement=True) would set _suppress_end_event=True with no end-file event to consume it. The next track's end-file callback would then be incorrectly suppressed, breaking the timer loop. - Import PlayerState to check player state - Only call stop(for_replacement=True) when player is not IDLE --- linux_voice_assistant/mpv_player.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/linux_voice_assistant/mpv_player.py b/linux_voice_assistant/mpv_player.py index 3725e52..27ae202 100644 --- a/linux_voice_assistant/mpv_player.py +++ b/linux_voice_assistant/mpv_player.py @@ -3,6 +3,7 @@ import logging from typing import Union, List, Callable, Optional from .player.libmpv import LibMpvPlayer +from .player.state import PlayerState class MpvMediaPlayer: @@ -39,13 +40,13 @@ class MpvMediaPlayer: self._log.debug("Received URL list, using first entry") url = url[0] - # Track is changing + # Track is changing - only stop for replacement if actually playing if self._done_callback is not None: - self._log.debug( - "Stopping active playback before starting new media" - ) - # Not self.stop() → this would call done_callback - self._player.stop(for_replacement=True) + if self._player.state() != PlayerState.IDLE: + self._log.debug( + "Stopping active playback before starting new media" + ) + self._player.stop(for_replacement=True) self._done_callback = None self._log.info("Playing media: %s", url) @@ -87,7 +88,7 @@ class MpvMediaPlayer: Set playback volume. Args: - volume: Volume in percent (0.0–100.0). + volume: Volume in percent (0.0-100.0). """ self._log.debug("set_volume(volume=%.2f)", volume) self._player.set_volume(volume) @@ -97,7 +98,7 @@ class MpvMediaPlayer: Temporarily reduce volume. Args: - factor: Volume multiplier (0.0–1.0). + factor: Volume multiplier (0.0-1.0). """ self._log.debug("duck(factor=%.2f)", factor) self._player.duck(factor) @@ -105,4 +106,4 @@ class MpvMediaPlayer: def unduck(self) -> None: """Restore volume after ducking.""" self._log.debug("unduck() called") - self._player.unduck() \ No newline at end of file + self._player.unduck()