시스템 오디오 VST3 라우터
## 개요
기존 EqualizerAPO가 VST3를 지원하지 않아서 직접 만들기로 함.
- 플랫폼: Windows 네이티브 앱
- 기능은 단 하나: **출력 오디오 하이재킹 → VST3 체인 통과 → 출력으로 반환**
- 익숙한 스택: Py, JS/TS, Rust+WASM, D1(SQLite), MariaDB, 웹(백엔드 포함)
- C/C++ 계열은 배제 (JUCE 등 C++ 프레임워크 제외 사유)
## 검토했던 방식
### 방식 1: APO (Audio Processing Object)
EqualizerAPO와 동일한 방식. Windows 오디오 드라이버 그래프에 직접 개입하는 `IAudioProcessingObject` 구현.
- 장점: 지연시간 최소, 진짜 의미의 하이재킹
- 단점: COM 기반 구현 난이도 높음, Windows 10 2004+부터 서명된 드라이버 패키지 필요, 문서 빈약
- **채택 안 함**
### 방식 2: 가상 오디오 장치 + WASAPI (채택)
가상 재생 장치(VB-CABLE 등)를 시스템 기본 출력으로 설정 → WASAPI 루프백 캡처 → VST3 체인 처리 → 실제 출력 장치로 WASAPI 렌더.
- 커널 드라이버를 직접 만들 필요 없음 (기존 가상 드라이버 재사용)
- Voicemeeter, CamillaDSP 계열이 이 구조
## 아키텍처
```
[재생 앱들] → (시스템 기본 출력 = 가상 장치)
↓
WASAPI 루프백 캡처 스레드
↓
링버퍼
↓
VST3 프로세싱 스레드 (고정 블록사이즈, 체인 순서대로)
↓
실제 출력 장치 렌더 스레드 (WASAPI)
↓
[스피커]
```
- 캡처 - 처리 - 렌더 전 구간에서 샘플레이트/버퍼사이즈를 일치시켜야 글리치 없음
- 가상 오디오 장치 드라이버 자체는 OS 레벨 문제라 자체 개발 대상 아님. 기존 드라이버(VB-CABLE 등) 설치를 전제로 함
## 스택 구성 (Rust)
### VST3 호스팅
후보 (안전성/완성도 순):
1. **`rust-vst3-host`** (HelgeSverre) — 퍼블릭 API에 unsafe 없음. 플러그인 탐색/로드/재생/파라미터 제어/MIDI/크래시 격리 지원. CPAL 백엔드 내장, 커스텀 백엔드 교체 가능
2. **`rack`** — VST3/AudioUnit/CLAP 등 멀티포맷 호스팅. `cpal_host` 예제로 실시간 호스트 구성 참고 가능. CLAP까지 열어두고 싶으면 우선 고려
3. **`vst3-host`** (docs.rs) — 빌더 패턴으로 샘플레이트/블록사이즈/프로세스 격리 설정. 안전하고 가벼움
4. 로우레벨: `vst3-sys` / `vst3` (Steinberg 바인딩) — 위 3개로 부족할 때만
참고 프로젝트: **RS VST Host** (Joel Löf) — Rust로 완전히 작성된 VST3 호스트, COM interop부터 크래시 샌드박싱까지, 1,414개 테스트, DAG 라우팅 에디터. 아키텍처 레퍼런스용.
### 오디오 I/O (WASAPI)
Windows 전용 앱이므로 `cpal`보다 **`wasapi` 크레이트**(러스트 네이티브 WASAPI 바인딩) 직접 사용을 우선 검토. 루프백 캡처 + exclusive/shared 렌더 컨트롤을 세밀하게 다룰 수 있음. 호스팅 크레이트의 커스텀 백엔드 슬롯에 이 WASAPI 구현을 꽂는 조합.
### GUI
`egui` / `eframe` — 즉시모드 GUI, 오디오 스레드와 연동된 실시간 파라미터 표시에 적합. RS VST Host, rust-vst3-host 데모 모두 이 조합 사용.
### 가상 오디오 장치
VB-CABLE 등 기존 드라이버 사용자 설치 전제 (자체 개발 범위 아님).
## 최소 골격 (다음 단계)
1. `wasapi` 크레이트로 가상 장치 루프백 캡처 스레드
2. `rust-vst3-host`로 VST3 플러그인 1개 로드 + 처리
3. `wasapi`로 실제 출력 장치 렌더 스레드
4. 3단계를 링버퍼로 연결, 샘플레이트/블록사이즈 통일
5. egui로 최소 컨트롤(플러그인 로드/바이패스) UI
## 미해결 / 추후 검토
- 레이턴시 목표치 미정 (VB-CABLE 자체 지연 + 캡처/처리/렌더 버퍼 지연 누적)
- VST3 체인 저장/프리셋 관리 방식
- 배포 시 VB-CABLE 설치 자동화 여부
- 프로세스 격리(플러그인 크래시 격리) 적용 범위