Files
jsahnandClaude Opus 5.5 7ac8cd1dbb Reduce mixer and Bluetooth buffers from 500 ms to 200 ms
SBC medium, not the larger buffer, removed the headphone relay dropouts,
so cut dmix, bluealsa-aplay and alsaloop buffers to 200 ms and the
Shairport backend buffer to 0.15 s. Verified by listening (iPhone ->
headphones, with AirPlay mixed in) with no RTP loss or underruns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:07:34 +09:00

5.9 KiB

검증 기록 — 2026-10-12

완료

  • 입력값 검증, 연결 없는 출력 전환 중단, 서비스 실패 시 설정 복구, 설치 백업 복구/심볼릭 링크 보존, 등록 장비 재페어링 방지, 입력 PCM 제한, 출력 볼륨 변경 거부, HTTP 토큰/동일 출처 검사, 활성 AirPlay 속성 파싱, 영구 등록 실패 처리 등 자동 검사 23개 통과.
  • Bash 문법 검사와 ShellCheck 통과.
  • Python 문법 확인: macOS Python 3.14, 보드의 Debian Python에서 확인.
  • systemd의 새 radxa-bt-output.service 검증 통과.
  • 배포할 Git bundle에서 새 작업 디렉토리로 복제하고 실제 보드에서 컴파일 성공.
    • Shairport Sync 웹 버전: 5.5.2-dirty-AirPlay2-smi10-OpenSSL-Avahi-ALSA-soxr-metadata-dbus-sysconfdir:/etc
    • 포함된 네이티브 볼륨 패치를 적용한 실제 보드 빌드 및 설치 성공. dirty는 해당 패치를 적용했기 때문에 표시됩니다.
    • NQPTP: 1.2.8 / 공유 메모리 규격 10.
  • 기존 얕은 Git 복제에서 만든 bundle의 누락 이력을 발견하고, 완전한 이력이 있는 독립 bundle로 교체함. 최종 SHA-256은 manifest에 기록.
  • 기존 보드에 새 관리 명령을 설치하고 기존 이름/보스 출력 설정으로 이전 성공.
  • radxa-audio output dac → output bluetooth 왕복 확인 및 각 경로 무음 재생 성공.
  • 최종 보드 설정: Bluetooth 출력, Bose QC Headphones.
  • 보스 PLAYBACK(SBC 48 kHz)과 아이폰 CAPTURE(SBC 44.1 kHz) 동시 연결 확인.
  • 기존 Wi-Fi 안정화 옵션 he_on=N, ps_on=N 유지 확인.
  • 웹 서비스 자동 시작, 브라우저의 AirPlay/휴대폰 입력 볼륨과 음소거, DAC 선택을 실제 API와 장치 속성으로 확인.
  • 공통 감쇠 −3 dB, 명령행 제어 유지, JavaScript/Bash 문법 검사 통과.

Bluetooth 끊김 조사

사용자가 iPhone Bluetooth → 보스 헤드폰 경로의 끊김을 보고했습니다. iPhone 수신 RTP 패킷 손실과 입력 재생 underrun이 반복됐고, 헤드폰 출력 alsaloop에서 capture overrun도 한 번 확인됐습니다. Wi-Fi는 5 GHz, CPU 부하는 낮았으며 원인은 아직 확정하지 않았습니다. 출력 버퍼를 200 ms에서 500 ms로 늘려도 사용자가 끊김을 확인했습니다. 송신을 멈춘 약 18초 동안에는 입력 패킷 손실이 없었고, 송신 재개 후 다시 발생했습니다. SBC 송신 품질을 high에서 medium으로 줄인 뒤 사용자는 정상 청취라고 답했지만, 같은 시점에 Radxa의 보스 출력 PCM이 없고 연결 재시도 중인 것을 발견했습니다. 직접 연결 경로의 소리일 수 있어 이 응답만으로 해결됐다고 판단하지 않습니다. medium과 500 ms 버퍼를 저장했고 출력 등록 복구 후 다시 검증해야 합니다. 이후 컨트롤러에서 HCI 명령 0x0c1a/0x0408 시간 초과와 BlueZ NoReply를 확인했습니다. Bluetooth 서비스 재시작만으로 복구되지 않아 보드를 재부팅했습니다. SBC 품질 변경으로 컨트롤러 오류가 해결됐다고 보지는 않습니다.

재부팅 후 Wi-Fi/USB 관리 연결이 돌아오지 않아 전원을 재연결했고, 컨트롤러는 정상 초기화됐습니다. 500 ms 버퍼와 SBC medium 설정은 유지됐습니다. 임시 등록이던 보스는 재부팅으로 등록이 사라졌습니다.

일회성 bluetoothctl --agent NoInputNoOutput pair는 인증 완료 전에 종료돼 Bonded: no로 남았던 것으로 보고, 하나의 bluetoothctl 세션에서 에이전트 등록 → 검색 → 페어링을 진행하도록 바꿨습니다. 이 방식으로 보스가 Paired/Bonded/Trusted: yes로 영구 등록됐습니다.

2026-10-12 19:00 전후로 iPhone → Radxa Bluetooth → 보스 경로(PCM 연결을 bluealsa-aplay -l로 확인)에서 사용자가 정상 청취를 확인했습니다. 해당 구간 로그에서 Missing RTP packets, underrun/overrun, HCI 시간 초과는 없었습니다. 따라서 SBC medium + 500 ms 버퍼 조합으로 끊김이 해소된 것으로 판단합니다. 장시간 재생 안정성은 아직 확인하지 않았습니다.

지연 축소

500 ms 버퍼는 끊김 해결에 기여하지 않았으므로 지연을 줄였습니다. 1단계로 헤드폰 송신(alsaloop -t)을 200 ms로 줄여 사용자가 끊김 없음을 확인했습니다. 2단계로 dmix 버퍼 500 → 200 ms, bluealsa-aplay --pcm-buffer-time 500 → 200 ms, Shairport 출력 버퍼 0.5 → 0.15 s로 줄였습니다. iPhone Bluetooth → 보스 청취에서 사용자가 끊김 없음을 확인했고, Missing RTP packets·underrun은 0건이었습니다. 같은 구간의 AirPlay 동시 재생 통계에서도 Missing/Late 프레임은 0이었습니다. 경로 전체 지연은 측정하지 않았으며, 버퍼 합계 기준 약 0.6 s 줄었습니다. 이미 영구 등록된 휴대폰 등록은 재부팅 후 유지됐습니다.

실제 청취로 확인한 범위

사용자가 AirPlay 재생, AirPlay + 아이폰 Bluetooth 입력의 DAC 믹스 재생을 정상 청취했다고 확인했습니다. iPhone Bluetooth 입력 → 보스 헤드폰 출력도 SBC medium / 200 ms 버퍼 설정에서 끊김 없이 청취했다고 확인했습니다.

아직 검증하지 않은 범위

  • 새 SD 카드/새 OS에서 install.sh 전체를 처음부터 실행하는 시험.
  • 다른 Radxa 모델의 무선 드라이버와 블루투스 컨트롤러.
  • 여러 Bluetooth 입력 기기의 동시 음악 재생 한계.
  • 새 범용 출력 서비스의 재부팅/헤드폰 전원 껐다 켜기 이후 자동 재연결.
  • 패키지 저장소가 향후 바뀐 환경. AirPlay 소스는 고정했지만 apt 의존 패키지는 Debian 13 저장소가 제공하는 버전을 사용합니다.

새 보드 설치 시 서비스가 모두 실행되는 것만으로 음질 검증을 마쳤다고 보지 말고, AirPlay 단독 → Bluetooth 단독 → 두 입력 믹스 → 재부팅 후 재연결 순서로 직접 들어 확인해 주세요.