diff --git a/hosts/common/programs/mpv/default.nix b/hosts/common/programs/mpv/default.nix index 8b870779..a2af4612 100644 --- a/hosts/common/programs/mpv/default.nix +++ b/hosts/common/programs/mpv/default.nix @@ -96,7 +96,9 @@ let ### is hard to adjust while screen is on. ### note that only under alsa (`-ao=alsa`) does `ao-volume` actually correspond to system volume. substituteInPlace src/uosc/main.lua \ - --replace-fail "mp.observe_property('volume'" "mp.observe_property('ao-volume'" + --replace-fail \ + "mp.observe_property('volume', 'number', create_state_setter('volume'))" \ + "mp.observe_property('volume', 'number', update_ao_volume)" substituteInPlace src/uosc/elements/Volume.lua \ --replace-fail "mp.commandv('set', 'volume'" "mp.commandv('set', 'ao-volume'" \ --replace-fail "mp.set_property_native('volume'" "mp.set_property('ao-volume'" @@ -107,14 +109,20 @@ let # in the meantime, just query the volume every tick (i.e. frame). # alternative is mpv's JSON IPC feature, where i could notify its socket whenever pipewire volume changes. cat <> src/uosc/main.lua - function update_ao_volume() - local vol = mp.get_property('ao-volume') - if vol ~= nil then + function update_ao_volume(_, vol) + if vol == nil then + -- vol will be nil if called manually, instead of via observe_property + vol = mp.get_property('ao-volume') + end + if vol == nil then + vol = 0 + else vol = tonumber(vol) - if vol ~= state.volume then - set_state('volume', vol) - request_render() - end + end + + if vol ~= state.volume then + set_state('volume', vol) + request_render() end end -- tick seems to occur on every redraw (even when volume is hidden). @@ -124,9 +132,6 @@ let mp.add_periodic_timer(2, update_ao_volume) -- invoke immediately to ensure state.volume is non-nil update_ao_volume() - if state.volume == nil then - state.volume = 0 - end EOF ''; });