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 7ca104e53d
commit 8ce5c037ef
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
)
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

View File

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