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.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}"
)

View File

@ -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: