From f44e93f25eb132244714465a41bcc2729d3ffd00 Mon Sep 17 00:00:00 2001 From: Matthias Blankertz Date: Tue, 23 Dec 2025 13:56:07 +0100 Subject: [PATCH] feat: Allow limiting max. volume Signed-off-by: Matthias Blankertz --- software/frontend/index.html | 6 +++++- software/src/app.py | 11 +++++++---- software/src/utils/config.py | 6 +++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/software/frontend/index.html b/software/frontend/index.html index 2f87fb7..859c932 100644 --- a/software/frontend/index.html +++ b/software/frontend/index.html @@ -354,7 +354,8 @@ 'root.BUTTON_MAP.PLAY_PAUSE': 'Play/Pause', 'root.TAG_TIMEOUT_SECS': 'Tag removal timeout (seconds)', 'root.TAGMODE': 'Tag mode', - 'root.LED_COUNT': 'Length of WS2182 (Neopixel) LED chain' + 'root.LED_COUNT': 'Length of WS2182 (Neopixel) LED chain', + 'root.VOLUME_MAX': 'Maximum volume (0-255)' }; const config_input_override = { 'root.TAGMODE': { @@ -393,6 +394,9 @@ }, 'root.WLAN.PASSPHRASE': { 'input-type': 'text' + }, + 'root.VOLUME_MAX': { + 'input-type': 'number' } }; diff --git a/software/src/app.py b/software/src/app.py index 71bb1d4..386c18e 100644 --- a/software/src/app.py +++ b/software/src/app.py @@ -9,8 +9,8 @@ from utils import TimerManager Dependencies = namedtuple('Dependencies', ('mp3player', 'nfcreader', 'buttons', 'playlistdb', 'hwconfig', 'leds', 'config')) -# Should be ~ 6dB steps -VOLUME_CURVE = [1, 2, 4, 8, 16, 32, 63, 126, 251] +# Should be ~ 3dB steps +VOLUME_CURVE = [1, 2, 3, 4, 6, 8, 11, 16, 23, 32, 45, 64, 91, 128, 181, 255] class PlayerApp: @@ -52,6 +52,7 @@ class PlayerApp: self.hwconfig = deps.hwconfig(self) self.leds = deps.leds(self) self.tag_mode = self.config.get_tagmode() + self.volume_max = self.config.get_volume_max() self.playing_tag = None self.playlist = None self.buttons = deps.buttons(self) if deps.buttons is not None else None @@ -91,8 +92,10 @@ class PlayerApp: def onButtonPressed(self, what): assert self.buttons is not None if what == self.buttons.VOLUP: - self.volume_pos = min(self.volume_pos + 1, len(VOLUME_CURVE) - 1) - self.player.set_volume(VOLUME_CURVE[self.volume_pos]) + new_volume = min(self.volume_pos + 1, len(VOLUME_CURVE) - 1) + if VOLUME_CURVE[new_volume] <= self.volume_max: + self.volume_pos = new_volume + self.player.set_volume(VOLUME_CURVE[self.volume_pos]) elif what == self.buttons.VOLDOWN: self.volume_pos = max(self.volume_pos - 1, 0) self.player.set_volume(VOLUME_CURVE[self.volume_pos]) diff --git a/software/src/utils/config.py b/software/src/utils/config.py index f5891b6..bb83398 100644 --- a/software/src/utils/config.py +++ b/software/src/utils/config.py @@ -26,7 +26,8 @@ class Configuration: 'WIFI': { 'SSID': '', 'PASSPHRASE': '', - } + }, + 'VOLUME_MAX': 255 } def __init__(self, config_path='/config.json'): @@ -97,6 +98,9 @@ class Configuration: def get_wifi_passphrase(self) -> str: return self._get('WIFI')['PASSPHRASE'] + def get_volume_max(self) -> int: + return self._get('VOLUME_MAX') + # For the web API def get_config(self) -> Mapping[str, Any]: return self.config