Make music fading more solid - issue #3

This commit is contained in:
Keith Edmunds 2021-06-10 17:55:55 +01:00
parent a80dc3f165
commit 6e754c1b3a
2 changed files with 37 additions and 28 deletions

View File

@ -32,19 +32,18 @@ class Music:
to hold up the UI during the fade.
"""
with lock:
DEBUG("music.fade()", True)
DEBUG("music.fade()", True)
if not self.player:
return
if not self.player:
return
if not self.player.get_position() > 0 and self.player.is_playing():
return
if not self.player.get_position() > 0 and self.player.is_playing():
return
self.fading += 1
self.fading += 1
thread = threading.Thread(target=self._fade)
thread.start()
thread = threading.Thread(target=self._fade)
thread.start()
def _fade(self):
"""
@ -54,10 +53,14 @@ class Music:
# Take a copy of current player to allow another track to be
# started without interfering here
p = self.player
DEBUG(f"music._fade(), {self.player=}", True)
with lock:
p = self.player
self.player = None
DEBUG(f"music._fade() post-lock, {self.player=}", True)
fade_time = Config.FADE_TIME / 1000
steps = Config.FADE_STEPS
sleep_time = fade_time / steps
@ -77,7 +80,15 @@ class Music:
p.audio_set_volume(int(self.max_volume * volume_factor))
sleep(sleep_time)
self.stop(p)
with lock:
DEBUG(f"music._facde(), stopping {p=}", True)
p.stop()
DEBUG(f"Releasing player {p=}", True)
p.release()
# Ensure we don't reference player after release
p = None
self.fading -= 1
def get_playtime(self):
@ -149,24 +160,19 @@ class Music:
self.max_volume = volume
self.player.audio_set_volume(volume)
def stop(self, player=None):
def stop(self):
"Immediately stop playing"
with lock:
DEBUG(f"music.stop(), {player=}", True)
DEBUG(f"music.stop(), {self.player=}", True)
if not player:
if not self.player:
return
player = self.player
if not self.player:
return
DEBUG(f"music.stop({player=})")
position = player.get_position()
player.stop()
DEBUG(f"Releasing player {player=}", True)
player.release()
position = self.player.get_position()
self.player.stop()
DEBUG(f"Releasing player {self.player=}", True)
self.player.release()
# Ensure we don't reference player after release
player = None
self.player = None
return position

View File

@ -504,16 +504,19 @@ class Window(QMainWindow, Ui_MainWindow):
def stop_playing(self, fade=True):
"Stop playing current track"
DEBUG("musicmuster.stop_playing()")
DEBUG("musicmuster.stop_playing()", True)
if not self.music.playing():
DEBUG("musicmuster.stop_playing(): not playing", True)
return
self.previous_track_position = self.music.get_position()
if fade:
DEBUG("musicmuster.stop_playing(): fading music", True)
self.music.fade()
else:
self.music.stop()
DEBUG("musicmuster.stop_playing(): stopping music", True)
self.current_track_playlist_tab.clear_current()
# Shuffle tracks along
@ -563,7 +566,7 @@ class Window(QMainWindow, Ui_MainWindow):
if not self.even_tick:
return
if self.music.playing():
if self.music.player and self.music.playing():
self.playing = True
playtime = self.music.get_playtime()
time_to_fade = (self.current_track.fade_at - playtime)