Fix non-release of player when at natural end of track

This commit is contained in:
Keith Edmunds 2024-08-04 11:57:46 +01:00
parent 1d5fe3e57e
commit 27012a9658
2 changed files with 31 additions and 50 deletions

View File

@ -135,8 +135,8 @@ class _FadeCurve:
0, track_fade_at - Config.FADE_CURVE_MS_BEFORE_FADE - 1 0, track_fade_at - Config.FADE_CURVE_MS_BEFORE_FADE - 1
) )
self.end_ms: int = track_silence_at self.end_ms: int = track_silence_at
self.audio_segment = audio[self.start_ms : self.end_ms] audio_segment = audio[self.start_ms : self.end_ms]
self.graph_array = np.array(self.audio_segment.get_array_of_samples()) self.graph_array = np.array(audio_segment.get_array_of_samples())
# Calculate the factor to map milliseconds of track to array # 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) self.ms_to_array_factor = len(self.graph_array) / (self.end_ms - self.start_ms)
@ -202,6 +202,7 @@ class _FadeTrack(QThread):
# Reduce volume logarithmically # Reduce volume logarithmically
total_steps = self.fade_seconds * Config.FADEOUT_STEPS_PER_SECOND total_steps = self.fade_seconds * Config.FADEOUT_STEPS_PER_SECOND
if total_steps > 0:
db_reduction_per_step = Config.FADEOUT_DB / total_steps db_reduction_per_step = Config.FADEOUT_DB / total_steps
reduction_factor_per_step = pow(10, (db_reduction_per_step / 20)) reduction_factor_per_step = pow(10, (db_reduction_per_step / 20))
@ -292,10 +293,6 @@ class _Music:
if not self.player.get_position() > 0 and self.player.is_playing(): if not self.player.get_position() > 0 and self.player.is_playing():
return return
if fade_seconds <= 0:
self.stop()
return
self.fader_worker = _FadeTrack(self.player, fade_seconds=fade_seconds) self.fader_worker = _FadeTrack(self.player, fade_seconds=fade_seconds)
self.fader_worker.finished.connect(self.player.release) self.fader_worker.finished.connect(self.player.release)
self.fader_worker.start() self.fader_worker.start()
@ -340,15 +337,6 @@ class _Music:
< dt.timedelta(microseconds=Config.PLAY_SETTLE) < 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( def play(
self, self,
path: str, path: str,
@ -376,11 +364,6 @@ class _Music:
show_warning(None, "Error creating MediaPlayer", f"Cannot play file ({path})") show_warning(None, "Error creating MediaPlayer", f"Cannot play file ({path})")
return 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.player.play()
self.set_volume(self.max_volume) self.set_volume(self.max_volume)
@ -448,7 +431,6 @@ class _Music:
if not self.player: if not self.player:
return return
self.start_dt = None
if self.player.is_playing(): if self.player.is_playing():
self.player.stop() self.player.stop()
self.player.release() self.player.release()
@ -565,13 +547,15 @@ class RowAndTrack:
if self.end_of_track_signalled: if self.end_of_track_signalled:
return return
if not self.music.is_playing(): if self.music.is_playing():
return
self.start_time = None self.start_time = None
if self.fade_graph: if self.fade_graph:
self.fade_graph.clear() self.fade_graph.clear()
# Ensure that player is released # Ensure that player is released
self.music.stop() self.music.fade(0)
self.signal_end_of_track() self.signals.track_ended_signal.emit()
self.end_of_track_signalled = True self.end_of_track_signalled = True
def create_fade_graph(self) -> None: def create_fade_graph(self) -> None:
@ -608,7 +592,7 @@ class RowAndTrack:
self.resume_marker = self.music.get_position() self.resume_marker = self.music.get_position()
self.music.fade(fade_seconds) self.music.fade(fade_seconds)
self.signal_end_of_track() self.signals.track_ended_signal.emit()
def is_playing(self) -> bool: def is_playing(self) -> bool:
""" """
@ -695,13 +679,6 @@ class RowAndTrack:
return new_start_time 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: def stop(self, fade_seconds: int = 0) -> None:
""" """
Stop this track playing Stop this track playing

View File

@ -660,6 +660,10 @@ class Window(QMainWindow, Ui_MainWindow):
- Enable controls - Enable controls
""" """
if track_sequence.current:
# Dereference the fade curve so it can be garbage collected
track_sequence.current.fade_graph = None
# Reset track_sequence objects # Reset track_sequence objects
track_sequence.previous = track_sequence.current track_sequence.previous = track_sequence.current
track_sequence.current = None track_sequence.current = None
@ -681,8 +685,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.show_status_message("Play controls: Enabled", 0) self.show_status_message("Play controls: Enabled", 0)
# autoplay # autoplay
if not self.stop_autoplay: # if not self.stop_autoplay:
self.play_next() # self.play_next()
def export_playlist_tab(self) -> None: def export_playlist_tab(self) -> None:
"""Export the current playlist to an m3u file""" """Export the current playlist to an m3u file"""