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

View File

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