lcpz / lain

Awesome WM complements

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

add support for pipewire in volume widget

basiliscos opened this issue · comments

pipewire has pulse simulation layer via pipewire-pulse program, but, unfortunately pacmd reports:

pacmd  
No PulseAudio daemon running, or not running as session daemon.

while pactl works fine:

Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 78
Tile Size: 65472
User Name: b
Host Name: xps
Server Name: PulseAudio (on PipeWire 0.3.63)
Server Version: 15.0.0
Default Sample Specification: float32le 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.pci-0000_00_1f.3-platform-sof_sdw.HiFi__hw_sofsoundwire_2__sink
Default Source: alsa_input.pci-0000_00_1f.3-platform-sof_sdw.HiFi__hw_sofsoundwire_4__source
Cookie: bb84:54d8

This was proposed as a separate widget in #534, which resulted in a simple watch recipe: awesomeWM/awesome-www#167

Does that satisfy your use case?

I think it does. Closing for inactivity. Feel free to comment back if you want to resume the conversation.

Hi, thank you for the advice. It would be nice to have something like that integrated into lain to let it work transparently, independently from puplse/pipewire.

Here is my custom widget, which might be useful for somebody

-- pipewire
local volume = wibox.widget{
    markup = '[?]',
    align  = 'center',
    valign = 'center',
    widget = wibox.widget.textbox
}
local volume_update = function()
    local cmd = [[pactl get-sink-volume @DEFAULT_SINK@ | cut -s -d/ -f2,4; pactl get-sink-mute @DEFAULT_SINK@]]
    awful.spawn.easy_async_with_shell(cmd, function(stdout, stderr, reason, exit_code)
        local values = {}
        for v in stdout:gmatch("(%d+%%)") do table.insert(values, v) end
        local value = "N/A";
        if ((#values == 2) and (values[1] == values[2])) then value = values[1] end
        if (#values == 1) then value = values[1] end
        local muted = string.find(stdout, "Mute: yes")
        local color = muted and '#FF0000' or '#00FFFF'
        volume.markup = string.format("[%s] ", markup.fg.color(color, value))
    end)
end
local volume_timer = gears.timer {
    timeout   = 5,
    call_now  = true,
    autostart = true,
    callback  = volume_update
}

Thank you for sharing your custom recipe.

It would be nice to have something like that integrated into lain to let it work transparently, independently from puplse/pipewire.

To satisfy your request, we could simply add a check, and then switch between the standard widget, or a variant similar to your recipe.

But this would create a catch-them-all approach, which goes against the simplicity principle I try to follow.

This is the rationale behind removing some lain widgets in favor of recipes, which are more maintainable.

My suggestion: if you have to switch between pulse and pipewire, then it's easy to implement the logic above in your configurations.

Otherwise, just use the widget you need.

commented

I also tried a "pipewire bar" widget like the alsabar and pulsebar here.