-
Notifications
You must be signed in to change notification settings - Fork 5
/
adevice-list.lua
144 lines (129 loc) · 5.17 KB
/
adevice-list.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
--[[
* adevice-list.lua v.2024-11-11
*
* AUTHORS: dyphire
* License: MIT
* link: https://github.com/dyphire/mpv-scripts
This script implements an interractive audio-device list
Usage: add bindings to input.conf
-- key script-message-to adevice_list toggle-adevice-browser
This script needs to be used with scroll-list.lua
https://github.com/CogentRedTester/mpv-scroll-list
]]
local mp = require 'mp'
local opts = require("mp.options")
local o = {
-- header of the list
-- %cursor% and %total% to be used to display the cursor position and the total number of lists
header = "Adevice List [%cursor%/%total%]\\N ------------------------------------",
--list ass style overrides inside curly brackets
--these styles will be used for the whole list. so you need to reset them for every line
--read http://docs.aegisub.org/3.2/ASS_Tags/ for reference of tags
global_style = [[]],
header_style = [[{\q2\fs30\c&00ccff&}]],
list_style = [[{\q2\fs20\c&Hffffff&}]],
wrapper_style = [[{\c&00ccff&\fs16}]],
cursor_style = [[{\c&00ccff&}]],
selected_style = [[{\c&Hfce788&}]],
active_style = [[{\c&H33ff66&}]],
cursor = [[➤\h]],
indent = [[\h\h\h]],
--amount of entries to show before slicing. Optimal value depends on font/video size etc.
num_entries = 16,
-- wrap the cursor around the top and bottom of the list
wrap = true,
-- set dynamic keybinds to bind when the list is open
key_move_begin = "HOME",
key_move_end = "END",
key_move_pageup = "PGUP",
key_move_pagedown = "PGDWN",
key_scroll_down = "DOWN WHEEL_DOWN",
key_scroll_up = "UP WHEEL_UP",
key_open_adevice = "ENTER MBTN_LEFT",
key_close_browser = "ESC MBTN_RIGHT",
}
opts.read_options(o)
--adding the source directory to the package path and loading the module
package.path = mp.command_native({"expand-path", "~~/script-modules/?.lua;"}) .. package.path
local list = require "scroll-list"
--modifying the list settings
list.header = o.header
list.cursor = o.cursor
list.indent = o.indent
list.wrap = o.wrap
list.num_entries = o.num_entries
list.global_style = o.global_style
list.header_style = o.header_style
list.list_style = o.list_style
list.wrapper_style = o.wrapper_style
list.cursor_style = o.cursor_style
list.selected_style = o.selected_style
--escape header specifies the format
--display the cursor position and the total number of lists in the header
function list:format_header_string(str)
if #list.list > 0 then
str = str:gsub("%%(%a+)%%", { cursor = list.selected, total = #list.list })
else str = str:gsub("%[.*%]", "") end
return str
end
--update the list when the current audio-device changes
local function adevice_list()
mp.observe_property('audio-device-list', 'native', function(_, adevice_list)
mp.observe_property('audio-device', 'string', function(_, current_device)
list.list = {}
if adevice_list == nil then
list:update()
return
end
if list.selected > 0 and string.find(adevice_list[list.selected].name, current_device) == nil then
list.selected = 0
end
for i = 1, #adevice_list do
local item = {}
if current_device ~= nil then
if adevice_list[i].name == current_device then
list.selected = i
end
end
if (i == list.selected) then
item.style = o.active_style
item.ass = "■ " .. list.ass_escape(adevice_list[i].description)
else
item.ass = "□ " .. list.ass_escape(adevice_list[i].description)
end
list.list[i] = item
end
list:update()
end)
end)
list:toggle()
end
--open to the selected audio-device
local function open_adevice()
local adevice_list = mp.get_property_native('audio-device-list', {})
if list.list[list.selected] then
mp.set_property("audio-device", adevice_list[list.selected].name)
end
end
--dynamic keybinds to bind when the list is open
list.keybinds = {}
local function add_keys(keys, name, fn, flags)
local i = 1
for key in keys:gmatch("%S+") do
table.insert(list.keybinds, { key, name .. i, fn, flags })
i = i + 1
end
end
add_keys(o.key_scroll_down, 'scroll_down', function() list:scroll_down() end, { repeatable = true })
add_keys(o.key_scroll_up, 'scroll_up', function() list:scroll_up() end, { repeatable = true })
add_keys(o.key_move_pageup, 'move_pageup', function() list:move_pageup() end, {})
add_keys(o.key_move_pagedown, 'move_pagedown', function() list:move_pagedown() end, {})
add_keys(o.key_move_begin, 'move_begin', function() list:move_begin() end, {})
add_keys(o.key_move_end, 'move_end', function() list:move_end() end, {})
add_keys(o.key_open_adevice, 'open_adevice', open_adevice, {})
add_keys(o.key_close_browser, 'close_browser', function() list:close() end, {})
mp.register_script_message("toggle-adevice-browser", adevice_list)
mp.register_event('end-file', function()
list:close()
mp.unobserve_property(adevice_list)
end)