Skip to content

Extensions

odio doesn’t lock you into its built-in sources. You’re free to install and run any additional software on your Pi. The path covered here is PulseAudio output in a user systemd unit running as the odio user, which integrates cleanly with the odio UI, routing, and volume. Other paths are possible but sit outside this page’s scope.

odio manages audio routing and volume through PulseAudio, and the odio UI lists every PulseAudio client with its own volume slider. Third-party software should send audio to PulseAudio so it shows up there and behaves like any other source. See the Plexamp and Squeezelite examples below for concrete setups.

odio detects and exposes media sources through MPRIS. For third-party software to appear in the odio UI and Home Assistant, it needs to register as an MPRIS player on the session D-Bus. Whether that works depends on the software itself, some support it natively, others need a plugin or wrapper (like Kodi, MPD, or Squeezelite), and some may require specific build flags or configuration.

Plexamp can run in headless mode on a Raspberry Pi, turning your odio node into a Plexamp endpoint you can cast to from any Plex client.

Requirements:

  • A Plex Media Server on your network
  • An active Plex Pass subscription

Installation:

A community script automates the setup — see this gist for full instructions. The short version:

  1. SSH into your odio node.
  2. Download and run the installer script with the --user flag so Plexamp runs as a user service and can access PulseAudio:
    Terminal window
    bash plexamp.sh --user
  3. Enter your Plex claim code and choose a player name.
  4. Reboot.

Plexamp will be available at http://<your-node>:32500. Use the Cast feature from Plexamp on another device to select your Pi as the playback target.

Squeezelite is a software player for Logitech Media Server (LMS). On its own it has no MPRIS interface, but paired with the mprisqueeze wrapper it registers on D-Bus as an MPRIS player and shows up in the odio UI and Home Assistant like any other source, with cover art and transport controls.

Requirements:

  • An LMS server on your network (running on the odio node or on a NAS, either works)
  • The odio node’s user session (same user that runs odio)

Installation:

  1. Install the PulseAudio build of Squeezelite from Debian:

    Terminal window
    sudo apt install squeezelite-pulseaudio

    The package provides the /usr/bin/squeezelite-pulseaudio binary, which outputs to PulseAudio directly.

  2. Install mprisqueeze. The simplest path is via Cargo (a Rust toolchain is required):

    Terminal window
    cargo install mprisqueeze

    See the mprisqueeze README for alternatives (Nix flake, build from source). The binary lands in ~/.cargo/bin/mprisqueeze.

  3. Create a user systemd unit at ~/.config/systemd/user/mprisqueeze.service, adapted from the example in the mprisqueeze README:

    [Unit]
    Description=mprisqueeze
    [Service]
    ExecStart=%h/.cargo/bin/mprisqueeze -p my-player -H LMSSERVERIP -- squeezelite-pulseaudio -n {name} -s {server}
    Restart=always
    RestartSec=3
    Type=simple
    [Install]
    WantedBy=default.target

    Replace my-player (the name shown in LMS) and LMSSERVERIP. Drop -H LMSSERVERIP entirely to let mprisqueeze auto-discover the server on the LAN, as documented in the README.

  4. Enable and start the service:

    Terminal window
    systemctl --user daemon-reload
    systemctl --user enable --now mprisqueeze.service

Squeezelite registers as an MPRIS player on the user session bus, and the odio UI picks it up automatically.

odio UI with Squeezelite as an MPRIS media player, playing Ludwig Göransson's The Mandalorian Chapter 1 with cover art and transport controls, and an ALSA Playback client from squeezelite-R2 active on the PulseAudio server

Anything that can run on a Pi in user session and output to PulseAudio is fair game. Some possibilities:

  • Jellyfin — self-hosted media server with MPV Shim for headless audio playback

Some users run audio software directly on ALSA for specific needs like high sample rates or bit-perfect paths to a DAC, bypassing the PulseAudio stack odio manages. That’s outside the scope of this documentation, odio’s routing and volume controls only apply to PulseAudio clients, so a raw-ALSA stream won’t be affected by them.

For a concrete example, see @sm0kingm4n’s write-up on issue #38, which uses squeezelite-R2 for server-side upsampling up to 768 kHz via LMS’s C-3PO plugin.