Tune by Mozaiklabs

Trasformare un Raspberry Pi in un endpoint audio OAAT

Trasformare un Raspberry Pi in un endpoint audio bit-perfect con OAAT

Raspberry Pi 4 + Audiophonics ESS 9038 DAC — endpoint OAAT

Questa guida vi accompagna passo dopo passo nella configurazione di un Raspberry Pi 3B+ o 4 come endpoint audio ad alta fedeltà con il protocollo OAAT (Open Advanced Audio Transport).

OAAT è un protocollo open-source concepito come alternativa aperta al RAAT proprietario di Roon:

  • Audio bit-perfect — PCM fino a 768 kHz / 32 bit, DSD nativo fino a DSD512
  • Sincronizzazione multi-room — meno di 1 ms tra endpoint, tramite clock PTP
  • Negoziazione del formato — il controller si adatta automaticamente alle capacità del DAC
  • Gapless — transizioni senza interruzioni, anche in caso di cambio di formato
  • Zero-config — discovery mDNS/DNS-SD, nessun IP da inserire
  • Open source — Apache 2.0, codice Rust su GitHub

OAAT vs. gli altri protocolli

  • OAAT: open source, bit-perfect, DSD nativo, sync multi-room inferiore a 1 ms
  • RAAT (Roon): bit-perfect, DSD, multi-room — ma proprietario e chiuso
  • DLNA/UPnP: open source — ma nessuna sincronizzazione multi-room, gapless aleatorio, DSD solo in DoP
  • AirPlay 2: multi-room Apple — ma non bit-perfect, niente DSD, ecosistema chiuso

Il Raspberry Pi è il compagno ideale: 35-75 €, silenzioso (nessuna ventola), con un bus I2S nativo che collega direttamente il DAC al GPIO — il percorso audio più corto e più puro.

Architettura OAAT

graph LR
    A["🎵 Tune Server
(contrôleur)"] -->|"TCP :9740
contrôle JSON"| B["🔊 RPi Endpoint
(DAC I2S)"] A -->|"UDP :9741
audio PCM/FLAC"| B A <-->|"UDP :9742
clock sync PTP"| B B -->|"I2S GPIO"| C["🎧 DAC
ESS 9038 / HifiBerry / ..."] C --> D["🔈 Ampli + Enceintes"] style A fill:#4a90d9,stroke:#333,color:#fff style B fill:#50c878,stroke:#333,color:#fff style C fill:#f5a623,stroke:#333,color:#fff style D fill:#e8e8e8,stroke:#333,color:#333

Materiale necessario

Il Raspberry Pi

  • RPi 4B (2 o 4 GB) — PCM max: 384 kHz / 32 bit — ✅ Consigliato
  • RPi 3B+ — PCM max: 192 kHz / 32 bit — Budget / usato
  • RPi 5 — PCM max: 384 kHz / 32 bit — Funziona anche lui

Il RPi 3B+ è limitato a 192 kHz dal suo bus I2S. Per l'hi-res oltre questa soglia (352.8 / 384 kHz), preferite il RPi 4.

Il DAC I2S (HAT)

OAAT supporta tutti i DAC I2S compatibili con Raspberry Pi. Ecco i più diffusi:

  • Audiophonics ESS 9038Q2M (ESS ES9038Q2M) — 384 kHz / 32 bit — ~120 € — overlay: i-sabre-q2m — driver Linux
  • HifiBerry DAC2 HD (PCM1796) — 192 kHz / 24 bit — ~65 € — overlay: hifiberry-dacplushd
  • HifiBerry DAC+ Pro (PCM5122) — 192 kHz / 32 bit — ~45 € — overlay: hifiberry-dacplus
  • Allo Boss (PCM5122) — 384 kHz / 32 bit — ~50 € — overlay: allo-boss-dac-pcm512x-audio
  • IQaudio DAC+ (PCM5122) — 192 kHz / 24 bit — ~30 € — overlay: iqaudio-dacplus
  • JustBoom DAC HAT (PCM5122) — 384 kHz / 32 bit — ~35 € — overlay: justboom-dac

⚠️ Importante: l'overlay Linux deve corrispondere esattamente al vostro DAC. Un overlay sbagliato = nessun suono (errore ALSA -121 o -22).

Accessori

  • Scheda microSD: 8 GB minimo (16 GB consigliati)
  • Alimentazione: ufficiale RPi oppure 5V/3A USB-C (RPi 4) / micro-USB (RPi 3)
  • Cavo Ethernet: consigliato per la stabilità audio (il WiFi funziona ma aggiunge ~50 ms di jitter sulla clock sync)
  • Case (opzionale): Audiophonics propone case integrati Pi + DAC

Flashare la scheda SD

1. Installare Raspberry Pi Imager

  • macOS: brew install --cask raspberry-pi-imager
  • Windows: scaricare l'installer
  • Linux: sudo apt install rpi-imager

2. Configurare e flashare

  1. Aprire Raspberry Pi Imager
  2. Scegliere il dispositivo: Raspberry Pi 3 o 4
  3. Scegliere l'OS: Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit) — il Desktop non serve
  4. Scegliere lo storage: la vostra scheda microSD
  5. Cliccare sull'ingranaggio (⚙️) per configurare:
    • Hostname: oaat-endpoint
    • Attivare SSH: sì, con password
    • Nome utente / password: a vostra scelta
    • WiFi: da configurare se non avete Ethernet
    • Fuso orario: Europe/Paris
  6. Flashare — ci vogliono 2-3 minuti

3. Primo avvio

  1. Inserire la scheda SD nel Pi
  2. Collegare il DAC HAT al GPIO (se non è già montato)
  3. Collegare Ethernet + alimentazione
  4. Attendere 1-2 minuti (il primo boot è un po' più lungo)
  5. Connettersi via SSH:
ssh pi@oaat-endpoint.local

Suggerimento: per trovare l'IP del Pi, consultate l'interfaccia del vostro router, oppure usate arp -a | grep raspberry.


Installazione

Panoramica del processo

flowchart LR
    A["📥 Flash SD
RPi Imager"] --> B["🔌 Boot + SSH"] B --> C["⚙️ setup.sh
choix du DAC"] C --> D["🔄 Reboot"] D --> E["✅ Endpoint actif
visible sur le réseau"] style A fill:#e8e8e8,stroke:#333 style B fill:#e8e8e8,stroke:#333 style C fill:#f5a623,stroke:#333,color:#fff style D fill:#e8e8e8,stroke:#333 style E fill:#50c878,stroke:#333,color:#fff

Installazione automatica (consigliata)

Un solo comando installa tutto:

curl -sL https://raw.githubusercontent.com/renesenses/oaat/main/dist/rpi/setup.sh | sudo bash

Lo script vi chiede di scegliere il vostro DAC tra 6 modelli supportati, poi:

  1. Installa le dipendenze di sistema (ALSA, strumenti di build)
  2. Configura l'overlay del DAC in /boot/config.txt
  3. Configura ALSA (/etc/asound.conf)
  4. Installa Rust e compila OAAT dai sorgenti
  5. Installa il servizio systemd

Tempo di compilazione:

  • RPi 4: ~8 minuti in release
  • RPi 3B+: ~20 minuti in release (lo script gestisce automaticamente lo swap)

Dopo l'installazione:

sudo reboot

Il reboot è necessario per attivare l'overlay del DAC. Dopo il riavvio, il servizio OAAT si avvia automaticamente.

Installazione manuale (passo dopo passo)

Se preferite controllare ogni fase:

1. Dipendenze di sistema

sudo apt-get update
sudo apt-get install -y libasound2 libasound2-dev alsa-utils     curl git build-essential pkg-config

2. Configurare il DAC

Modificare /boot/firmware/config.txt (o /boot/config.txt a seconda della versione dell'OS):

# Désactiver l'audio embarqué
#dtparam=audio=on

# Votre DAC — décommentez UNE SEULE ligne :
dtoverlay=i-sabre-q2m              # Audiophonics ESS 9038Q2M
#dtoverlay=hifiberry-dacplus        # HifiBerry DAC+ / DAC+ Pro
#dtoverlay=hifiberry-dacplushd      # HifiBerry DAC2 HD
#dtoverlay=allo-boss-dac-pcm512x-audio  # Allo Boss
#dtoverlay=iqaudio-dacplus          # IQaudio DAC+
#dtoverlay=justboom-dac             # JustBoom DAC HAT

3. Configurare ALSA

sudo tee /etc/asound.conf << 'EOF'
pcm.!default {
    type hw
    card 0
    device 0
    format S32_LE
}

ctl.!default {
    type hw
    card 0
}
EOF

4. Installare Rust e compilare

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env

sudo mkdir -p /opt/oaat
sudo chown $USER:$USER /opt/oaat
git clone https://github.com/renesenses/oaat.git /opt/oaat/src
cd /opt/oaat/src
cargo build --release --bin oaat
cp target/release/oaat /opt/oaat/oaat
cp dist/rpi/endpoint.toml /opt/oaat/endpoint.toml

5. Servizio systemd e reboot

sudo cp dist/oaat-endpoint.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable oaat-endpoint
sudo reboot

Configurazione

Il file di configurazione si trova in /opt/oaat/endpoint.toml:

[endpoint]
# Nom affiché dans Tune et lors de la découverte mDNS
name = "Salon DAC"
port = 9740

[capabilities]
# Adapter à votre DAC :
pcm_max_rate = 384000    # Hz (384000, 192000...)
pcm_max_bits = 32        # bits (32, 24)
channels_max = 2
dsd = false
flac = true              # Recommandé : réduit la bande passante de ~50%

[logging]
level = "info"

Consigli:

  • pcm_max_rate: non dichiarate più di quanto il vostro DAC supporti realmente. OAAT negozia automaticamente al ribasso se la sorgente eccede.
  • flac = true: consigliato, soprattutto in WiFi. FLAC è lossless, zero perdita di qualità, e riduce la banda del ~50-60%.
  • name: scegliete un nome parlante, è ciò che compare come zona di riproduzione in Tune.

Esempi per DAC

Audiophonics ESS 9038Q2M:

[endpoint]
name = "Audiophonics ESS 9038"

[capabilities] pcm_max_rate = 384000 pcm_max_bits = 32 channels_max = 2 flac = true

HifiBerry DAC+ Pro / DAC2 HD:

[endpoint]
name = "HifiBerry DAC"

[capabilities] pcm_max_rate = 192000 pcm_max_bits = 24 channels_max = 2 flac = true

Allo Boss / JustBoom:

[endpoint]
name = "Allo Boss DAC"

[capabilities] pcm_max_rate = 384000 pcm_max_bits = 32 channels_max = 2 flac = true

Audiophonics ESS 9038Q2M — dettagli tecnici

L'ES9038Q2M supporta i formati S16_LE e S32_LE, frequenze di campionamento fino a 384 kHz (anzi 1.536 MHz in modalità DSD), e dispone di controlli ALSA avanzati:

  • Volume digitale: 0-100 (da -100 dB a 0 dB)
  • Filtro FIR: 7 tipi (brick wall, minimum phase, linear phase...)
  • Selezione ingresso: I2S / SPDIF

Il driver Linux utilizza l'indirizzo I2C 0x48. Su Raspberry Pi OS Bookworm recente, l'overlay i-sabre-q2m è generalmente incluso nel kernel. Con un kernel più datato, compilate il modulo dal repository Audiophonics:

sudo apt-get install -y raspberrypi-kernel-headers
git clone https://github.com/audiophonics/I-Sabre_9038Q2M.git /tmp/i-sabre
cd /tmp/i-sabre
make
sudo make install
sudo reboot

Verifica e primo suono

1. Verificare che il DAC sia rilevato:

aplay -l
# Doit afficher votre DAC comme carte 0

2. Testare il suono direttamente (senza OAAT):

speaker-test -D hw:0,0 -c 2 -t sine -f 440
# Vous devez entendre un la 440 Hz — Ctrl+C pour arrêter

3. Verificare il servizio OAAT:

sudo systemctl status oaat-endpoint
# Active: active (running)

4. Verificare la discovery mDNS (da un altro dispositivo):

# macOS
dns-sd -B _oaat._tcp

# Linux
avahi-browse -r _oaat._tcp

5. Primo suono via OAAT!

Dal vostro computer (con il CLI oaat installato):

# Sinusoïde 440 Hz pendant 5 secondes
oaat controller --target IP_DU_PI:9740 --freq 440 --duration 5

Se sentite il la 440 Hz: il vostro endpoint OAAT è funzionante e bit-perfect! 🎉

6. Test di conformità completo:

oaat-test IP_DU_PI:9740

# OAAT Conformance Test
# [Handshake]       4 PASS
# [Capabilities]    4 PASS
# [Format Nego]     3 PASS  (accept, counter, reject)
# [Clock Sync]      1 PASS
# [Audio]           1 PASS
# [Gapless]         2 PASS  (same format, diff format)
# [Volume]          3 PASS
# [Reconnect]       2 PASS
# 20 tests: 20 passed — Endpoint is CONFORMANT

Utilizzo con Tune

Tune è un server musicale self-hosted che integra nativamente OAAT.

Se Tune gira sulla stessa rete locale del vostro RPi, l'endpoint OAAT appare automaticamente come zona di riproduzione nell'interfaccia web. Non è necessaria alcuna configurazione aggiuntiva.

L'endpoint OAAT ha la priorità su DLNA e AirPlay in Tune, perché offre il percorso audio più diretto e più fedele.

La negoziazione del formato è del tutto trasparente:

  • Sorgente in 24/96, DAC che supporta 384/32 → riproduzione in 24/96 nativo (nessun upsampling inutile)
  • Sorgente in 24/192, DAC che supporta max 96 → Tune fa il downsample a 24/96 (stessa famiglia 48 kHz)
  • Sorgente in DSD, DAC che non supporta il DSD → conversione PCM trasparente

Troubleshooting

Nessun suono

  • aplay -l non elenca alcuna scheda → Overlay DAC mancante o errato. Verificare /boot/firmware/config.txt, correggere l'overlay, riavviare.
  • speaker-test restituisce un errore -121 → Overlay sbagliato per questo DAC. Provare un altro overlay (vedi l'elenco qui sopra).
  • speaker-test funziona ma OAAT no → Servizio non avviato o configurazione errata. Verificare con systemctl status oaat-endpoint e journalctl -u oaat-endpoint -f.
  • Suono che gracchia o salta → WiFi instabile. Passare a Ethernet.

L'endpoint non viene rilevato da Tune

  • Verificare che Tune e il RPi siano sulla stessa sottorete
  • Se usate una VPN (NordVPN, ecc.): attivare nordvpn set lan-discovery on
  • Verificare il firewall: le porte 9740 (TCP), 9741 (UDP), 9742 (UDP) e 5353 (mDNS) devono essere aperte
  • Testare manualmente la discovery mDNS (vedi sezione Verifica)

Il servizio non si avvia

# Voir les logs détaillés
journalctl -u oaat-endpoint -f

# Erreurs courantes :
# "No such device" → DAC pas détecté, vérifier overlay + reboot
# "Address already in use" → un autre processus utilise le port 9740
# "Permission denied" → vérifier le User dans le fichier service

RPi 3 vs RPi 4

  • PCM max via I2S: RPi 3B+ = 192 kHz / RPi 4 = 384 kHz
  • Tempo di compilazione: RPi 3 ~20 min / RPi 4 ~8 min
  • RAM: RPi 3 = 1 GB (swap consigliato) / RPi 4 = 2-8 GB
  • Ethernet: RPi 3 = 100 Mbps (via USB) / RPi 4 = Gigabit nativo

Il RPi 3B+ funziona perfettamente per il 16/44.1 (CD) fino al 24/192 (hi-res). Se ascoltate principalmente FLAC da CD o Qobuz 24/96, un RPi 3 usato a 25 € va benissimo.

Audiophonics ESS 9038Q2M: overlay non trovato

Su alcune versioni di Raspberry Pi OS, l'overlay i-sabre-q2m non è incluso nel kernel. Sintomo:

dtoverlay: failed to apply overlay 'i-sabre-q2m'

Soluzione: compilare il driver dai sorgenti (vedi la sezione Configurazione qui sopra).


Andare oltre

Aggiornamento dell'endpoint

cd /opt/oaat/src
git pull
cargo build --release --bin oaat
cp target/release/oaat /opt/oaat/oaat
sudo systemctl restart oaat-endpoint

Multi-room sincronizzato

Due (o più) Raspberry Pi sulla stessa rete possono essere sincronizzati entro 1 ms:

graph TD
    A["🎵 Tune Server"] -->|"même PTS"| B["🔊 RPi #1 — Salon
ESS 9038Q2M"] A -->|"même PTS"| C["🔊 RPi #2 — Cuisine
HifiBerry DAC+"] A -->|"même PTS"| D["🔊 RPi #3 — Chambre
Allo Boss"] B <-->|"clock sync
PTP"| A C <-->|"clock sync
PTP"| A D <-->|"clock sync
PTP"| A E["⏱️ Sync < 1 ms
entre tous les endpoints"] style A fill:#4a90d9,stroke:#333,color:#fff style B fill:#50c878,stroke:#333,color:#fff style C fill:#50c878,stroke:#333,color:#fff style D fill:#50c878,stroke:#333,color:#fff style E fill:#fff3cd,stroke:#f5a623,color:#333

Ogni endpoint riceve gli stessi pacchetti audio con lo stesso timestamp di presentazione (PTS). La sincronizzazione PTP corregge automaticamente le differenze di clock tra i Pi.

In Tune, basta creare una zona che raggruppa più endpoint per attivare il multi-room.

Prestazioni di rete

  • PCM 16/44.1 stereo: 1.41 Mbps
  • PCM 24/192 stereo: 9.22 Mbps
  • PCM 32/384 stereo: 24.58 Mbps
  • FLAC 24/192 stereo: ~4 Mbps (compressione ~50%)

Ethernet consigliato per il multi-room sincronizzato. Per un endpoint singolo il WiFi va benissimo.

Headless completo

Il setup descritto qui è già al 100% headless. Una volta flashato e avviato, il Pi è autonomo:

  • Il servizio OAAT parte al boot
  • Riavvio automatico in caso di crash (systemd Restart=always)
  • Riconnessione automatica se il controller si disconnette
  • Aggiornamento possibile via SSH

Link utili:

Guida redatta da MozAIk Labs — maggio 2026