Tune by Mozaiklabs

将树莓派打造成 OAAT 音频端点

将树莓派打造成 bit-perfect 的 OAAT 音频端点

Raspberry Pi 4 + Audiophonics ESS 9038 DAC — endpoint OAAT

本指南将一步步带你把 Raspberry Pi 3B+ 或 4 配置为使用 OAAT(Open Advanced Audio Transport)协议的高保真音频端点。

OAAT 是一个开源协议,定位为 Roon 私有 RAAT 协议的开放替代方案:

  • Bit-perfect 音频 —— PCM 最高 768 kHz / 32 bit,原生 DSD 最高 DSD512
  • 多房间同步 —— 各端点之间误差小于 1 ms,基于 PTP 时钟
  • 格式协商 —— 控制器自动适配 DAC 的能力
  • 无缝播放(Gapless) —— 即使切换格式也不会中断
  • 零配置 —— mDNS/DNS-SD 发现,无需输入任何 IP
  • 开源 —— Apache 2.0,Rust 代码托管于 GitHub

OAAT 与其他协议的对比

  • OAAT:开源、bit-perfect、原生 DSD、多房间同步小于 1 ms
  • RAAT (Roon):bit-perfect、支持 DSD、多房间 —— 但私有且封闭
  • DLNA/UPnP:开源 —— 但没有多房间同步,gapless 表现随机,DSD 仅支持 DoP
  • AirPlay 2:Apple 多房间 —— 但非 bit-perfect,不支持 DSD,生态封闭

树莓派是理想的搭档:35-75 欧元、静音(无风扇),并带有原生 I2S 总线,可通过 GPIO 直连 DAC —— 这是最短、最纯净的音频路径。

OAAT 架构

graph LR
    A["🎵 Tune Server
(контроллер)"] -->|"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

所需硬件

树莓派

  • RPi 4B(2 或 4 GB) —— 最高 PCM:384 kHz / 32 bit —— ✅ 推荐
  • RPi 3B+ —— 最高 PCM:192 kHz / 32 bit —— 预算 / 二手方案
  • RPi 5 —— 最高 PCM:384 kHz / 32 bit —— 同样可用

RPi 3B+ 受其 I2S 总线限制,最高只到 192 kHz。若需要更高的 hi-res(352.8 / 384 kHz),请选择 RPi 4。

I2S DAC(HAT)

OAAT 支持所有兼容树莓派的 I2S DAC。以下是最常见的几款:

  • Audiophonics ESS 9038Q2M(ESS ES9038Q2M)—— 384 kHz / 32 bit —— 约 120 欧 —— overlay:i-sabre-q2m —— 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

⚠️ 重要:Linux overlay 必须与你的 DAC 完全对应。overlay 错误 = 没有声音(ALSA 报错 -121 或 -22)。

配件

  • microSD 卡:最低 8 GB(推荐 16 GB)
  • 电源:树莓派官方电源或 5V/3A USB-C(RPi 4)/ micro-USB(RPi 3)
  • 以太网线:为音频稳定性推荐使用(WiFi 可用,但会在时钟同步上增加约 50 ms 抖动)
  • 机箱(可选):Audiophonics 提供 Pi + DAC 的一体化机箱

烧写 SD 卡

1. 安装 Raspberry Pi Imager

  • macOS:brew install --cask raspberry-pi-imager
  • Windows:下载安装程序
  • Linux:sudo apt install rpi-imager

2. 配置并烧写

  1. 打开 Raspberry Pi Imager
  2. 选择设备:Raspberry Pi 3 或 4
  3. 选择系统:Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit) —— 无需桌面版
  4. 选择存储:你的 microSD 卡
  5. 点击齿轮图标(⚙️)进行配置:
    • 主机名:oaat-endpoint
    • 启用 SSH:是,使用密码
    • 用户名 / 密码:自行设定
    • WiFi:若无以太网则需配置
    • 时区:Europe/Paris
  6. 开始烧写 —— 约 2-3 分钟

3. 首次启动

  1. 将 SD 卡插入树莓派
  2. 把 DAC HAT 装到 GPIO 上(如尚未安装)
  3. 接上以太网 + 电源
  4. 等待 1-2 分钟(首次启动稍慢)
  5. 通过 SSH 连接:
ssh pi@oaat-endpoint.local

小技巧:要找到树莓派的 IP,可查看路由器/光猫的管理界面,或使用 arp -a | grep raspberry。


安装

流程总览

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

自动安装(推荐)

一条命令搞定全部:

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

脚本会让你在 6 款受支持的 DAC 中选择你的型号,然后:

  1. 安装系统依赖(ALSA、构建工具)
  2. 在 /boot/config.txt 中配置 DAC 的 overlay
  3. 配置 ALSA(/etc/asound.conf)
  4. 安装 Rust 并从源码编译 OAAT
  5. 安装 systemd 服务

编译时间:

  • RPi 4:release 模式约 8 分钟
  • RPi 3B+:release 模式约 20 分钟(脚本会自动处理 swap)

安装完成后:

sudo reboot

重启是启用 DAC overlay 的必要步骤。重启后,OAAT 服务会自动启动。

手动安装(逐步)

如果你更愿意掌控每一步:

1. 系统依赖

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

2. 配置 DAC

编辑 /boot/firmware/config.txt(或 /boot/config.txt,取决于系统版本):

# 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. 配置 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. 安装 Rust 并编译

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. systemd 服务与重启

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

配置

配置文件位于 /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"

建议:

  • pcm_max_rate:不要声明超过 DAC 实际支持的规格。若源文件规格更高,OAAT 会自动向下协商。
  • flac = true:推荐开启,尤其在 WiFi 下。FLAC 是无损的,音质零损失,并可将带宽降低约 50-60%。
  • name:取一个有意义的名字,它会作为播放区域显示在 Tune 中。

各 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 —— 技术细节

ES9038Q2M 支持 S16_LE 与 S32_LE 格式,采样率最高 384 kHz(DSD 模式下甚至可达 1.536 MHz),并提供进阶 ALSA 控制项:

  • 数字音量:0-100(-100 dB 至 0 dB)
  • FIR 滤波器:7 种类型(brick wall、minimum phase、linear phase……)
  • 输入选择:I2S / SPDIF

Linux 驱动使用 I2C 地址 0x48。在较新的 Raspberry Pi OS Bookworm 上,i-sabre-q2m overlay 通常已包含在内核中。若内核较旧,可从 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

验证与首次出声

1. 确认 DAC 已被识别:

aplay -l
# Doit afficher votre DAC comme carte 0

2. 直接测试声音(不经过 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. 检查 OAAT 服务:

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

4. 验证 mDNS 发现(从另一台设备):

# macOS
dns-sd -B _oaat._tcp

# Linux
avahi-browse -r _oaat._tcp

5. 通过 OAAT 播放第一声!

在你的电脑上(已安装 oaat CLI):

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

如果你听到了 440 Hz 的标准音 A:你的 OAAT 端点已经正常工作,而且是 bit-perfect 的!🎉

6. 完整一致性测试:

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

配合 Tune 使用

Tune 是一个自托管音乐服务器,原生集成 OAAT。

如果 Tune 与你的树莓派在同一个局域网中,OAAT 端点会自动作为播放区域出现在 Web 界面里,无需任何额外配置。

在 Tune 中,OAAT 端点的优先级高于 DLNA 和 AirPlay,因为它提供了最直接、最忠实的音频路径。

格式协商完全透明:

  • 源为 24/96,DAC 支持 384/32 → 以原生 24/96 播放(不做无意义的升采样)
  • 源为 24/192,DAC 最高支持 96 → Tune 降采样到 24/96(同属 48 kHz 家族)
  • 源为 DSD,DAC 不支持 DSD → 透明转换为 PCM

故障排查

没有声音

  • aplay -l 未列出任何声卡 → DAC overlay 缺失或错误。检查 /boot/firmware/config.txt,修正 overlay 后重启。
  • speaker-test 报错 -121 → 该 DAC 的 overlay 不对。尝试其他 overlay(参见上文列表)。
  • speaker-test 正常但 OAAT 无声 → 服务未启动或配置有误。用 systemctl status oaat-endpoint 与 journalctl -u oaat-endpoint -f 检查。
  • 声音有杂音或跳帧 → WiFi 不稳定。改用以太网。

Tune 发现不到端点

  • 确认 Tune 与树莓派处于同一子网
  • 若使用 VPN(NordVPN 等):启用 nordvpn set lan-discovery on
  • 检查防火墙:端口 9740(TCP)、9741(UDP)、9742(UDP)与 5353(mDNS)必须开放
  • 手动测试 mDNS 发现(见「验证」一节)

服务无法启动

# 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 与 RPi 4 对比

  • I2S 最高 PCM:RPi 3B+ = 192 kHz / RPi 4 = 384 kHz
  • 编译时间:RPi 3 约 20 分钟 / RPi 4 约 8 分钟
  • 内存:RPi 3 = 1 GB(建议开 swap)/ RPi 4 = 2-8 GB
  • 以太网:RPi 3 = 100 Mbps(经 USB)/ RPi 4 = 原生千兆

对于 16/44.1(CD)到 24/192(hi-res),RPi 3B+ 表现完全够用。如果你主要听 CD 规格的 FLAC 或 Qobuz 24/96,一台 25 欧的二手 RPi 3 完全胜任。

Audiophonics ESS 9038Q2M:找不到 overlay

在某些 Raspberry Pi OS 版本中,内核并未包含 i-sabre-q2m overlay。症状:

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

解决办法:从源码编译驱动(见上文「配置」一节)。


进阶

更新端点

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

同步的多房间播放

同一网络下的两台(或更多)树莓派可以实现小于 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

每个端点收到相同的音频数据包以及相同的呈现时间戳(PTS)。PTP 同步会自动校正各树莓派之间的时钟差异。

在 Tune 中,只需创建一个包含多个端点的分组区域,即可启用多房间播放。

网络性能

  • PCM 16/44.1 立体声:1.41 Mbps
  • PCM 24/192 立体声:9.22 Mbps
  • PCM 32/384 立体声:24.58 Mbps
  • FLAC 24/192 立体声:约 4 Mbps(压缩约 50%)

多房间同步建议使用以太网。单个端点用 WiFi 完全没问题。

完全无头运行

这里描述的方案已经是 100% headless。烧写并启动之后,树莓派即可自主运行:

  • OAAT 服务开机自启
  • 崩溃后自动重启(systemd Restart=always)
  • 控制器断开后自动重连
  • 可通过 SSH 更新

实用链接:

本指南由 MozAIk Labs 撰写 —— 2026 年 5 月