lcpz / lain

Awesome WM complements
GNU General Public License v2.0
1.05k stars 212 forks source link

add support for pipewire in volume widget #543

Closed basiliscos closed 1 year ago

basiliscos commented 1 year ago

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
lcpz commented 1 year ago

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

Does that satisfy your use case?

lcpz commented 1 year ago

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

basiliscos commented 1 year ago

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
}
lcpz commented 1 year ago

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.

Universebenzene commented 1 year ago

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