diff --git a/app/config.py b/app/config.py index d0cf01a..4925434 100644 --- a/app/config.py +++ b/app/config.py @@ -53,8 +53,9 @@ class Config(object): FADE_CURVE_BACKGROUND = "lightyellow" FADE_CURVE_FOREGROUND = "blue" FADE_CURVE_MS_BEFORE_FADE = 5000 - FADE_STEPS = 20 - FADE_TIME = 3000 + FADEOUT_DB = -10 + FADEOUT_SECONDS = 5 + FADEOUT_STEPS_PER_SECOND = 5 HIDE_AFTER_PLAYING_OFFSET = 5000 INFO_TAB_TITLE_LENGTH = 15 LAST_PLAYED_TODAY_STRING = "Today" diff --git a/app/music.py b/app/music.py index f413b53..9ec33a5 100644 --- a/app/music.py +++ b/app/music.py @@ -19,9 +19,10 @@ lock = threading.Lock() class FadeTrack(QRunnable): - def __init__(self, player: vlc.MediaPlayer) -> None: + def __init__(self, player: vlc.MediaPlayer, fade_seconds) -> None: super().__init__() self.player = player + self.fade_seconds = fade_seconds def run(self): """ @@ -31,24 +32,18 @@ class FadeTrack(QRunnable): if not self.player: return - fade_time = Config.FADE_TIME / 1000 - steps = Config.FADE_STEPS - sleep_time = fade_time / steps - original_volume = self.player.audio_get_volume() + # 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)) - # We reduce volume by one mesure first, then by two measures, - # then three, and so on. - # The sum of the arithmetic sequence 1, 2, 3, ..n is - # (n**2 + n) / 2 - total_measures_count = (steps**2 + steps) / 2 + volume = self.player.audio_get_volume() - measures_to_reduce_by = 0 - - for i in range(1, steps + 1): - measures_to_reduce_by += i - volume_factor = 1 - (measures_to_reduce_by / total_measures_count) - self.player.audio_set_volume(int(original_volume * volume_factor)) - sleep(sleep_time) + 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.player.stop() log.debug(f"Releasing player {self.player=}") @@ -65,7 +60,7 @@ class Music: self.player = None self.max_volume = Config.VOLUME_VLC_DEFAULT - def fade(self) -> None: + def fade(self, fade_seconds: int = Config.FADEOUT_SECONDS) -> None: """ Fade the currently playing track. @@ -86,7 +81,7 @@ class Music: self.player = None pool = QThreadPool.globalInstance() - fader = FadeTrack(p) + fader = FadeTrack(p, fade_seconds=fade_seconds) pool.start(fader) def get_position(self) -> Optional[float]: