From 35b54028539594afbe55cd3bf044f6740da53649 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 2 Jun 2024 20:53:26 +0100 Subject: [PATCH] Fix: end of preview caused main play end of track actions --- app/musicmuster.py | 48 +++++++++++++++++++++--------------------- app/trackmanager.py | 51 +++++++++++++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 0f9e385..29a3c47 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -153,7 +153,7 @@ class Window(QMainWindow, Ui_MainWindow): self.timer500: QTimer = QTimer() self.timer1000: QTimer = QTimer() - self.preview_track_player: Optional[PreviewTrackManager] = None + self.preview_track_manager: Optional[PreviewTrackManager] = None self.set_main_window_size() self.lblSumPlaytime = QLabel("") @@ -1075,15 +1075,15 @@ class Window(QMainWindow, Ui_MainWindow): return with db.Session() as session: - self.preview_track_player = PreviewTrackManager( + self.preview_track_manager = PreviewTrackManager( session=session, track_id=track_id, row_number=row_number ) - self.preview_track_player.play() + self.preview_track_manager.play() else: - if self.preview_track_player: - self.preview_track_player.stop() - self.preview_track_player = None + if self.preview_track_manager: + self.preview_track_manager.stop() + self.preview_track_manager = None self.label_intro_timer.setText("0.0") self.label_intro_timer.setStyleSheet("") self.btnPreviewMark.setEnabled(False) @@ -1097,45 +1097,45 @@ class Window(QMainWindow, Ui_MainWindow): def preview_back(self) -> None: """Wind back preview file""" - if self.preview_track_player: - self.preview_track_player.move_back() + if self.preview_track_manager: + self.preview_track_manager.move_back() def preview_end(self) -> None: """Advance preview file to Config.PREVIEW_END_BUFFER_MS before end of intro""" - if self.preview_track_player: - self.preview_track_player.move_to_intro_end() + if self.preview_track_manager: + self.preview_track_manager.move_to_intro_end() def preview_fwd(self) -> None: """Advance preview file""" - if self.preview_track_player: - self.preview_track_player.move_forward() + if self.preview_track_manager: + self.preview_track_manager.move_forward() def preview_mark(self) -> None: """Set intro time""" - if self.preview_track_player: - track_id = self.preview_track_player.track_id - row_number = self.preview_track_player.row_number + if self.preview_track_manager: + track_id = self.preview_track_manager.track_id + row_number = self.preview_track_manager.row_number with db.Session() as session: track = session.get(Tracks, track_id) if track: # Save intro as millisends rounded to nearest 0.1 # second because editor spinbox only resolves to 0.1 # seconds - intro = round(self.preview_track_player.time_playing() / 100) * 100 + intro = round(self.preview_track_manager.time_playing() / 100) * 100 track.intro = intro session.commit() - self.preview_track_player.intro = intro + self.preview_track_manager.intro = intro self.active_tab().source_model.refresh_row(session, row_number) self.active_tab().source_model.invalidate_row(row_number) def preview_start(self) -> None: """Restart preview""" - if self.preview_track_player: - self.preview_track_player.restart() + if self.preview_track_manager: + self.preview_track_manager.restart() def rename_playlist(self) -> None: """ @@ -1509,14 +1509,14 @@ class Window(QMainWindow, Ui_MainWindow): pass # Ensure preview button is reset if preview finishes playing - if self.preview_track_player: - self.btnPreview.setChecked(self.preview_track_player.is_playing()) + if self.preview_track_manager: + self.btnPreview.setChecked(self.preview_track_manager.is_playing()) # Update preview timer - if self.preview_track_player.is_playing(): - playtime = self.preview_track_player.time_playing() + if self.preview_track_manager.is_playing(): + playtime = self.preview_track_manager.time_playing() self.label_intro_timer.setText(f"{playtime / 1000:.1f}") - if self.preview_track_player.time_remaining_intro() <= 50: + if self.preview_track_manager.time_remaining_intro() <= 50: self.label_intro_timer.setStyleSheet( f"background: {Config.COLOUR_WARNING_TIMER}" ) diff --git a/app/trackmanager.py b/app/trackmanager.py index d201129..ae82881 100644 --- a/app/trackmanager.py +++ b/app/trackmanager.py @@ -361,7 +361,12 @@ class _TrackManager: """ def __init__( - self, session: db.Session, player_name: str, track_id: int, row_number: int + self, + session: db.Session, + player_name: str, + track_id: int, + row_number: int, + preview_player: bool = False, ) -> None: """ Initialises data structure. @@ -374,6 +379,7 @@ class _TrackManager: raise ValueError(f"_TrackPlayer: unable to retreived {track_id=}") self.player_name = player_name self.row_number = row_number + self.preview_player = preview_player self.artist = track.artist self.bitrate = track.bitrate @@ -399,25 +405,29 @@ class _TrackManager: self.player = _Music(name=player_name) # Initialise and add FadeCurve in a thread as it's slow - self.fadecurve_thread = QThread() - self.worker = _AddFadeCurve( - self, - track_path=track.path, - track_fade_at=track.fade_at, - track_silence_at=track.silence_at, - ) - self.worker.moveToThread(self.fadecurve_thread) - self.fadecurve_thread.started.connect(self.worker.run) - self.worker.finished.connect(self.fadecurve_thread.quit) - self.worker.finished.connect(self.worker.deleteLater) - self.fadecurve_thread.finished.connect(self.fadecurve_thread.deleteLater) - self.fadecurve_thread.start() + if not self.preview_player: + self.fadecurve_thread = QThread() + self.worker = _AddFadeCurve( + self, + track_path=track.path, + track_fade_at=track.fade_at, + track_silence_at=track.silence_at, + ) + self.worker.moveToThread(self.fadecurve_thread) + self.fadecurve_thread.started.connect(self.worker.run) + self.worker.finished.connect(self.fadecurve_thread.quit) + self.worker.finished.connect(self.worker.deleteLater) + self.fadecurve_thread.finished.connect(self.fadecurve_thread.deleteLater) + self.fadecurve_thread.start() def check_for_end_of_track(self) -> None: """ Check whether track has ended. If so, emit track_ended_signal """ + if self.preview_player: + return + if self.start_time is None: return @@ -428,7 +438,7 @@ class _TrackManager: self.start_time = None if self.fade_graph: self.fade_graph.clear() - self.signals.track_ended_signal.emit() + self.signal_end_of_track() self.end_of_track_signalled = True def drop3db(self, enable: bool) -> None: @@ -446,7 +456,7 @@ class _TrackManager: self.resume_marker = self.player.get_position() self.player.fade(fade_seconds) - self.signals.track_ended_signal.emit() + self.signal_end_of_track() def is_playing(self) -> bool: """ @@ -511,6 +521,14 @@ class _TrackManager: self.player.adjust_by_ms(self.time_playing() * -1) + def signal_end_of_track(self) -> None: + """ + Send end of track signal unless we are a preview player + """ + + if not self.preview_player: + self.signals.track_ended_signal.emit() + def stop(self, fade_seconds: int = 0) -> None: """ Stop this track playing @@ -630,6 +648,7 @@ class PreviewTrackManager(_TrackManager): player_name=Config.VLC_PREVIEW_PLAYER_NAME, track_id=track_id, row_number=row_number, + preview_player=True, ) def __repr__(self) -> str: