Fix non-release of player when at natural end of track
This commit is contained in:
parent
1d5fe3e57e
commit
27012a9658
@ -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
|
||||||
|
|||||||
@ -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"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user