From 27012a965805df28632fd0f6a6e33028a1d2de96 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 4 Aug 2024 11:57:46 +0100 Subject: [PATCH] Fix non-release of player when at natural end of track --- app/classes.py | 67 +++++++++++++++------------------------------- app/musicmuster.py | 14 ++++++---- 2 files changed, 31 insertions(+), 50 deletions(-) diff --git a/app/classes.py b/app/classes.py index 9ca0360..628db87 100644 --- a/app/classes.py +++ b/app/classes.py @@ -135,8 +135,8 @@ class _FadeCurve: 0, track_fade_at - Config.FADE_CURVE_MS_BEFORE_FADE - 1 ) self.end_ms: int = track_silence_at - self.audio_segment = audio[self.start_ms : self.end_ms] - self.graph_array = np.array(self.audio_segment.get_array_of_samples()) + audio_segment = audio[self.start_ms : self.end_ms] + self.graph_array = np.array(audio_segment.get_array_of_samples()) # Calculate the factor to map milliseconds of track to array self.ms_to_array_factor = len(self.graph_array) / (self.end_ms - self.start_ms) @@ -202,16 +202,17 @@ class _FadeTrack(QThread): # Reduce volume logarithmically total_steps = self.fade_seconds * Config.FADEOUT_STEPS_PER_SECOND - db_reduction_per_step = Config.FADEOUT_DB / total_steps - reduction_factor_per_step = pow(10, (db_reduction_per_step / 20)) + if total_steps > 0: + db_reduction_per_step = Config.FADEOUT_DB / total_steps + reduction_factor_per_step = pow(10, (db_reduction_per_step / 20)) - volume = self.player.audio_get_volume() + volume = self.player.audio_get_volume() - for i in range(1, total_steps + 1): - self.player.audio_set_volume( - int(volume * pow(reduction_factor_per_step, i)) - ) - sleep(1 / Config.FADEOUT_STEPS_PER_SECOND) + for i in range(1, total_steps + 1): + self.player.audio_set_volume( + int(volume * pow(reduction_factor_per_step, i)) + ) + sleep(1 / Config.FADEOUT_STEPS_PER_SECOND) self.finished.emit() @@ -292,10 +293,6 @@ class _Music: if not self.player.get_position() > 0 and self.player.is_playing(): return - if fade_seconds <= 0: - self.stop() - return - self.fader_worker = _FadeTrack(self.player, fade_seconds=fade_seconds) self.fader_worker.finished.connect(self.player.release) self.fader_worker.start() @@ -340,15 +337,6 @@ class _Music: < dt.timedelta(microseconds=Config.PLAY_SETTLE) ) - def on_playback_end(self, *args, **kwargs): - """ - Release player when playing has ended - """ - - if self.player: - self.player.release() - self.player = None - def play( self, path: str, @@ -376,11 +364,6 @@ class _Music: show_warning(None, "Error creating MediaPlayer", f"Cannot play file ({path})") return - # Connect to the end-of-playback event - self.player.event_manager().event_attach( - vlc.EventType.MediaPlayerEndReached, self.on_playback_end - ) - _ = self.player.play() self.set_volume(self.max_volume) @@ -448,7 +431,6 @@ class _Music: if not self.player: return - self.start_dt = None if self.player.is_playing(): self.player.stop() self.player.release() @@ -565,14 +547,16 @@ class RowAndTrack: if self.end_of_track_signalled: return - if not self.music.is_playing(): - self.start_time = None - if self.fade_graph: - self.fade_graph.clear() - # Ensure that player is released - self.music.stop() - self.signal_end_of_track() - self.end_of_track_signalled = True + if self.music.is_playing(): + return + + self.start_time = None + if self.fade_graph: + self.fade_graph.clear() + # Ensure that player is released + self.music.fade(0) + self.signals.track_ended_signal.emit() + self.end_of_track_signalled = True def create_fade_graph(self) -> None: """ @@ -608,7 +592,7 @@ class RowAndTrack: self.resume_marker = self.music.get_position() self.music.fade(fade_seconds) - self.signal_end_of_track() + self.signals.track_ended_signal.emit() def is_playing(self) -> bool: """ @@ -695,13 +679,6 @@ class RowAndTrack: return new_start_time - def signal_end_of_track(self) -> None: - """ - Send end of track signal - """ - - self.signals.track_ended_signal.emit() - def stop(self, fade_seconds: int = 0) -> None: """ Stop this track playing diff --git a/app/musicmuster.py b/app/musicmuster.py index 34f523c..51a8703 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -660,9 +660,13 @@ class Window(QMainWindow, Ui_MainWindow): - Enable controls """ - # Reset track_sequence objects - track_sequence.previous = track_sequence.current - track_sequence.current = None + if track_sequence.current: + # Dereference the fade curve so it can be garbage collected + track_sequence.current.fade_graph = None + + # Reset track_sequence objects + track_sequence.previous = track_sequence.current + track_sequence.current = None # Tell model previous track has finished self.active_proxy_model().previous_track_ended() @@ -681,8 +685,8 @@ class Window(QMainWindow, Ui_MainWindow): self.show_status_message("Play controls: Enabled", 0) # autoplay - if not self.stop_autoplay: - self.play_next() + # if not self.stop_autoplay: + # self.play_next() def export_playlist_tab(self) -> None: """Export the current playlist to an m3u file"""