Bluetooth output
odio can act as a Bluetooth source, routing whatever it’s playing (Spotify Connect, MPD, AirPlay, CDs, …) to a Bluetooth speaker or headphones. Once paired, the remote device shows up as a PulseAudio sink in the embedded UI’s Default Sink dropdown, selectable like any other output.
Pairing a speaker
Section titled “Pairing a speaker”-
Put your Bluetooth speaker in pairing mode (usually a long-press on the Bluetooth button).
-
SSH into the odio node and open an interactive
bluetoothctlsession:Terminal window bluetoothctl -
Power the adapter, scan for the speaker, connect, and trust it:
power onscan onWait for your speaker to appear in the scan output, for example:
[NEW] Device 40:C1:F6:D4:67:88 JBL Go 3Then stop the scan, connect, and trust the device for future reconnections:
scan offconnect 40:C1:F6:D4:67:88trust 40:C1:F6:D4:67:88exitReplace the MAC with yours. Because the speaker is in pairing mode,
connectauto-pairs and bonds, no PIN needed.trustlets the node reconnect the speaker without manual confirmation after a reboot.
After a reflash
Section titled “After a reflash”If you reflash the node, BlueZ loses its pairing state, but the speaker still has the previous odio in its trusted list. Put the speaker back in pairing mode and run the same bluetoothctl flow (power on, scan on, wait for the speaker to show up, scan off), with one difference: trust comes before connect.
[bluetoothctl]> trust 40:C1:F6:D4:67:88[CHG] Device 40:C1:F6:D4:67:88 Trusted: yesChanging 40:C1:F6:D4:67:88 trust succeeded[bluetoothctl]> connect 40:C1:F6:D4:67:88Attempting to connect to 40:C1:F6:D4:67:88[CHG] Device 40:C1:F6:D4:67:88 Connected: yesThe speaker side still has odio trusted from the first pairing, so trusting on the node side first puts both ends back in sync before the connect attempt.
Selecting the sink
Section titled “Selecting the sink”Open the embedded UI. The paired speaker appears in Audio Server → Default Sink. Pick it, and every odio source now plays through it.
Volume sync works the same way as for a built-in DAC: moving the UI slider changes the speaker’s volume over AVRCP, and physical buttons on the speaker update the UI.
Reconnecting
Section titled “Reconnecting”Once trusted, BlueZ reconnects the speaker automatically when both sides are powered and in range, including after a reboot of the node. This usually just works, but auto-reconnect isn’t 100% reliable across every speaker and firmware. If the sink doesn’t show up, reconnect manually:
bluetoothctl connect 40:C1:F6:D4:67:88You can wrap this in a systemd user unit and add it to the systemd.user whitelist in go-odio-api’s config, which makes it manageable from the Services panel in the embedded UI.
See also
Section titled “See also”- Bluetooth for the opposite direction, using the odio node as an A2DP speaker that your phone streams to.