Fix: end of preview caused main play end of track actions

This commit is contained in:
Keith Edmunds 2024-06-02 20:53:26 +01:00
parent 2a1d9e94bc
commit 35b5402853
2 changed files with 59 additions and 40 deletions

View File

@ -153,7 +153,7 @@ class Window(QMainWindow, Ui_MainWindow):
self.timer500: QTimer = QTimer() self.timer500: QTimer = QTimer()
self.timer1000: 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.set_main_window_size()
self.lblSumPlaytime = QLabel("") self.lblSumPlaytime = QLabel("")
@ -1075,15 +1075,15 @@ class Window(QMainWindow, Ui_MainWindow):
return return
with db.Session() as session: 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 session=session, track_id=track_id, row_number=row_number
) )
self.preview_track_player.play() self.preview_track_manager.play()
else: else:
if self.preview_track_player: if self.preview_track_manager:
self.preview_track_player.stop() self.preview_track_manager.stop()
self.preview_track_player = None self.preview_track_manager = None
self.label_intro_timer.setText("0.0") self.label_intro_timer.setText("0.0")
self.label_intro_timer.setStyleSheet("") self.label_intro_timer.setStyleSheet("")
self.btnPreviewMark.setEnabled(False) self.btnPreviewMark.setEnabled(False)
@ -1097,45 +1097,45 @@ class Window(QMainWindow, Ui_MainWindow):
def preview_back(self) -> None: def preview_back(self) -> None:
"""Wind back preview file""" """Wind back preview file"""
if self.preview_track_player: if self.preview_track_manager:
self.preview_track_player.move_back() self.preview_track_manager.move_back()
def preview_end(self) -> None: def preview_end(self) -> None:
"""Advance preview file to Config.PREVIEW_END_BUFFER_MS before end of intro""" """Advance preview file to Config.PREVIEW_END_BUFFER_MS before end of intro"""
if self.preview_track_player: if self.preview_track_manager:
self.preview_track_player.move_to_intro_end() self.preview_track_manager.move_to_intro_end()
def preview_fwd(self) -> None: def preview_fwd(self) -> None:
"""Advance preview file""" """Advance preview file"""
if self.preview_track_player: if self.preview_track_manager:
self.preview_track_player.move_forward() self.preview_track_manager.move_forward()
def preview_mark(self) -> None: def preview_mark(self) -> None:
"""Set intro time""" """Set intro time"""
if self.preview_track_player: if self.preview_track_manager:
track_id = self.preview_track_player.track_id track_id = self.preview_track_manager.track_id
row_number = self.preview_track_player.row_number row_number = self.preview_track_manager.row_number
with db.Session() as session: with db.Session() as session:
track = session.get(Tracks, track_id) track = session.get(Tracks, track_id)
if track: if track:
# Save intro as millisends rounded to nearest 0.1 # Save intro as millisends rounded to nearest 0.1
# second because editor spinbox only resolves to 0.1 # second because editor spinbox only resolves to 0.1
# seconds # seconds
intro = round(self.preview_track_player.time_playing() / 100) * 100 intro = round(self.preview_track_manager.time_playing() / 100) * 100
track.intro = intro track.intro = intro
session.commit() 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.refresh_row(session, row_number)
self.active_tab().source_model.invalidate_row(row_number) self.active_tab().source_model.invalidate_row(row_number)
def preview_start(self) -> None: def preview_start(self) -> None:
"""Restart preview""" """Restart preview"""
if self.preview_track_player: if self.preview_track_manager:
self.preview_track_player.restart() self.preview_track_manager.restart()
def rename_playlist(self) -> None: def rename_playlist(self) -> None:
""" """
@ -1509,14 +1509,14 @@ class Window(QMainWindow, Ui_MainWindow):
pass pass
# Ensure preview button is reset if preview finishes playing # Ensure preview button is reset if preview finishes playing
if self.preview_track_player: if self.preview_track_manager:
self.btnPreview.setChecked(self.preview_track_player.is_playing()) self.btnPreview.setChecked(self.preview_track_manager.is_playing())
# Update preview timer # Update preview timer
if self.preview_track_player.is_playing(): if self.preview_track_manager.is_playing():
playtime = self.preview_track_player.time_playing() playtime = self.preview_track_manager.time_playing()
self.label_intro_timer.setText(f"{playtime / 1000:.1f}") 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( self.label_intro_timer.setStyleSheet(
f"background: {Config.COLOUR_WARNING_TIMER}" f"background: {Config.COLOUR_WARNING_TIMER}"
) )

View File

@ -361,7 +361,12 @@ class _TrackManager:
""" """
def __init__( 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: ) -> None:
""" """
Initialises data structure. Initialises data structure.
@ -374,6 +379,7 @@ class _TrackManager:
raise ValueError(f"_TrackPlayer: unable to retreived {track_id=}") raise ValueError(f"_TrackPlayer: unable to retreived {track_id=}")
self.player_name = player_name self.player_name = player_name
self.row_number = row_number self.row_number = row_number
self.preview_player = preview_player
self.artist = track.artist self.artist = track.artist
self.bitrate = track.bitrate self.bitrate = track.bitrate
@ -399,25 +405,29 @@ class _TrackManager:
self.player = _Music(name=player_name) self.player = _Music(name=player_name)
# Initialise and add FadeCurve in a thread as it's slow # Initialise and add FadeCurve in a thread as it's slow
self.fadecurve_thread = QThread() if not self.preview_player:
self.worker = _AddFadeCurve( self.fadecurve_thread = QThread()
self, self.worker = _AddFadeCurve(
track_path=track.path, self,
track_fade_at=track.fade_at, track_path=track.path,
track_silence_at=track.silence_at, 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.moveToThread(self.fadecurve_thread)
self.worker.finished.connect(self.fadecurve_thread.quit) self.fadecurve_thread.started.connect(self.worker.run)
self.worker.finished.connect(self.worker.deleteLater) self.worker.finished.connect(self.fadecurve_thread.quit)
self.fadecurve_thread.finished.connect(self.fadecurve_thread.deleteLater) self.worker.finished.connect(self.worker.deleteLater)
self.fadecurve_thread.start() self.fadecurve_thread.finished.connect(self.fadecurve_thread.deleteLater)
self.fadecurve_thread.start()
def check_for_end_of_track(self) -> None: def check_for_end_of_track(self) -> None:
""" """
Check whether track has ended. If so, emit track_ended_signal Check whether track has ended. If so, emit track_ended_signal
""" """
if self.preview_player:
return
if self.start_time is None: if self.start_time is None:
return return
@ -428,7 +438,7 @@ class _TrackManager:
self.start_time = None self.start_time = None
if self.fade_graph: if self.fade_graph:
self.fade_graph.clear() self.fade_graph.clear()
self.signals.track_ended_signal.emit() self.signal_end_of_track()
self.end_of_track_signalled = True self.end_of_track_signalled = True
def drop3db(self, enable: bool) -> None: def drop3db(self, enable: bool) -> None:
@ -446,7 +456,7 @@ class _TrackManager:
self.resume_marker = self.player.get_position() self.resume_marker = self.player.get_position()
self.player.fade(fade_seconds) self.player.fade(fade_seconds)
self.signals.track_ended_signal.emit() self.signal_end_of_track()
def is_playing(self) -> bool: def is_playing(self) -> bool:
""" """
@ -511,6 +521,14 @@ class _TrackManager:
self.player.adjust_by_ms(self.time_playing() * -1) 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: def stop(self, fade_seconds: int = 0) -> None:
""" """
Stop this track playing Stop this track playing
@ -630,6 +648,7 @@ class PreviewTrackManager(_TrackManager):
player_name=Config.VLC_PREVIEW_PLAYER_NAME, player_name=Config.VLC_PREVIEW_PLAYER_NAME,
track_id=track_id, track_id=track_id,
row_number=row_number, row_number=row_number,
preview_player=True,
) )
def __repr__(self) -> str: def __repr__(self) -> str: