aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PKGBUILD2
-rw-r--r--README.md14
-rwxr-xr-xswob.sh98
3 files changed, 99 insertions, 15 deletions
diff --git a/PKGBUILD b/PKGBUILD
index 5dd6348..6b06c54 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,6 +4,8 @@ pkgrel=1
pkgdesc='Volume and brightness controls for wayland, using wob'
arch=(any) # limited only by dependencies
depends=(sh coreutils sed wob alsa-utils brightnessctl)
+optdepends=( 'wireplumber: wpctl, for pipewire support'
+ 'libpulse: pactl, for pulseaudio support' )
url='https://git.sr.ht/~remph/swob'
license=(GPL-3.0-or-later)
provides=(swob)
diff --git a/README.md b/README.md
index 057c849..0c3831c 100644
--- a/README.md
+++ b/README.md
@@ -21,10 +21,20 @@ binary unnecessarily with every tap.
Dependencies
------------
-- POSIX sh, sed and mkfifo(1); non-POSIX mktemp(1) (all pretty universally available)
+- POSIX sh, sed and mkfifo(1); non-POSIX mktemp(1) (all pretty universally
+ available)
- [wob]
-- [amixer (from alsa-utils)](https://www.alsa-project.org)
- [brightnessctl](https://github.com/Hummer12007/brightnessctl)
+- For volume, at least one of:
+ - amixer, for [ALSA](https://www.alsa-project.org)
+ - [wireplumber and wpctl](https://pipewire.pages.freedesktop.org/wireplumber)
+ for pipewire
+ - pactl for [PulseAudio](https://www.freedesktop.org/wiki/Software/PulseAudio)
+ - As with anything pertaining to Poettering, pactl doesn't play nice,
+ so the pactl backend is the slowest of the three: requires three calls
+ to pactl and two to sed, compared with two calls to wpctl and one to
+ amixer (each with only one call to sed). It is generally recommended to
+ use one of the other two wherever possible
Installation
------------
diff --git a/swob.sh b/swob.sh
index 8993a07..49e7675 100755
--- a/swob.sh
+++ b/swob.sh
@@ -51,10 +51,74 @@ start_wob() {
} &
}
-do_cmd_get_percent() {
- case $1 in
- volume|vol)
- amixer sset Master "$2" | sed -E '
+glob_match() {
+ # MUST be called with set +f
+ test $# -gt 1 -o -e "$1"
+}
+
+select_audio() {
+ # could guess at /run/user/`id -u`, but let's not jump the gun here
+ sound_sys=$1 rundir=${2:-$XDG_RUNTIME_DIR} tool=$3
+ test -n "$rundir" &&
+ glob_match "$rundir/$sound_sys"* &&
+ command -v "$tool" >/dev/null 2>&1 &&
+ SWOB_AUDIO=$sound_sys
+}
+
+get_audio_type() {
+ # MUST be called with set +fu
+
+ case $SWOB_AUDIO in
+ pipewire|pulse|alsa) return ;;
+ '') ;;
+ *) echo >&2 "$0: warning: unrecognised SWOB_AUDIO: $SWOB_AUDIO" ;;
+ esac
+
+ select_audio pipewire "$PIPEWIRE_RUNTIME_DIR" wpctl && return
+ select_audio pulse "$PULSE_RUNTIME_PATH" pactl && return
+ SWOB_AUDIO=alsa # default to ALSA
+}
+
+set_vol() {
+ set +fu
+ get_audio_type
+ set -fu
+
+ case $SWOB_AUDIO in
+ pipewire)
+ case $1 in
+ toggle) to_set=mute ;;
+ *) to_set='volume -l 1.0' ;;
+ esac
+ wpctl set-$to_set @DEFAULT_AUDIO_SINK@ "$1"
+ wpctl get-volume @DEFAULT_AUDIO_SINK@ | sed -E \
+ -e 's/^Volume: ([0-9]+)\.([0-9][0-9])/\1\2/' \
+ -e 's/\[MUTED\]/mute/'
+ ;;
+
+ pulse)
+ case $1 in
+ toggle) to_set=mute ;;
+ *) to_set=volume ;;
+ esac
+ pactl set-sink-$to_set @DEFAULT_SINK@ "$(echo "$1" | sed -E 's/(.*)([+-])$/\2\1/')"
+ percent=`pactl get-sink-volume @DEFAULT_SINK@ | sed -En 's/.* ([0-9]+)%.*/\1/p'`
+ mute_cmd='pactl get-sink-mute @DEFAULT_SINK@'
+ mute_out=`$mute_cmd`
+ case $mute_out in
+ 'Mute: yes') muted=1 ;;
+ 'Mute: no') muted= ;;
+ *) echo >&2 "$0: warning: bad output from $mute_cmd: $mute_out" ;;
+ esac
+ echo "$percent ${muted:+mute}"
+ ;;
+
+ *)
+ if test "$SWOB_AUDIO" != alsa; then
+ echo >&2 "$0: WARNING: internal inconsistency! SWOB_AUDIO: \`$SWOB_AUDIO'"
+ fi
+
+ amixer sset Master "$1" | sed -E '
# Extract percentage, keep original line for later
h
s/.*\[([0-9]+)%\].*/\1/
@@ -72,15 +136,23 @@ x
}
# else
g
-s/$/ volume/
-' ;;
- brightness|brt)
- brightnessctl -m set "$2" | sed -En 's/(.*[^0-9])?([0-9]+)%.*/\2 brightness/p'
- ;;
- *)
- echo >&2 "$0: error: unrecognised argument: $target"
- exit -1
- ;;
+s/$/ volume/'
+ ;;
+ esac
+}
+
+do_cmd_get_percent() {
+ case $1 in
+ volume|vol)
+ set_vol "$2"
+ ;;
+ brightness|brt)
+ brightnessctl -m set "$2" | sed -En 's/(.*[^0-9])?([0-9]+)%.*/\2 brightness/p'
+ ;;
+ *)
+ echo >&2 "$0: error: unrecognised argument: $target"
+ exit -1
+ ;;
esac
}