summary refs log tree commit diff
path: root/bin/pwloop
blob: 866b9e91b651a6bcd7d928d6960c8e8d53d75cf7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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