diff options
| author | Robert Günzler <r@gnzler.io> | 2026-04-08 13:26:13 +0900 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-04-08 13:26:13 +0900 |
| commit | 4e34cbf9673aeaba252e01df554a0d204e83c5e2 (patch) | |
| tree | f3eea07d0e2bf1628ce19987c5164577f63ac614 /.config/mpv/mvi/scripts/equalizer.lua | |
| parent | 28db7c76e26c312918959384e02e433f8858de49 (diff) | |
Automated-commit-by: dots Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '.config/mpv/mvi/scripts/equalizer.lua')
| -rw-r--r-- | .config/mpv/mvi/scripts/equalizer.lua | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/.config/mpv/mvi/scripts/equalizer.lua b/.config/mpv/mvi/scripts/equalizer.lua new file mode 100644 index 0000000..f7a50ab --- /dev/null +++ b/.config/mpv/mvi/scripts/equalizer.lua @@ -0,0 +1,176 @@ +local opts = { + bars = 'brightness,contrast,gamma,saturation,hue', + draw_icons = true, +} + +local msg = require 'mp.msg' +local assdraw = require 'mp.assdraw' +local options = require 'mp.options' +local utils = require 'mp.utils' + +options.read_options(opts, nil, function(c) +end) + +local enabled = false +local active_bars = {} +local bar_being_dragged = nil +local stale = false + +function split_comma(input) + local ret = {} + for str in string.gmatch(input, "([^,]+)") do + ret[#ret + 1] = str + end + return ret +end + +function get_position_normalized(x, y, bar) + return (x - bar.x) / bar.w, (y - bar.y) / bar.h +end + +function handle_mouse_move() + if not bar_being_dragged then return end + local bar = bar_being_dragged + local mx, my = mp.get_mouse_pos() + local nx, _ = get_position_normalized(mx, my, bar) + nx = math.max(0, math.min(nx, 1)) + local val = math.floor(nx * (bar.max_value - bar.min_value) + bar.min_value + 0.5) + mp.set_property_number(bar.property, val) + -- the observe_property call will take care of setting the value +end + +function handle_mouse_left(table) + if table["event"] == "down" then + local mx, my = mp.get_mouse_pos() + for _, bar in ipairs(active_bars) do + local nx, ny = get_position_normalized(mx, my, bar) + if nx >= 0 and ny >= 0 and nx <= 1 and ny <= 1 then + bar_being_dragged = bar + local val = math.floor(nx * (bar.max_value - bar.min_value) + bar.min_value + 0.5) + mp.set_property_number(bar.property, val) + mp.add_forced_key_binding("mouse_move", "mouse_move", handle_mouse_move) + break + end + end + elseif table["event"] == "up" then + mp.remove_key_binding("mouse_move") + bar_being_dragged = nil + end +end + +function property_changed(prop, val) + for _, bar in ipairs(active_bars) do + if bar.property == prop then + bar.value = val + stale = true + break + end + end +end + +function idle_handler() + if not stale then return end + stale = false + local a = assdraw.ass_new() + a:new_event() + a:append(string.format('{\\an0\\bord2\\shad0\\1a&00&\\1c&%s&}', '888888')) + a:pos(0, 0) + a:draw_start() + for _, bar in ipairs(active_bars) do + a:rect_cw(bar.x, bar.y, bar.x + bar.w, bar.y + bar.h) + end + a:new_event() + a:append(string.format('{\\an0\\bord2\\shad0\\1a&00&\\1c&%s&}', 'dddddd')) + a:pos(0, 0) + a:draw_start() + for _, bar in ipairs(active_bars) do + if bar.value > bar.min_value then + local val_norm = (bar.value - bar.min_value) / (bar.max_value - bar.min_value) + a:rect_cw(bar.x, bar.y, bar.x + val_norm * bar.w, bar.y + bar.h) + end + end + for _, bar in ipairs(active_bars) do + a:new_event() + a:append("{\\an6\\fs40\\bord2}") + a:pos(bar.x - 8, bar.y + bar.h/2 - 2) + a:append(bar.property:sub(1,1):upper() .. bar.property:sub(2,-1)) + end + local ww, wh = mp.get_osd_size() + mp.set_osd_ass(ww, wh, a.text) +end + +function fix_position() + local ww, wh = mp.get_osd_size() + for i, bar in ipairs(active_bars) do + bar.x = ww / 5 + bar.y = wh / 2 + i * 50 + bar.w = ww - 2 * (ww / 5) + bar.h = 30 + end +end + +function dimensions_changed() + stale = true + fix_position() +end + +function enable() + if enabled then return end + enabled = true + mp.add_forced_key_binding("MBTN_LEFT", "mouse_left", handle_mouse_left, {complex=true}) + for i, prop in ipairs(split_comma(opts.bars)) do + local prop_info = mp.get_property_native("option-info/" .. prop) + if not prop_info then + msg.warn("Property \'" .. prop .. "\' does not exist") + elseif not prop_info.type == 'Integer' then + msg.warn("Property \'" .. prop .. "\' is not an integer") + else + mp.observe_property(prop, 'native', property_changed) + active_bars[#active_bars + 1] = { + property = prop, + value = mp.get_property_number(prop), + min_value = prop_info.min, + max_value = prop_info.max, + } + end + end + stale = true + fix_position() + mp.observe_property("osd-dimensions", "native", dimensions_changed) + mp.register_idle(idle_handler) +end + +function disable() + if not enabled then return end + enabled = false + active_bars = {} + bar_being_dragged = nil + mp.remove_key_binding("mouse_left") + mp.remove_key_binding("mouse_move") + mp.unobserve_property(property_changed) + mp.unobserve_property(dimensions_changed) + mp.unregister_idle(idle_handler) + mp.set_osd_ass(1280, 720, "") +end + +function toggle() + if enabled then + disable() + else + enable() + end +end + +function reset() + for _, prop in ipairs(split_comma(opts.bars)) do + local prop_info = mp.get_property_native("option-info/" .. prop) + if prop_info and prop_info["default-value"] then + mp.set_property(prop_info["name"], prop_info["default-value"]) + end + end +end + +mp.add_key_binding(nil, "equalizer-enable", enable) +mp.add_key_binding(nil, "equalizer-disable", disable) +mp.add_key_binding(nil, "equalizer-toggle", toggle) +mp.add_key_binding(nil, "equalizer-reset", reset) |