install.sh now sets the hostname (default radxa-mixer, --hostname or --keep-hostname to override) after a successful install so Avahi advertises NAME.local, and the web mixer listens on port 80. The web server's host check already accepts HOSTNAME.local. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
266 lines
14 KiB
Markdown
266 lines
14 KiB
Markdown
# Radxa 무선 오디오 믹서
|
|
|
|
AirPlay 2와 블루투스 오디오 입력을 동시에 섞어 USB DAC 또는 블루투스
|
|
헤드폰·스피커 한 대로 출력하는 설치 자료입니다.
|
|
|
|
검증 기준은 **Radxa Zero 3W / RAM 1 GB / Armbian 26.8.3 / Debian 13 trixie /
|
|
커널 6.1.115-vendor-rk35xx**입니다. 다른 Radxa도 같은 OS와 오디오·블루투스
|
|
지원이 있으면 이 구성으로 시도할 수 있지만, 모든 보드의 무선 드라이버를
|
|
검증한 것은 아닙니다. 설치기는 Debian 13 외의 OS에서는 작업을 중단합니다.
|
|
|
|
## 구성
|
|
|
|
```text
|
|
Mac/iPhone의 AirPlay 2 ── Shairport Sync ─┐
|
|
├─ ALSA 스테레오 믹서 ─ USB DAC
|
|
휴대폰 등의 Bluetooth ── BlueALSA ───────┘ 또는
|
|
Loopback → Bluetooth 헤드폰/스피커
|
|
```
|
|
|
|
- AirPlay 2: Shairport Sync **5.5.2**, NQPTP **1.2.8**, 공유 메모리 규격 smi10. 웹 제어용 D-Bus 지원과 네이티브 볼륨 패치를 포함합니다.
|
|
- Bluetooth: Debian의 BlueALSA 패키지. 기준 보드 버전 **4.3.1**.
|
|
- 수신과 송신은 A2DP 음악 프로필을 사용합니다. 기준 보드에서는 SBC로 연결됐습니다.
|
|
- SBC 송신 품질은 medium입니다. 기준 보드에서 high로 동시 수신·송신 시 끊겨
|
|
전송량을 줄였습니다. 믹서·입력·송신 버퍼는 각 200 ms이며, 이 조합에서 끊김 없는 청취를 확인했습니다.
|
|
- DAC 출력은 44.1 kHz / 스테레오 / 16비트, 블루투스용 가상 믹서는 48 kHz입니다.
|
|
- 각 입력을 3 dB 낮춥니다. 여러 입력의 큰 소리가 겹쳐 찢어지면 입력 볼륨을 낮추세요. 지연 없는 실시간 녹음/악기 모니터링용 구성은 아닙니다.
|
|
- 각 송신 기기의 볼륨으로 믹스 비율을 바꿉니다.
|
|
- 출력은 DAC 또는 블루투스 중 하나를 선택합니다. 양쪽 동시 출력은 구현하지 않았습니다.
|
|
|
|
## 웹 믹서
|
|
|
|
설치 후 브라우저에서 **`http://radxa-mixer.local`**을 여세요.
|
|
설치 시 보드의 호스트 이름을 `radxa-mixer`로 바꾸며(`--hostname 이름`으로 변경,
|
|
`--keep-hostname`으로 유지), Avahi(mDNS)가 `이름.local`을 알립니다.
|
|
`.local`이 안 열리는 기기에서는 `http://보드IP`를 사용합니다.
|
|
현재 보드는 `http://192.168.10.83`이며, USB 관리 연결에서는
|
|
주소가 유지돼 있다면 `http://10.55.0.1`을 사용합니다. 웹은 80번 포트입니다.
|
|
|
|
- AirPlay 및 연결된 Bluetooth 입력별 볼륨·음소거.
|
|
- AirPlay는 Shairport Sync의 **기존 네이티브 볼륨**을 사용합니다.
|
|
별도 ALSA softvol이나 추가 감쇠 단계는 만들지 않았습니다.
|
|
- Bluetooth 볼륨 API는 A2DP 입력 PCM만 허용하며 DAC/헤드폰 출력 볼륨을 거부합니다.
|
|
- DAC 선택, 등록한 Bluetooth 헤드폰·스피커 선택, 새 출력 장비 검색·페어링.
|
|
- 출력 전환은 비동기로 실행하고 결과를 화면에 표시합니다.
|
|
- LAN용 화면입니다. 인터넷 포트 개방은 하지 않습니다.
|
|
같은 네트워크의 접속자는 화면에서 제어할 수 있으며 별도 로그인은 없습니다.
|
|
상태 변경에는 요청 토큰과 동일 출처 검증을 사용합니다.
|
|
- **Bluetooth 입력 등록**: 2/5/15분 동안 보드를 휴대폰 검색 목록에 표시하고,
|
|
남은 시간을 보여 주며 언제든 끌 수 있습니다. 이 시간 안에 연결한 기기는 자동으로
|
|
승인·신뢰 등록됩니다. 근처의 다른 사람도 연결할 수 있으니 등록 후 꺼 주세요.
|
|
- 웹 서버는 `radxa-mixer-web.service`로 자동 시작합니다.
|
|
|
|
명령어도 계속 사용할 수 있습니다:
|
|
|
|
```bash
|
|
sudo radxa-audio inputs
|
|
sudo radxa-audio volume airplay 60
|
|
sudo radxa-audio mute airplay on
|
|
sudo radxa-audio mute airplay off
|
|
sudo radxa-audio volume AA:BB:CC:DD:EE:FF 70
|
|
sudo radxa-audio mute AA:BB:CC:DD:EE:FF on
|
|
sudo radxa-audio output dac --pcm hw:CARD=Audio,DEV=0
|
|
```
|
|
|
|
AirPlay의 볼륨은 원래 프로토콜 범위 −30~0 및 음소거 −144를 0~100으로 표시합니다.
|
|
Bluetooth는 원래 입력 PCM의 볼륨을 사용합니다. 송신 기기의 볼륨 변경도 같은 입력에
|
|
적용됩니다. 출력 장비 볼륨과 이퀄라이저는 웹 화면에 제공하지 않습니다.
|
|
|
|
`sudo radxa-audio apply`는 출력 장비가 꺼져 있어도 **이미 저장한 출력 경로**를
|
|
다시 적용할 수 있습니다. 새 출력 장비 선택에는 여전히 연결 확인이 필요합니다.
|
|
|
|
기존 보드에서 웹 기능을 추가하려면 전체 `install.sh`로 D-Bus 빌드를 설치하거나,
|
|
이미 D-Bus 지원 바이너리가 설치돼 있다면 `sudo bash scripts/install-web.sh` 후
|
|
`sudo radxa-audio apply`를 실행합니다. 전체 설치는 기본 DAC 출력으로 설정하므로
|
|
이후 원하는 Bluetooth 출력을 다시 선택하세요.
|
|
|
|
## 1. 새 보드 준비
|
|
|
|
1. Debian 13 기반 Armbian을 설치하고 인터넷에 연결합니다.
|
|
2. USB DAC를 꽂고 `aplay -l`에서 카드 이름을 확인합니다.
|
|
3. 이 폴더 전체를 보드에 복사합니다. `sources/`도 필요합니다.
|
|
|
|
맥에서 실행할 예:
|
|
|
|
```bash
|
|
scp -r /Users/jsahn/Personal_works/Radxa_MIXER root@새보드IP:/root/
|
|
ssh root@새보드IP
|
|
```
|
|
|
|
그다음 보드에서:
|
|
|
|
```bash
|
|
cd /root/Radxa_MIXER
|
|
aplay -l
|
|
sudo bash install.sh --name "Radxa Desk" --dac hw:CARD=Audio,DEV=0
|
|
```
|
|
|
|
`Audio`는 현재 Realtek USB DAC의 ALSA 카드 ID입니다. 새 DAC가 `Device`라면
|
|
`--dac hw:CARD=Device,DEV=0`으로 바꾸세요. `card 1` 같은 숫자는 부팅마다 바뀔 수
|
|
있으므로 이름을 사용합니다. 새 보드의 장치 이름은 기존 `Radxa Audio`와 구별해 주세요.
|
|
|
|
**동일한 AIC 드라이버의 Zero 3W**에서 이전처럼 AirPlay가 끊긴다면:
|
|
|
|
```bash
|
|
sudo bash install.sh --name "Radxa Desk" --dac hw:CARD=Audio,DEV=0 --wifi5
|
|
```
|
|
|
|
`--wifi5`는 `aic8800_fdrv`의 `ps_on=0 he_on=0`을 부팅 설정으로 저장합니다.
|
|
다른 드라이버에는 적용하지 않으며, 지원 옵션이 없으면 설치를 중단합니다.
|
|
설정 적용은 다음 재부팅부터입니다. 설치 중 자동으로 재부팅하지 않습니다.
|
|
|
|
설치에는 apt 인터넷 연결이 필요합니다. 공식 소스는 이 폴더에 포함돼 있어
|
|
GitHub에 접속할 필요가 없습니다. 1 GB 보드의 빌드 메모리를 고려해 기본은
|
|
`make -j 1`이며 몇 분 이상 걸릴 수 있습니다. OS 전체 업그레이드는 하지 않습니다.
|
|
|
|
기본 출력은 **DAC**입니다. Wi-Fi 비밀번호, USB gadget 주소 `10.55.0.1`,
|
|
netplan/NetworkManager 설정은 이 설치기가 변경하지 않습니다.
|
|
|
|
## 2. AirPlay 사용
|
|
|
|
MacBook 또는 아이폰의 출력에서 설치할 때 정한 이름을 선택합니다.
|
|
Mac과 Radxa는 Bonjour/mDNS가 통하는 같은 네트워크에 있어야 합니다.
|
|
게스트 Wi-Fi의 기기 격리 기능이 켜져 있으면 발견되지 않을 수 있습니다.
|
|
|
|
## 3. 휴대폰을 블루투스 입력으로 연결
|
|
|
|
가장 쉬운 방법은 웹 믹서의 **Bluetooth 입력 등록 → 검색 허용 켜기**입니다.
|
|
켜 둔 동안 휴대폰 Bluetooth 설정에 `<AirPlay 이름> Bluetooth`가 나타나며,
|
|
선택하면 자동으로 승인·신뢰 등록됩니다. 같은 기능의 명령:
|
|
|
|
```bash
|
|
sudo radxa-audio discoverable on --seconds 300
|
|
sudo radxa-audio discoverable off
|
|
```
|
|
|
|
검색 허용은 임시 서비스 `radxa-bt-pairing.service`로 동작하며 시간이 지나면
|
|
자동으로 꺼집니다. 기본 상태는 검색 숨김이지만, 이미 등록한 기기는 연결할 수 있습니다.
|
|
|
|
서비스 승인을 직접 확인하려면 보드의 SSH 터미널에서:
|
|
|
|
```bash
|
|
sudo radxa-audio pair-input --seconds 120
|
|
```
|
|
|
|
- 터미널을 열어 둔 채 휴대폰 Bluetooth 설정에서 `Radxa Desk Bluetooth`를 선택합니다.
|
|
- 터미널에 본인 휴대폰의 오디오 서비스 승인 질문이 나오면 `yes`를 입력합니다.
|
|
- 완료되면 `quit`을 입력합니다. 검색/페어링 모드는 종료 시 자동으로 닫힙니다.
|
|
- 휴대폰을 신뢰 장치로 등록해, 다음 연결에서 같은 승인 대기가 생기지 않도록 합니다.
|
|
|
|
```bash
|
|
sudo radxa-audio devices
|
|
sudo radxa-audio pair 휴대폰MAC주소
|
|
```
|
|
|
|
이미 페어링돼 있으면 `pair` 명령은 해당 상태를 확인하고 신뢰 등록 및 오디오
|
|
연결을 진행합니다. 휴대폰의 출력 목록에서 `Radxa Desk Bluetooth`를 선택하세요.
|
|
|
|
## 4. 블루투스 출력 장비 연결 및 변경
|
|
|
|
보스 QC SC는 전원 스위치를 Bluetooth 표시 쪽으로 **약 3초** 유지해
|
|
`Ready to connect` 안내와 파란 LED 점멸이 나오도록 합니다.
|
|
다른 장비는 제조사의 페어링 모드를 켜세요.
|
|
|
|
```bash
|
|
sudo radxa-audio scan --seconds 30
|
|
sudo radxa-audio pair AA:BB:CC:DD:EE:FF --output
|
|
```
|
|
|
|
`AA:BB:CC:DD:EE:FF`를 검색 결과의 **헤드폰/스피커 주소**로 바꿉니다.
|
|
이 명령은 페어링 → 신뢰 등록 → 음악 프로필 연결 → 출력 전환을 진행합니다.
|
|
이후 다른 헤드폰으로 바꾸려면 새 헤드폰을 검색하고 같은 명령을 실행하면 됩니다.
|
|
|
|
`bluetoothctl info 주소`에서 `Paired: yes`여도 `Bonded: no`이면 임시 연결입니다.
|
|
재부팅 후 등록을 유지하려면 장비를 페어링 모드로 켠 뒤
|
|
`sudo radxa-audio pair 주소 --output --bond`를 사용하세요. 웹의 새 장비 등록도
|
|
영구 등록 성공을 확인하며, 인증 실패는 성공으로 표시하지 않습니다.
|
|
임시 등록만 남은 장비는 기록을 지운 뒤 하나의 bluetoothctl 세션에서 다시 페어링합니다.
|
|
이미 영구 등록된 장비는 다시 페어링하지 않습니다.
|
|
|
|
이미 등록한 장비로 전환:
|
|
|
|
```bash
|
|
sudo radxa-audio output bluetooth AA:BB:CC:DD:EE:FF
|
|
```
|
|
|
|
마지막으로 선택한 블루투스 장비를 다시 사용:
|
|
|
|
```bash
|
|
sudo radxa-audio output bluetooth
|
|
```
|
|
|
|
DAC로 복귀:
|
|
|
|
```bash
|
|
sudo radxa-audio output dac
|
|
```
|
|
|
|
출력 전환 후 AirPlay를 다시 선택해야 할 수 있습니다. 블루투스 출력 장비가
|
|
연결되지 않으면 **현재 DAC 출력을 바꾸기 전에 오류로 중단**합니다.
|
|
서비스 시작 중 실패하면 변경 직전 설정으로 복구합니다.
|
|
|
|
헤드폰을 믹서 출력으로 시험할 때는 헤드폰을 휴대폰이나 Mac에 직접 연결한
|
|
경로 대신 Radxa 경로를 사용하세요. 헤드폰의 멀티포인트 자동 전환이 끼어들면
|
|
믹서의 소리가 아닌 다른 기기의 소리를 들을 수 있습니다.
|
|
|
|
## 5. 일상 관리
|
|
|
|
```bash
|
|
sudo radxa-audio status # 현재 출력/서비스/오디오 연결
|
|
sudo radxa-audio devices # Bluetooth 목록 + DAC 목록
|
|
sudo radxa-audio name "Radxa Living Room" # AirPlay/블루투스 표시 이름
|
|
sudo radxa-audio dac hw:CARD=Device,DEV=0 # 다른 DAC로 설정
|
|
sudo radxa-audio apply # 저장한 설정 다시 적용
|
|
```
|
|
|
|
이전의 `radxa-audio-output dac` / `bose` 명령도 호환 래퍼로 제공합니다.
|
|
`bose`는 마지막으로 설정한 블루투스 출력 장비를 뜻하며, 보스 주소가 고정돼 있지 않습니다.
|
|
|
|
관리 설정: `/etc/radxa-audio/mixer.json`.
|
|
관리 명령은 여기에 저장한 값을 기준으로 ALSA/systemd 설정을 생성합니다.
|
|
`/etc/asound.conf`나 서비스 파일을 직접 편집하면 다음 관리 명령에서 덮어쓸 수 있으므로,
|
|
이름·DAC·출력 변경은 위 명령을 사용하세요.
|
|
|
|
## 6. 백업과 복구
|
|
|
|
설치 전 기존 파일과 서비스 상태는 `/var/backups/radxa-audio-install/날짜-번호/`에
|
|
저장됩니다. 설치 실패 시 이 상태로 자동 복구를 시도합니다.
|
|
|
|
설치 완료 후에도 원래 상태로 복구할 수 있습니다:
|
|
|
|
```bash
|
|
sudo python3 scripts/backup.py restore /var/backups/radxa-audio-install/실제백업이름
|
|
```
|
|
|
|
복구는 설치기가 관리하는 설정·로컬 바이너리·서비스 상태를 대상으로 합니다.
|
|
apt로 추가한 의존 패키지와 블루투스 페어링 기록은 유지합니다.
|
|
운영 중 장비 변경 전 설정 백업은 `/var/backups/radxa-audio/`에 별도로 저장됩니다.
|
|
|
|
## 파일 안내
|
|
|
|
| 파일 | 용도 |
|
|
|---|---|
|
|
| `install.sh` | 새 보드 설치, 빌드, 서비스 설정, 실패 시 복구 |
|
|
| `scripts/radxa-audio.py` | 페어링/출력/이름/DAC 관리 |
|
|
| `scripts/web_server.py`, `scripts/input_controls.py`, `scripts/web/` | 웹 화면/API 및 입력 전용 볼륨 제어 |
|
|
| `scripts/install-web.sh` | 웹 서비스 설치/갱신 |
|
|
| `sources/shairport-native-volume.patch` | 기존 AirPlay 볼륨을 현재 세션에 적용 |
|
|
| `scripts/backup.py` | 설치 전 백업/복원 |
|
|
| `scripts/check-build.sh` | 서비스 변경 없이 고정 소스 빌드 확인 |
|
|
| `sources/*.bundle`, `manifest.json` | 공식 Git 소스, 릴리스 태그, 커밋, SHA-256 |
|
|
| `tests/test_manager.py` | 입력 검증, 안전한 전환, 실패 복구 검사 |
|
|
| `TROUBLESHOOTING.md` | 검색/연결/무음/끊김 문제 해결 |
|
|
| `VALIDATION.md` | 실제 검증 범위와 남은 검증 |
|
|
| `reference/` | 기존 보드 설정 참고. 새 보드에 그대로 복사하지 않습니다. |
|
|
|
|
## 원본 프로젝트
|
|
|
|
- [Shairport Sync](https://github.com/mikebrady/shairport-sync)
|
|
- [NQPTP](https://github.com/mikebrady/nqptp)
|
|
- [BlueALSA](https://github.com/arkq/bluez-alsa)
|
|
- [BlueALSA와 dmix/Loopback 구성](https://github.com/arkq/bluez-alsa/wiki/Using-bluealsa-with-dmix)
|
|
- [Bose QC SC 페어링 안내](https://www.bose.com/p/headphones/bose-quietcomfort-sc-headphones/QCSC-HEADPHONEARN.html)
|
|
|
|
Git bundle 안에 각 원본 프로젝트의 라이선스 파일도 포함됩니다.
|
|
이 설치 자료에는 개인 Wi-Fi 비밀번호나 블루투스 링크 키를 포함하지 않았습니다.
|