#!/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