diff --git a/app/music.py b/app/music.py index 20c4ca4..b8ba2b7 100644 --- a/app/music.py +++ b/app/music.py @@ -32,19 +32,18 @@ class Music: to hold up the UI during the fade. """ - with lock: - DEBUG("music.fade()", True) + DEBUG("music.fade()", True) - if not self.player: - return + if not self.player: + return - if not self.player.get_position() > 0 and self.player.is_playing(): - return + if not self.player.get_position() > 0 and self.player.is_playing(): + return - self.fading += 1 + self.fading += 1 - thread = threading.Thread(target=self._fade) - thread.start() + thread = threading.Thread(target=self._fade) + thread.start() def _fade(self): """ @@ -54,10 +53,14 @@ class Music: # Take a copy of current player to allow another track to be # started without interfering here - p = self.player - DEBUG(f"music._fade(), {self.player=}", True) + with lock: + p = self.player + self.player = None + + DEBUG(f"music._fade() post-lock, {self.player=}", True) + fade_time = Config.FADE_TIME / 1000 steps = Config.FADE_STEPS sleep_time = fade_time / steps @@ -77,7 +80,15 @@ class Music: p.audio_set_volume(int(self.max_volume * volume_factor)) sleep(sleep_time) - self.stop(p) + with lock: + DEBUG(f"music._facde(), stopping {p=}", True) + + p.stop() + DEBUG(f"Releasing player {p=}", True) + p.release() + # Ensure we don't reference player after release + p = None + self.fading -= 1 def get_playtime(self): @@ -149,24 +160,19 @@ class Music: self.max_volume = volume self.player.audio_set_volume(volume) - def stop(self, player=None): + def stop(self): "Immediately stop playing" with lock: - DEBUG(f"music.stop(), {player=}", True) + DEBUG(f"music.stop(), {self.player=}", True) - if not player: - if not self.player: - return - player = self.player + if not self.player: + return - DEBUG(f"music.stop({player=})") - - position = player.get_position() - player.stop() - DEBUG(f"Releasing player {player=}", True) - player.release() + position = self.player.get_position() + self.player.stop() + DEBUG(f"Releasing player {self.player=}", True) + self.player.release() # Ensure we don't reference player after release - player = None - + self.player = None return position diff --git a/app/musicmuster.py b/app/musicmuster.py index 267712c..20e5959 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -504,16 +504,19 @@ class Window(QMainWindow, Ui_MainWindow): def stop_playing(self, fade=True): "Stop playing current track" - DEBUG("musicmuster.stop_playing()") + DEBUG("musicmuster.stop_playing()", True) if not self.music.playing(): + DEBUG("musicmuster.stop_playing(): not playing", True) return self.previous_track_position = self.music.get_position() if fade: + DEBUG("musicmuster.stop_playing(): fading music", True) self.music.fade() else: self.music.stop() + DEBUG("musicmuster.stop_playing(): stopping music", True) self.current_track_playlist_tab.clear_current() # Shuffle tracks along @@ -563,7 +566,7 @@ class Window(QMainWindow, Ui_MainWindow): if not self.even_tick: return - if self.music.playing(): + if self.music.player and self.music.playing(): self.playing = True playtime = self.music.get_playtime() time_to_fade = (self.current_track.fade_at - playtime)