"맞는 스피커가 없으면, 그렇다고 말해. 마침 있는 아무 스피커에서 사적 오디오를 조용히 재생하지 마."
출력엔 이름 붙은 목적지가 있어
Bellows는 특정 출력에 재생해 — 이름 붙은 오디오 인터페이스, 작은 gain 트림과 함께 48 kHz 스테레오 스트림으로 열림. 그 특정성은 의도적이야: 소리가 특정 방의 특정 디바이스로 가. 그래서 흥미로운 질문은 happy path가 아니라, 재생 시점에 그 디바이스를 못 찾을 때 뭐가 일어나냐야 — 뽑힘, rename됨, 잠듦.
리라우팅은 graceful degradation이 아냐
많은 오디오 코드에 박힌 본능은 뭔가 재생되게 시스템 기본 출력으로 fallback하는 거야. 알림 챙 소리엔 괜찮아. 사적인 말을 하는 목소리 엔진엔, 그 fallback이 누출이야: 특정 스피커를 위한 문장이 이제 OS 기본이 가리키는 데면 어디든 재생돼 — 공유된 방일 수도, 화면 공유일 수도, 남의 주머니에서 다시 연결된 블루투스 헤드셋일 수도. 아무것도 아무도 안 경고했어. Bellows는 이걸 거부해. 디바이스 해석은 사적 오디오를 딴 데로 조용히 옮기는 대신 loud-fail해.
없는 목소리와 같은 본능
이 모양은 이미 트랙 3에서 봤어: 없는 voice binding은 편한 엉뚱한 목소리로 대체하는 대신 loud-fail해. 없는 디바이스는 한 레이어 아래의 같은 원리야. 둘 다에서 '친절한' 대체가 요청을 배신하는 자신 있는 성공을 내 — 엉뚱한 목소리, 아니면 엉뚱한 방의 맞는 목소리. 없는 전제 조건에 대한 안전한 답은, binding이든 스피커든, 추측이 아니라 명시적 에러야.