Make music fading more solid - issue #3
This commit is contained in:
parent
a80dc3f165
commit
6e754c1b3a
58
app/music.py
58
app/music.py
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user