#!/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. Custom config in # /etc/pipewire/pipewire-pulse.conf sets server.address = [unix:native, tcp:4713] # so PA clients (librespot, mopidy) connect via tcp:127.0.0.1:4713. sleep 1 exec pipewire-pulse