4.7 KiB
Executable File
Usage
Description
Shows and controls PulseAudio volume.
local volume = lain.widget.pulseaudio()
Input table
| Variable | Meaning | Type | Default |
|---|---|---|---|
timeout |
Refresh timeout seconds | number | 5 |
| `devicetype | PulseAudio device type | string ("sink", "source") | "sink" |
cmd |
PulseAudio command | string | link |
scallback |
PulseAudio sink callback | function | nil |
settings |
User settings | function | empty function |
cmd catch infos from current default sink. You can redefine it, being sure that the ouput is something like this:
* index: 0
volume: front-left: 18340 / 28% / -33.18 dB, front-right: 18340 / 28% / -33.18 dB
muted: no
device.string = "front:1"
Note: you can set PulseAudio default sink like this: pacmd set-default-sink #sink.
If sed doesn't work, you can try with grep:
pacmd list-sinks | grep -e $(pactl info | grep -e 'ink' | cut -d' ' -f3) -e 'volume: front' -e 'muted'
scallback is a callback function to update cmd, in case you switch between audio channels and therefore PulseAudio sink changes. If default cmd works for you, you can tell scallback to work in the same way:
scallback = function()
devicetype = "sink"
return "pacmd list-" .. devicetype .. "s | sed -n -e '0,/*/d' -e '/base volume/d' -e '/volume:/p' -e '/muted:/p' -e '/device\\.string/p'"
end
settings variables
settings can use the following variables:
| Variable | Meaning | Type | Values |
|---|---|---|---|
volume_now.index |
Sink index | string | >= "0" |
volume_now.sink |
Sink name | string | sink name or "N/A" |
volume_now.muted |
Sink mute status | string | "yes", "no", "N/A" |
volume_now.channel |
Sink channels | table of string integers | volume_now.channel[i], where i >= 1 |
volume_now.left |
Front left level | string | "0"-"100" |
volume_now.right |
Front right level | string | "0"-"100" |
volume_now.channel is a table of your pulseaudio sink channels. Fetch a channel level like this: volume_now.channel[i], where i >= 1.
volume_now.{left,right} are pointers for volume_now.{channel[1], channel[2]} (stereo).
Output table
| Variable | Meaning | Type |
|---|---|---|
widget |
The widget | wibox.widget.textbox |
update |
Update widget |
function |
Buttons
If you want buttons, just add the following after your widget in rc.lua.
volume.widget:buttons(awful.util.table.join(
awful.button({}, 1, function() -- left click
awful.spawn("pavucontrol")
end),
awful.button({}, 2, function() -- middle click
awful.spawn(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.button({}, 3, function() -- right click
awful.spawn(string.format("pactl set-sink-mute %d toggle", volume.sink))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
awful.spawn(string.format("pactl set-sink-volume %d +1%%", volume.sink))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
awful.spawn(string.format("pactl set-sink-volume %d -1%%", volume.sink))
volume.update()
end)
))
Keybindings
You can control the widget with key bindings like these:
-- PulseAudio volume control
awful.key({ altkey }, "Up",
function ()
os.execute(string.format("pactl set-sink-volume %d +1%%", volumewidget.sink))
volume.update()
end),
awful.key({ altkey }, "Down",
function ()
os.execute(string.format("pactl set-sink-volume %d -1%%", volumewidget.sink))
volume.update()
end),
awful.key({ altkey }, "m",
function ()
os.execute(string.format("pactl set-sink-mute %d toggle", volumewidget.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "m",
function ()
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "0",
function ()
os.execute(string.format("pactl set-sink-volume %d 0%%", volume.sink))
volume.update()
end),
where altkey = "Mod1".
Example
-- PulseAudio volume (based on multicolor theme)
local volume = lain.widget.pulseaudio({
settings = function()
vlevel = volume_now.left .. "-" .. volume_now.right .. "% | " .. volume_now.sink
if volume_now.muted == "yes" then
vlevel = vlevel .. " M"
end
widget:set_markup(lain.util.markup("#7493d2", vlevel))
end
})