app/ = /opt/callrec (Node-Backend, Vite-Frontend, Python-Inferenz, Audio-Skripte, rkllm_server.cpp), system/ = systemd-Units, WirePlumber/PipeWire-Drop-ins, sudoers. Modelle, Binaries, Aufnahmen und node_modules bleiben draussen (.gitignore). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
23 lines
1.3 KiB
Bash
23 lines
1.3 KiB
Bash
#!/bin/bash
|
|
# Aime call bridge: PC(UAC2) <-> BT headset (HFP). Staggered start (A then B)
|
|
# — firing both loopbacks simultaneously starves the single SCO clock (TX=0).
|
|
export XDG_RUNTIME_DIR=/run/user/1000
|
|
uac_src=$(pactl list short sources | awk "/alsa_input.platform-fc000000.usb/{print \$2; exit}")
|
|
uac_sink=$(pactl list short sinks | awk "/alsa_output.platform-fc000000.usb/{print \$2; exit}")
|
|
bt_sink=$(pactl list short sinks | awk "/bluez_output/{print \$2; exit}")
|
|
bt_src=$(pactl list short sources | awk "/bluez_input/{print \$2; exit}")
|
|
echo "uac_src=$uac_src bt_sink=$bt_sink bt_src=$bt_src uac_sink=$uac_sink"
|
|
[ -z "$bt_sink" ] && { echo "!! no bluez_output (headset off)"; exit 2; }
|
|
pkill -f "pw-loopback.*aime" 2>/dev/null; sleep 1
|
|
# A: PC far-end -> headset speaker (start FIRST, let SCO TX establish)
|
|
setsid pw-loopback --name aime-A \
|
|
--capture-props="target.object=\"$uac_src\" node.name=aime-A-cap" \
|
|
--playback-props="target.object=\"$bt_sink\" node.name=aime-A-play" >/dev/null 2>&1 < /dev/null &
|
|
sleep 3
|
|
# B: headset mic -> PC (add AFTER A is pumping)
|
|
setsid pw-loopback --name aime-B \
|
|
--capture-props="target.object=\"$bt_src\" node.name=aime-B-cap" \
|
|
--playback-props="target.object=\"$uac_sink\" node.name=aime-B-play" >/dev/null 2>&1 < /dev/null &
|
|
sleep 2
|
|
echo "bridges up:"; pgrep -af "pw-loopback.*aime-"|grep -oE "aime-[AB]"|sort -u
|