feat: komplette Codebase vom Board ins Repo gespiegelt

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>
This commit is contained in:
Claude
2026-07-16 11:18:29 +02:00
parent 560622e125
commit f9e1eb82c4
61 changed files with 5546 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
#!/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