Tune by Mozaiklabs

Raspberry Pi를 OAAT 오디오 엔드포인트로 만들기

OAAT로 Raspberry Pi를 비트퍼펙트 오디오 엔드포인트로 만들기

Raspberry Pi 4 + Audiophonics ESS 9038 DAC — endpoint OAAT

이 가이드는 Raspberry Pi 3B+ 또는 4를 OAAT(Open Advanced Audio Transport) 프로토콜을 사용하는 하이파이 오디오 엔드포인트로 설정하는 과정을 단계별로 안내합니다.

OAAT는 Roon의 독점 프로토콜인 RAAT에 대한 개방형 대안으로 설계된 오픈소스 프로토콜입니다:

  • 비트퍼펙트 오디오 — PCM 최대 768 kHz / 32비트, DSD512까지 네이티브 DSD
  • 멀티룸 동기화 — PTP 클럭 기반, 엔드포인트 간 1 ms 미만
  • 포맷 협상 — 컨트롤러가 DAC의 성능에 자동으로 맞춰짐
  • 갭리스 — 포맷이 바뀌는 순간에도 끊김 없는 전환
  • 제로 컨피그 — mDNS/DNS-SD 디스커버리, IP 입력 불필요
  • 오픈소스 — Apache 2.0, Rust 코드는 GitHub에

OAAT와 다른 프로토콜 비교

  • OAAT : 오픈소스, 비트퍼펙트, 네이티브 DSD, 멀티룸 동기화 1 ms 미만
  • RAAT (Roon) : 비트퍼펙트, DSD, 멀티룸 — 하지만 독점적이고 폐쇄적
  • DLNA/UPnP : 오픈소스 — 하지만 멀티룸 동기화 없음, 갭리스 불안정, DSD는 DoP만 지원
  • AirPlay 2 : Apple 멀티룸 — 하지만 비트퍼펙트 아님, DSD 미지원, 폐쇄적 생태계

Raspberry Pi는 이상적인 파트너입니다: 35-75 €, 무소음(팬 없음), 그리고 DAC를 GPIO에 직결하는 네이티브 I2S 버스 — 가장 짧고 가장 순수한 오디오 경로입니다.

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

필요한 하드웨어

Raspberry Pi

  • RPi 4B (2 또는 4 GB) — 최대 PCM : 384 kHz / 32비트 — ✅ 권장
  • RPi 3B+ — 최대 PCM : 192 kHz / 32비트 — 저예산 / 중고
  • RPi 5 — 최대 PCM : 384 kHz / 32비트 — 역시 동작함

RPi 3B+는 I2S 버스 때문에 192 kHz로 제한됩니다. 그 이상의 하이레스(352.8 / 384 kHz)를 원한다면 RPi 4를 선택하세요.

I2S DAC (HAT)

OAAT는 Raspberry Pi 호환 I2S DAC를 모두 지원합니다. 가장 흔한 모델들은 다음과 같습니다:

  • Audiophonics ESS 9038Q2M (ESS ES9038Q2M) — 384 kHz / 32비트 — 약 120 € — 오버레이 : i-sabre-q2m — Linux 드라이버
  • HifiBerry DAC2 HD (PCM1796) — 192 kHz / 24비트 — 약 65 € — 오버레이 : hifiberry-dacplushd
  • HifiBerry DAC+ Pro (PCM5122) — 192 kHz / 32비트 — 약 45 € — 오버레이 : hifiberry-dacplus
  • Allo Boss (PCM5122) — 384 kHz / 32비트 — 약 50 € — 오버레이 : allo-boss-dac-pcm512x-audio
  • IQaudio DAC+ (PCM5122) — 192 kHz / 24비트 — 약 30 € — 오버레이 : iqaudio-dacplus
  • JustBoom DAC HAT (PCM5122) — 384 kHz / 32비트 — 약 35 € — 오버레이 : justboom-dac

⚠️ 중요 : Linux 오버레이는 사용하는 DAC와 정확히 일치해야 합니다. 오버레이가 잘못되면 소리가 나지 않습니다(ALSA 오류 -121 또는 -22).

액세서리

  • microSD 카드 : 최소 8 GB (16 GB 권장)
  • 전원 : RPi 공식 어댑터 또는 5V/3A USB-C (RPi 4) / micro-USB (RPi 3)
  • 이더넷 케이블 : 오디오 안정성을 위해 권장 (WiFi도 동작하지만 클럭 동기화에 약 50 ms의 지터가 추가됨)
  • 케이스 (선택) : Audiophonics에서 Pi + DAC 통합 케이스를 판매합니다

SD 카드 플래싱

1. Raspberry Pi Imager 설치

2. 설정 및 플래싱

  1. Raspberry Pi Imager 실행
  2. 장치 선택 : Raspberry Pi 3 또는 4
  3. OS 선택 : Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit) — 데스크톱 버전은 필요 없음
  4. 저장소 선택 : 사용할 microSD 카드
  5. 톱니바퀴(⚙️)를 클릭해 설정 :
    • Hostname : oaat-endpoint
    • SSH 활성화 : 예, 비밀번호 방식
    • 사용자 이름 / 비밀번호 : 원하는 대로
    • WiFi : 이더넷이 없다면 설정
    • 시간대 : Europe/Paris
  6. 플래싱 — 2~3분 소요

3. 첫 부팅

  1. SD 카드를 Pi에 삽입
  2. DAC HAT를 GPIO에 장착 (아직 장착하지 않았다면)
  3. 이더넷 + 전원 연결
  4. 1~2분 대기 (첫 부팅은 조금 더 오래 걸림)
  5. SSH로 접속 :
ssh pi@oaat-endpoint.local

팁 : Pi의 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 오버레이 설정
  3. ALSA 설정 (/etc/asound.conf)
  4. Rust 설치 및 소스에서 OAAT 컴파일
  5. systemd 서비스 설치

컴파일 시간 :

  • RPi 4 : release 빌드 약 8분
  • RPi 3B+ : release 빌드 약 20분 (스크립트가 스왑을 자동으로 처리)

설치 후:

sudo reboot

DAC 오버레이를 활성화하려면 재부팅이 필요합니다. 재부팅 후 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(OS 버전에 따라 /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 오버레이가 보통 커널에 포함되어 있습니다. 더 오래된 커널이라면 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 엔드포인트가 정상 작동하며 비트퍼펙트입니다! 🎉

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이 RPi와 같은 로컬 네트워크에서 실행 중이라면, OAAT 엔드포인트가 웹 인터페이스에 재생 존으로 자동으로 나타납니다. 추가 설정은 전혀 필요 없습니다.

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 오버레이가 없거나 잘못됨. /boot/firmware/config.txt를 확인해 오버레이를 수정하고 재부팅하세요.
  • speaker-test가 -121 오류를 냄 → 해당 DAC에 맞지 않는 오버레이. 다른 오버레이를 시도하세요(위 목록 참조).
  • speaker-test는 되는데 OAAT는 안 됨 → 서비스가 시작되지 않았거나 설정이 잘못됨. systemctl status oaat-endpoint와 journalctl -u oaat-endpoint -f로 확인하세요.
  • 소리가 지직거리거나 끊김 → WiFi 불안정. 이더넷으로 전환하세요.

Tune이 엔드포인트를 찾지 못함

  • Tune과 RPi가 같은 서브넷에 있는지 확인
  • 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 vs RPi 4

  • I2S 최대 PCM : RPi 3B+ = 192 kHz / RPi 4 = 384 kHz
  • 컴파일 시간 : RPi 3 약 20분 / RPi 4 약 8분
  • RAM : RPi 3 = 1 GB (스왑 권장) / RPi 4 = 2-8 GB
  • 이더넷 : RPi 3 = 100 Mbps (USB 경유) / RPi 4 = 네이티브 기가비트

RPi 3B+는 16/44.1(CD)부터 24/192(하이레스)까지 완벽하게 동작합니다. 주로 CD급 FLAC이나 Qobuz 24/96을 듣는다면 25 €짜리 중고 RPi 3으로도 충분합니다.

Audiophonics ESS 9038Q2M : 오버레이를 찾을 수 없음

일부 Raspberry Pi OS 버전에서는 i-sabre-q2m 오버레이가 커널에 포함되어 있지 않습니다. 증상:

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

동기화된 멀티룸

같은 네트워크에 있는 두 대 이상의 Raspberry Pi를 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 동기화가 Pi 간의 클럭 차이를 자동으로 보정합니다.

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% 헤드리스입니다. 플래싱 후 부팅되고 나면 Pi는 완전히 자율적으로 동작합니다:

  • 부팅 시 OAAT 서비스 자동 시작
  • 크래시 시 자동 재시작 (systemd Restart=always)
  • 컨트롤러 연결이 끊기면 자동 재연결
  • SSH로 업데이트 가능

유용한 링크 :

작성: MozAIk Labs — 2026년 5월