neodotfiles/.config/awesome/lain/wiki/pulse.md
Clay Gomera 84a27f2f7f updated
2022-01-13 23:48:37 -04:00

4.1 KiB
Executable file

Usage

Read here.

Description

Shows and controls PulseAudio volume.

local volume = lain.widget.pulse()

Input table

Variable Meaning Type Default
timeout Refresh timeout (in seconds) integer 5
devicetype PulseAudio device type string ("sink", "source") "sink"
cmd PulseAudio command string or function see here
settings User settings function empty function

cmd is a terminal command to catch infos from current default device. 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"

If your devices change dynamically, you can define it as a function which returns a command string.

If sed doesn't work, you can try with a grep variant:

cmd = "pacmd list-" .. pulse.devicetype .. "s | grep -e $(pactl info | grep -e 'ink' | cut -d' ' -f3) -e 'volume: front' -e 'muted'"

settings variables

settings can use the following variables:

Variable Meaning Type Values
volume_now.device Device name string device name or "N/A"
volume_now.index Device index string >= "0"
volume_now.muted Device mute status string "yes", "no", "N/A"
volume_now.channel Device channels table of string integers volume_now.channel[i], where i >= 1
volume_now.left Front left sink level or first source string "0"-"100"
volume_now.right Front right sink level or second source string "0"-"100"

volume_now.channel is a table of your PulseAudio devices. 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

volume.widget:buttons(awful.util.table.join(
    awful.button({}, 1, function() -- left click
        awful.spawn("pavucontrol")
    end),
    awful.button({}, 2, function() -- middle click
        os.execute(string.format("pactl set-sink-volume %d 100%%", volume.device))
        volume.update()
    end),
    awful.button({}, 3, function() -- right click
        os.execute(string.format("pactl set-sink-mute %d toggle", volume.device))
        volume.update()
    end),
    awful.button({}, 4, function() -- scroll up
        os.execute(string.format("pactl set-sink-volume %d +1%%", volume.device))
        volume.update()
    end),
    awful.button({}, 5, function() -- scroll down
        os.execute(string.format("pactl set-sink-volume %d -1%%", volume.device))
        volume.update()
    end)
))

Keybindings

-- PulseAudio volume control
awful.key({ altkey }, "Up",
    function ()
        os.execute(string.format("pactl set-sink-volume %d +1%%", volume.device))
        volume.update()
    end),
awful.key({ altkey }, "Down",
    function ()
        os.execute(string.format("pactl set-sink-volume %d -1%%", volume.device))
        volume.update()
    end),
awful.key({ altkey }, "m",
    function ()
        os.execute(string.format("pactl set-sink-mute %d toggle", volume.device))
        volume.update()
    end),
awful.key({ altkey, "Control" }, "m",
    function ()
        os.execute(string.format("pactl set-sink-volume %d 100%%", volume.device))
        volume.update()
    end),
awful.key({ altkey, "Control" }, "0",
    function ()
        os.execute(string.format("pactl set-sink-volume %d 0%%", volume.device))
        volume.update()
    end),

where altkey = "Mod1".

Example

-- PulseAudio volume (based on multicolor theme)
local volume = lain.widget.pulse {
    settings = function()
        vlevel = volume_now.left .. "-" .. volume_now.right .. "% | " .. volume_now.device
        if volume_now.muted == "yes" then
            vlevel = vlevel .. " M"
        end
        widget:set_markup(lain.util.markup("#7493d2", vlevel))
    end
}