#!/bin/sh # audio-bridge entrypoint # Starts DBus (system + session), BlueZ, WirePlumber, then PipeWire. # PA clients (librespot, mopidy) connect via pipewire-pulse bridge on TCP localhost:4713. set -e mkdir -p /run/dbus /run/user/0 chmod 0755 /run/dbus chmod 0700 /run/user/0 # Clean up stale pid files from previous container runs (host volume persists). rm -f /run/dbus/dbus.pid /run/user/0/dbus.pid # System DBus (needed by bluetoothd, wireplumber) dbus-daemon --system --fork sleep 0.5 # Session DBus (needed by PipeWire for portal/jackdbus-detect modules). # Use XDG_RUNTIME_DIR=/run/user/0 so dbus-launch puts socket there. export XDG_RUNTIME_DIR=/run/user/0 dbus-daemon --session --address=unix:path=/run/user/0/bus --fork sleep 0.3 # BlueZ (Bluetooth stack). --compat = legacy mode for older audio devices. # Disabled if no /sys/class/bluetooth — wireplumber will skip BT modules. if [ -d /sys/class/bluetooth ]; then /usr/lib/bluetooth/bluetoothd --compat --nodetach & sleep 0.5 echo "[audio-bridge] bluetoothd started" else echo "[audio-bridge] no bluetooth hardware — skipping bluetoothd" fi # WirePlumber first (manages PipeWire session/policy, loads BT modules on demand) wireplumber & sleep 1 # PipeWire (audio server). Listens on its own native socket. pipewire & # PipeWire-Pulse daemon: PA-compatible bridge. Listen on TCP 4713 so PA clients # (librespot, mopidy) can connect from sibling containers without unix socket # path coupling. sleep 1 exec pipewire-pulse -a tcp:4713 -a unix:/tmp/pulse-socket