diff --git a/addon/globalPlugins/voicemeeter/__init__.py b/addon/globalPlugins/voicemeeter/__init__.py index 7d4eed7..dec9c1b 100644 --- a/addon/globalPlugins/voicemeeter/__init__.py +++ b/addon/globalPlugins/voicemeeter/__init__.py @@ -1,63 +1,16 @@ -import json import time -from pathlib import Path import globalPluginHandler -from logHandler import log +from . import config, util from .commands import CommandsMixin from .controller import Controller from .kinds import KindId, request_kind_map -def _make_gestures(): - defaults = { - "kb:NVDA+alt+s": "strip_mode", - "kb:NVDA+alt+b": "bus_mode", - "kb:NVDA+alt+g": "slider_mode", # Gate - "kb:NVDA+alt+c": "slider_mode", # Comp - "kb:NVDA+alt+t": "slider_mode", # Gate - "kb:NVDA+alt+d": "slider_mode", # Denoiser - "kb:NVDA+alt+a": "slider_mode", # Audibility - "kb:NVDA+shift+q": "announce_controller", - "kb:NVDA+shift+a": "announce_voicemeeter_version", - "kb:NVDA+shift+o": "toggle_mono", - "kb:NVDA+shift+s": "toggle_solo", - "kb:NVDA+shift+m": "toggle_mute", - "kb:NVDA+shift+c": "toggle_mc", - "kb:NVDA+shift+k": "karaoke", - "kb:NVDA+shift+upArrow": "slider_increase", - "kb:NVDA+shift+downArrow": "slider_decrease", - "kb:NVDA+shift+alt+upArrow": "slider_increase", - "kb:NVDA+shift+alt+downArrow": "slider_decrease", - "kb:NVDA+shift+control+upArrow": "slider_increase", - "kb:NVDA+shift+control+downArrow": "slider_decrease", - } - - overrides = None - pn = Path.home() / "Documents" / "Voicemeeter" / "keybinds.json" - if pn.exists(): - with open(pn, "r") as f: - data = json.load(f) - overrides = {f"kb:{v}": k for k, v in data.items()} - log.info("INFO - loading settings from keybinds.json") - if overrides: - return {**defaults, **overrides} - return defaults - - -def _get_kind_id(): - pn = Path.home() / "Documents" / "Voicemeeter" / "settings.json" - if pn.exists(): - with open(pn, "r") as f: - data = json.load(f) - return data["voicemeeter"] - return "potato" - - class GlobalPlugin(globalPluginHandler.GlobalPlugin, CommandsMixin): - __gestures = _make_gestures() - __kind_id = _get_kind_id() + __kind_id = config.get("voicemeeter", "potato") + __gestures = util._make_gestures(__kind_id) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -65,12 +18,7 @@ class GlobalPlugin(globalPluginHandler.GlobalPlugin, CommandsMixin): if self.controller.login() == 1: self.controller.run_voicemeeter(KindId[self.__kind_id.upper()]) time.sleep(1) - self.kind = request_kind_map(self.controller.kind_id) - - for i in range(1, self.kind.num_strip + 1): - self.bindGesture(f"kb:NVDA+alt+{i}", "index") - for i in range(1, self.kind.phys_out + self.kind.virt_out + 1): - self.bindGesture(f"kb:NVDA+shift+{i}", "bus_assignment") + self.kind = request_kind_map(self.__kind_id) def terminate(self, *args, **kwargs): super().terminate(*args, **kwargs) diff --git a/addon/globalPlugins/voicemeeter/commands.py b/addon/globalPlugins/voicemeeter/commands.py index 91e97c5..dbde818 100644 --- a/addon/globalPlugins/voicemeeter/commands.py +++ b/addon/globalPlugins/voicemeeter/commands.py @@ -1,7 +1,7 @@ import ui from logHandler import log -from . import context, util +from . import context class CommandsMixin: @@ -37,18 +37,24 @@ class CommandsMixin: ui.message(f"Controller for {self.controller.ctx.strategy} {self.controller.ctx.index + 1}") log.info(f"INFO - {self.controller.ctx.strategy} {self.controller.ctx.index} mode") - def script_slider_mode(self, gesture): - if gesture.displayName.endswith("g"): - self.controller.ctx.slider_mode = "gain" - elif gesture.displayName.endswith("c"): - self.controller.ctx.slider_mode = "comp" - elif gesture.displayName.endswith("t"): - self.controller.ctx.slider_mode = "gate" - elif gesture.displayName.endswith("d"): - self.controller.ctx.slider_mode = "denoiser" - elif gesture.displayName.endswith("a"): - self.controller.ctx.slider_mode = "audibility" - ui.message(f"{self.controller.ctx.slider_mode} mode enabled") + def __set_slider_mode(self, mode): + self.controller.ctx.slider_mode = mode + ui.message(f"{mode} mode enabled") + + def script_gain_mode(self, _): + self.__set_slider_mode("gain") + + def script_comp_mode(self, _): + self.__set_slider_mode("comp") + + def script_gate_mode(self, _): + self.__set_slider_mode("gate") + + def script_denoiser_mode(self, _): + self.__set_slider_mode("denoiser") + + def script_audibility_mode(self, _): + self.__set_slider_mode("audibility") ### BOOLEAN PARAMETERS ### @@ -89,28 +95,34 @@ class CommandsMixin: self.controller.ctx.set_bool(output, val) ui.message("on" if val else "off") - ### SLIDER MODES ### + ### CONTROL SLIDERS ### - def script_slider_increase(self, gesture): - op = util.remove_prefix(gesture.displayName, "kb:NVDA+shift+") - if op.startswith("alt"): - offset = 0.1 - elif op.startswith("ctrl"): - offset = 3 - else: - offset = 1 - val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) + offset + def script_slider_increase_by_point_one(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) + 0.1 self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) ui.message(str(round(val, 1))) - def script_slider_decrease(self, gesture): - op = util.remove_prefix(gesture.displayName, "kb:NVDA+shift+") - if op.startswith("alt"): - offset = 0.1 - elif op.startswith("ctrl"): - offset = 3 - else: - offset = 1 - val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) - offset + def script_slider_decrease_by_point_one(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) - 0.1 + self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) + ui.message(str(round(val, 1))) + + def script_slider_increase_by_one(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) + 1 + self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) + ui.message(str(round(val, 1))) + + def script_slider_decrease_by_one(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) - 1 + self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) + ui.message(str(round(val, 1))) + + def script_slider_increase_by_three(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) + 3 + self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) + ui.message(str(round(val, 1))) + + def script_slider_decrease_by_three(self, gesture): + val = self.controller.ctx.get_float(self.controller.ctx.slider_mode) - 3 self.controller.ctx.set_float(self.controller.ctx.slider_mode, val) ui.message(str(round(val, 1))) diff --git a/addon/globalPlugins/voicemeeter/config.py b/addon/globalPlugins/voicemeeter/config.py new file mode 100644 index 0000000..4398088 --- /dev/null +++ b/addon/globalPlugins/voicemeeter/config.py @@ -0,0 +1,20 @@ +import json +from pathlib import Path + + +def config_from_json(): + pn = Path.home() / "Documents" / "Voicemeeter" / "nvda_settings.json" + data = None + if pn.exists(): + with open(pn, "r") as f: + data = json.load(f) + return data or {} + + +__config = config_from_json() + + +def get(name, default=None): + if name in __config: + return __config[name] + return default diff --git a/addon/globalPlugins/voicemeeter/util.py b/addon/globalPlugins/voicemeeter/util.py index babf666..51aae6e 100644 --- a/addon/globalPlugins/voicemeeter/util.py +++ b/addon/globalPlugins/voicemeeter/util.py @@ -1,3 +1,7 @@ +from . import config, util +from .kinds import request_kind_map + + def remove_prefix(input_string, prefix): if prefix and input_string.startswith(prefix): return input_string[len(prefix) :] @@ -8,3 +12,40 @@ def remove_suffix(input_string, suffix): if suffix and input_string.endswith(suffix): return input_string[: -len(suffix)] return input_string + + +def _make_gestures(kind_id): + kind = request_kind_map(kind_id) + defaults = { + "kb:NVDA+alt+s": "strip_mode", + "kb:NVDA+alt+b": "bus_mode", + "kb:NVDA+alt+g": "gain_mode", + "kb:NVDA+alt+c": "comp_mode", + "kb:NVDA+alt+t": "gate_mode", + "kb:NVDA+alt+d": "denoiser_mode", + "kb:NVDA+alt+a": "audibility_mode", + "kb:NVDA+shift+q": "announce_controller", + "kb:NVDA+shift+v": "announce_voicemeeter_version", + "kb:NVDA+shift+o": "toggle_mono", + "kb:NVDA+shift+s": "toggle_solo", + "kb:NVDA+shift+m": "toggle_mute", + "kb:NVDA+shift+c": "toggle_mc", + "kb:NVDA+shift+k": "karaoke", + "kb:NVDA+shift+upArrow": "slider_increase_by_point_one", + "kb:NVDA+shift+downArrow": "slider_decrease_by_point_one", + "kb:NVDA+shift+alt+upArrow": "slider_increase_by_one", + "kb:NVDA+shift+alt+downArrow": "slider_decrease_by_one", + "kb:NVDA+shift+control+upArrow": "slider_increase_by_three", + "kb:NVDA+shift+control+downArrow": "slider_decrease_by_three", + } + for i in range(1, kind.num_strip + 1): + defaults[f"kb:NVDA+alt+{i}"] = "index" + for i in range(1, kind.phys_out + kind.virt_out + 1): + defaults[f"kb:NVDA+alt+{i}"] = "bus_assignment" + abc = config.get("keybinds") + if abc: + overrides = {f"kb:{util.remove_prefix(k, 'kb:')}": v for k, v in abc.items()} + matching_values = set(defaults.values()).intersection(set(overrides.values())) + defaults = {k: v for k, v in defaults.items() if v not in matching_values} + return {**defaults, **overrides} + return defaults diff --git a/build.ps1 b/build.ps1 index 4d1642a..21f6d02 100644 --- a/build.ps1 +++ b/build.ps1 @@ -5,7 +5,7 @@ param( function Copy-FilestoScratchpad { $source = Join-Path $PSScriptRoot "addon" "globalPlugins" "voicemeeter" $target = Join-Path $env:appdata "nvda" "scratchpad" "globalPlugins" "voicemeeter" - Robocopy $source $target /MIR /NFL /NDL /NJH /NJS /nc /ns /np + Robocopy $source $target | Out-Null } function main {