summary refs log tree commit diff
path: root/bin/pwloop
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2022-11-18 18:07:38 +0100
committerRobert Günzler <r@gnzler.io>2022-11-18 18:38:21 +0100
commitf005fbf41646437964458d4c2028e6fdc04b59a1 (patch)
tree2db56c1d202137278c5642ed418123b882d35dc5 /bin/pwloop
parent5e6e8da510836bbb0c7ac1602d51a394ba02ab2b (diff)
bin: add a few scripts
Diffstat (limited to 'bin/pwloop')
-rwxr-xr-xbin/pwloop43
1 files changed, 43 insertions, 0 deletions
diff --git a/bin/pwloop b/bin/pwloop
new file mode 100755
index 0000000..866b9e9
--- /dev/null
+++ b/bin/pwloop
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+if [ "$1" = "-h" ]; then
+	echo "usage: pwloop SOURCE TARGET [VOLUME]" >&2
+	exit 1
+fi
+
+source_name=$1
+target_name=$2
+
+volume=0.2
+[ -n "$3" ] && volume=$3
+
+# spawn pwloopback
+pw-loopback \
+	-m '[[FL FR]]' \
+	-g 'pwloop' \
+	--capture-props='media.class=Audio/Sink/Virtual audio.position=[FL FR] node.description="pwloop sink" node.name=pwloop' \
+	--playback-props='media.class=Audio/Source/Virtual audio.position=[FL FR] node.description="pwloop source" node.name=pwloop' \
+	&
+
+# save pid for later
+pwloop_pid=$!
+trap '{ kill $pwloop_pid; }' EXIT
+
+set -x
+
+# set monitor volume prop
+pw-cli set-param "$pwloop_oid" 2 "{ \"monitorVolumes\": [$volume, $volume] }"
+
+# connect ports to pwloop
+pw-link "$(pw-link -o | grep "$source_name" | grep 'FL$')" pwloop:input_FL
+pw-link "$(pw-link -o | grep "$source_name" | grep 'FR$')" pwloop:input_FR
+
+# connect ports from pwloop
+pw-link pwloop:capture_FL "$(pw-link -i | grep "$target_name" | grep -v monitor | grep 'FL$')"
+pw-link pwloop:capture_FR "$(pw-link -i | grep "$target_name" | grep -v monitor | grep 'FR$')"
+
+# get object.id
+pwloop_oid=$(pw-dump | jq -r --arg name "pwloop" --arg s "Audio/Sink/Virtual" \
+	'.[]|select(.type=="PipeWire:Interface:Node" and .info.props["node.name"]==$name and .info.props["media.class"]==$s)|.info.props["object.id"]')
+
+wait