Tune by Mozaiklabs

Convertir una Raspberry Pi en endpoint de audio OAAT

Convertir una Raspberry Pi en endpoint de audio bit-perfect con OAAT

Raspberry Pi 4 + Audiophonics ESS 9038 DAC — endpoint OAAT

Esta guía te acompaña paso a paso para configurar una Raspberry Pi 3B+ o 4 como endpoint de audio de alta fidelidad con el protocolo OAAT (Open Advanced Audio Transport).

OAAT es un protocolo open-source concebido como alternativa abierta al RAAT propietario de Roon:

  • Audio bit-perfect — PCM hasta 768 kHz / 32 bits, DSD nativo hasta DSD512
  • Sincronización multi-room — menos de 1 ms entre endpoints, mediante reloj PTP
  • Negociación de formato — el controlador se adapta automáticamente a las capacidades del DAC
  • Gapless — transiciones sin cortes, incluso al cambiar de formato
  • Zero-config — descubrimiento mDNS/DNS-SD, sin necesidad de introducir ninguna IP
  • Open source — Apache 2.0, código Rust en GitHub

OAAT frente a los otros protocolos

  • OAAT: open source, bit-perfect, DSD nativo, sincronización multi-room por debajo de 1 ms
  • RAAT (Roon): bit-perfect, DSD, multi-room — pero propietario y cerrado
  • DLNA/UPnP: open source — pero sin sincronización multi-room, gapless aleatorio, DSD únicamente en DoP
  • AirPlay 2: multi-room de Apple — pero no es bit-perfect, sin DSD, ecosistema cerrado

La Raspberry Pi es el compañero ideal: 35-75 €, silenciosa (sin ventilador), con un bus I2S nativo que conecta directamente el DAC al GPIO — el camino de audio más corto y más puro.

Arquitectura OAAT

graph LR
    A["🎵 Tune Server
(controlador)"] -->|"TCP :9740
control 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 + Altavoces"] 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

Material necesario

La Raspberry Pi

  • RPi 4B (2 o 4 GB) — PCM máx.: 384 kHz / 32 bits — ✅ Recomendada
  • RPi 3B+ — PCM máx.: 192 kHz / 32 bits — Económica / de segunda mano
  • RPi 5 — PCM máx.: 384 kHz / 32 bits — También funciona

La RPi 3B+ está limitada a 192 kHz por su bus I2S. Para hi-res por encima de eso (352.8 / 384 kHz), opta por la RPi 4.

El DAC I2S (HAT)

OAAT soporta todos los DAC I2S compatibles con Raspberry Pi. Estos son los más habituales:

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

⚠️ Importante: el overlay de Linux debe corresponder exactamente a tu DAC. Un overlay incorrecto = sin sonido (error ALSA -121 o -22).

Accesorios

  • Tarjeta microSD: 8 GB mínimo (16 GB recomendado)
  • Alimentación: oficial de RPi o 5V/3A USB-C (RPi 4) / micro-USB (RPi 3)
  • Cable Ethernet: recomendado para la estabilidad del audio (el WiFi funciona pero añade ~50 ms de jitter en la clock sync)
  • Caja (opcional): Audiophonics ofrece cajas integradas Pi + DAC

Grabar la tarjeta SD

1. Instalar Raspberry Pi Imager

  • macOS: brew install --cask raspberry-pi-imager
  • Windows: descargar el instalador
  • Linux: sudo apt install rpi-imager

2. Configurar y grabar

  1. Abrir Raspberry Pi Imager
  2. Elegir el dispositivo: Raspberry Pi 3 o 4
  3. Elegir el SO: Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit) — no hace falta el Desktop
  4. Elegir el almacenamiento: tu tarjeta microSD
  5. Pulsar el engranaje (⚙️) para configurar:
    • Hostname: oaat-endpoint
    • Activar SSH: sí, con contraseña
    • Nombre de usuario / contraseña: a tu elección
    • WiFi: configurar si no hay Ethernet
    • Zona horaria: Europe/Paris
  6. Grabar — unos 2-3 minutos

3. Primer arranque

  1. Insertar la tarjeta SD en la Pi
  2. Conectar el DAC HAT al GPIO (si no está ya montado)
  3. Conectar Ethernet + alimentación
  4. Esperar 1-2 minutos (el primer boot es algo más largo)
  5. Conectarse por SSH:
ssh pi@oaat-endpoint.local

Truco: para encontrar la IP de la Pi, consulta la interfaz de tu router, o usa arp -a | grep raspberry.


Instalación

Visión general del proceso

flowchart LR
    A["📥 Flash SD
RPi Imager"] --> B["🔌 Boot + SSH"] B --> C["⚙️ setup.sh
elección del DAC"] C --> D["🔄 Reboot"] D --> E["✅ Endpoint activo
visible en la red"] 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

Instalación automática (recomendada)

Un solo comando lo instala todo:

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

El script te pide elegir tu DAC entre los 6 modelos soportados y, después:

  1. Instala las dependencias del sistema (ALSA, herramientas de build)
  2. Configura el overlay del DAC en /boot/config.txt
  3. Configura ALSA (/etc/asound.conf)
  4. Instala Rust y compila OAAT desde las fuentes
  5. Instala el servicio systemd

Tiempo de compilación:

  • RPi 4: ~8 minutos en release
  • RPi 3B+: ~20 minutos en release (el script gestiona el swap automáticamente)

Después de la instalación:

sudo reboot

El reinicio es necesario para activar el overlay del DAC. Tras reiniciar, el servicio OAAT arranca automáticamente.

Instalación manual (paso a paso)

Si prefieres controlar cada etapa:

1. Dependencias del sistema

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

2. Configurar el DAC

Editar /boot/firmware/config.txt (o /boot/config.txt según la versión del SO):

# Desactivar el audio integrado
#dtparam=audio=on

# Tu DAC — descomenta UNA SOLA línea:
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. Configurar 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. Instalar Rust y compilar

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. Servicio systemd y reinicio

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

Configuración

El archivo de configuración se encuentra en /opt/oaat/endpoint.toml:

[endpoint]
# Nombre mostrado en Tune y durante el descubrimiento mDNS
name = "Salon DAC"
port = 9740

[capabilities]
# Ajustar a tu DAC:
pcm_max_rate = 384000    # Hz (384000, 192000...)
pcm_max_bits = 32        # bits (32, 24)
channels_max = 2
dsd = false
flac = true              # Recomendado: reduce el ancho de banda un ~50%

[logging]
level = "info"

Consejos:

  • pcm_max_rate: no declares más de lo que tu DAC soporta realmente. OAAT negocia automáticamente a la baja si la fuente lo supera.
  • flac = true: recomendado, sobre todo por WiFi. FLAC es lossless, sin ninguna pérdida de calidad, y reduce el ancho de banda un ~50-60%.
  • name: elige un nombre descriptivo, es lo que aparece como zona de reproducción en Tune.

Ejemplos por 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 — detalles técnicos

El ES9038Q2M soporta los formatos S16_LE y S32_LE, frecuencias de muestreo hasta 384 kHz (incluso 1.536 MHz en modo DSD) y dispone de controles ALSA avanzados:

  • Volumen digital: 0-100 (-100 dB a 0 dB)
  • Filtro FIR: 7 tipos (brick wall, minimum phase, linear phase...)
  • Selección de entrada: I2S / SPDIF

El driver Linux utiliza la dirección I2C 0x48. En Raspberry Pi OS Bookworm reciente, el overlay i-sabre-q2m suele venir incluido en el kernel. Para un kernel más antiguo, compila el módulo desde el repositorio de 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

Verificación y primer sonido

1. Comprobar que el DAC se detecta:

aplay -l
# Debe mostrar tu DAC como tarjeta 0

2. Probar el sonido directamente (sin OAAT):

speaker-test -D hw:0,0 -c 2 -t sine -f 440
# Debes oír un la de 440 Hz — Ctrl+C para detener

3. Comprobar el servicio OAAT:

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

4. Comprobar el descubrimiento mDNS (desde otro dispositivo):

# macOS
dns-sd -B _oaat._tcp

# Linux
avahi-browse -r _oaat._tcp

5. ¡Primer sonido vía OAAT!

Desde tu ordenador (con el CLI oaat instalado):

# Sinusoide de 440 Hz durante 5 segundos
oaat controller --target IP_DU_PI:9740 --freq 440 --duration 5

Si oyes el la de 440 Hz: ¡tu endpoint OAAT funciona y es bit-perfect! 🎉

6. Test de conformidad 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

Uso con Tune

Tune es un servidor de música autoalojado que integra OAAT de forma nativa.

Si Tune corre en la misma red local que tu RPi, el endpoint OAAT aparece automáticamente como zona de reproducción en la interfaz web. No hace falta ninguna configuración adicional.

El endpoint OAAT tiene prioridad sobre DLNA y AirPlay en Tune, porque ofrece el camino de audio más directo y más fiel.

La negociación de formato es completamente transparente:

  • Fuente en 24/96, el DAC soporta 384/32 → reproducción en 24/96 nativo (sin upsampling innecesario)
  • Fuente en 24/192, el DAC soporta como máximo 96 → Tune hace downsample a 24/96 (misma familia de 48 kHz)
  • Fuente en DSD, el DAC no soporta DSD → conversión a PCM transparente

Troubleshooting

Sin sonido

  • aplay -l no lista ninguna tarjeta → Overlay del DAC ausente o incorrecto. Verifica /boot/firmware/config.txt, corrige el overlay y reinicia.
  • speaker-test devuelve un error -121 → Overlay incorrecto para ese DAC. Prueba otro overlay (ver la lista de arriba).
  • speaker-test funciona pero OAAT no → Servicio no arrancado o configuración incorrecta. Comprueba con systemctl status oaat-endpoint y journalctl -u oaat-endpoint -f.
  • Sonido con chasquidos o cortes → WiFi inestable. Pasa a Ethernet.

Tune no descubre el endpoint

  • Comprueba que Tune y la RPi están en la misma subred
  • Si usas una VPN (NordVPN, etc.): activa nordvpn set lan-discovery on
  • Comprueba el firewall: los puertos 9740 (TCP), 9741 (UDP), 9742 (UDP) y 5353 (mDNS) deben estar abiertos
  • Prueba el descubrimiento mDNS manualmente (ver la sección Verificación)

El servicio no arranca

# Ver los logs detallados
journalctl -u oaat-endpoint -f

# Errores habituales:
# "No such device" → DAC no detectado, verificar overlay + reboot
# "Address already in use" → otro proceso usa el puerto 9740
# "Permission denied" → verificar el User en el archivo de servicio

RPi 3 vs RPi 4

  • PCM máx. vía I2S: RPi 3B+ = 192 kHz / RPi 4 = 384 kHz
  • Tiempo de compilación: RPi 3 ~20 min / RPi 4 ~8 min
  • RAM: RPi 3 = 1 GB (swap recomendado) / RPi 4 = 2-8 GB
  • Ethernet: RPi 3 = 100 Mbps (vía USB) / RPi 4 = Gigabit nativo

La RPi 3B+ funciona perfectamente para 16/44.1 (CD) hasta 24/192 (hi-res). Si escuchas principalmente FLAC de CD o Qobuz 24/96, una RPi 3 de segunda mano por 25 € cumple perfectamente.

Audiophonics ESS 9038Q2M: overlay no encontrado

En algunas versiones de Raspberry Pi OS, el overlay i-sabre-q2m no está incluido en el kernel. Síntoma:

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

Solución: compilar el driver desde las fuentes (ver la sección Configuración más arriba).


Ir más lejos

Actualizar el 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 sincronizado

Dos (o más) Raspberry Pi en la misma red pueden sincronizarse con menos de 1 ms de desviación:

graph TD
    A["🎵 Tune Server"] -->|"mismo PTS"| B["🔊 RPi #1 — Salón
ESS 9038Q2M"] A -->|"mismo PTS"| C["🔊 RPi #2 — Cocina
HifiBerry DAC+"] A -->|"mismo PTS"| D["🔊 RPi #3 — Dormitorio
Allo Boss"] B <-->|"clock sync
PTP"| A C <-->|"clock sync
PTP"| A D <-->|"clock sync
PTP"| A E["⏱️ Sync < 1 ms
entre todos los 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

Cada endpoint recibe los mismos paquetes de audio con el mismo timestamp de presentación (PTS). La sincronización PTP corrige automáticamente las diferencias de reloj entre las Pi.

En Tune, basta con crear una zona que agrupe varios endpoints para activar el multi-room.

Rendimiento de red

  • PCM 16/44.1 estéreo: 1.41 Mbps
  • PCM 24/192 estéreo: 9.22 Mbps
  • PCM 32/384 estéreo: 24.58 Mbps
  • FLAC 24/192 estéreo: ~4 Mbps (compresión ~50%)

Ethernet recomendado para el multi-room sincronizado. Para un endpoint único, el WiFi va muy bien.

Headless total

El setup descrito aquí ya es 100% headless. Una vez grabada la tarjeta y arrancada, la Pi es autónoma:

  • El servicio OAAT arranca en el boot
  • Reinicio automático en caso de crash (systemd Restart=always)
  • Reconexión automática si el controlador se desconecta
  • Actualización posible por SSH

Enlaces útiles:

Guía redactada por MozAIk Labs — mayo de 2026