Convertir una Raspberry Pi en endpoint de audio OAAT
Convertir una Raspberry Pi en endpoint de audio bit-perfect con 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
- Abrir Raspberry Pi Imager
- Elegir el dispositivo: Raspberry Pi 3 o 4
- Elegir el SO:
Raspberry Pi OS (other)→ Raspberry Pi OS Lite (64-bit) — no hace falta el Desktop - Elegir el almacenamiento: tu tarjeta microSD
- 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
- Hostname:
- Grabar — unos 2-3 minutos
3. Primer arranque
- Insertar la tarjeta SD en la Pi
- Conectar el DAC HAT al GPIO (si no está ya montado)
- Conectar Ethernet + alimentación
- Esperar 1-2 minutos (el primer boot es algo más largo)
- 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:
- Instala las dependencias del sistema (ALSA, herramientas de build)
- Configura el overlay del DAC en
/boot/config.txt - Configura ALSA (
/etc/asound.conf) - Instala Rust y compila OAAT desde las fuentes
- 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 -lno lista ninguna tarjeta → Overlay del DAC ausente o incorrecto. Verifica/boot/firmware/config.txt, corrige el overlay y reinicia.speaker-testdevuelve un error-121→ Overlay incorrecto para ese DAC. Prueba otro overlay (ver la lista de arriba).speaker-testfunciona pero OAAT no → Servicio no arrancado o configuración incorrecta. Comprueba consystemctl status oaat-endpointyjournalctl -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:
- Código fuente de OAAT (Apache 2.0)
- Especificación RFC de OAAT
- Driver Audiophonics ESS 9038Q2M
- Audiophonics — DAC I2S y cajas para RPi
Guía redactada por MozAIk Labs — mayo de 2026