Skip to content

feat(stream): DAW 실시간 블록 처리 재현 + 플러그인 클릭/드롭아웃 triage#6

Open
unohee wants to merge 1 commit into
mainfrom
feature/daw-streaming-bench
Open

feat(stream): DAW 실시간 블록 처리 재현 + 플러그인 클릭/드롭아웃 triage#6
unohee wants to merge 1 commit into
mainfrom
feature/daw-streaming-bench

Conversation

@unohee

@unohee unohee commented May 31, 2026

Copy link
Copy Markdown
Owner

Summary

실제 DAW(Ableton 등)의 고정 블록 콜백 처리를 재현해, 오프라인 바운스와 블록 스트리밍이 어디서 갈리는지 노출하고 플러그인 클릭/드롭아웃을 자동 triage 하는 audioman stream 명령을 추가한다.

동기: "Ableton 환경에서 클릭 발생하는 걸 놓침. 블록 스트리밍만으론 제대로 triage 안 됨."

핵심 발견 (pedalboard 0.9.22 실측): reset=False 연속 호출은 오프라인 렌더와 비트 단위로 일치(-600dB)하지만, 기존 VST3PluginWrapper.process는 매 호출 reset(기본 True)이라 블록 처리 시 경계마다 클릭(-7.5dB)이 발생했다. 이것이 DAW 클릭의 재현 메커니즘.

Changes (DAW 스트리밍 — 이번 작업)

  • core/streaming.py: render_offline(ground truth) / render_streamed(연속 블록, reset_per_block·reset_first 옵션) + BlockTiming RT factor 측정
  • core/discontinuity.py: 클릭 triage. 블록 경계 정렬 = 스트리밍 상태 단절(DAW 클릭) / 비정렬 = 소스 클릭 구분, NaN/Inf, offline 대비 null test
  • core/rt_bench.py: RT factor p50/p99/max, xrun, worst-case 동시 트랙 추정
  • cli/stream.py: audioman stream {bench,triage,compare,play}. --json은 기존 finding.v1.json 스키마. builtin: 접두사로 VST3 없이 테스트 가능
  • VST3PluginWrapper.process(reset=): reset 인자 추가 (기본 True로 하위호환)
  • tests/unit/test_streaming.py (14): null test, 블록 경계 클릭 검출, RT factor 단조성/블록 크기 의존성

동봉된 이전 세션 미커밋 작업 (LLM-native Phase A)

app.py가 두 작업에 걸쳐 분리 불가하여 함께 포함:

  • --plain 글로벌 출력 모드, i18n 인프라 삭제(src/audioman/i18n.py 제거)
  • Finding 스키마(core/findings.py) + detectors.py
  • audioman observe / changelog / schemas 명령, schemas/*.json 발행
  • tests: test_plain_mode/test_findings/test_observe/test_changelog_cmd (29)

Test

전체 374 passed (신규 43개: streaming 14 + Phase A 29), 회귀 0. pedalboard 빌트인만 사용해 streaming 테스트는 VST3 없이 CI에서 동작.

audioman stream bench mix.wav -p reverb --blocks 64,128,256,512,1024
audioman stream triage mix.wav -p denoise --reset-per-block --json
audioman stream compare mix.wav -p delay --blocks 128,256,512

실제 DAW(Ableton 등)의 고정 블록 콜백 처리를 재현해, 오프라인 바운스와
블록 스트리밍이 어디서 갈리는지 노출하고 클릭을 자동 triage 한다.

핵심 발견(pedalboard 0.9.22 실측): reset=False 연속 호출은 오프라인 렌더와
비트 단위로 일치(-600dB)하지만, 기존 VST3PluginWrapper.process는 매 호출
reset(기본 True)이라 블록 처리 시 경계마다 클릭(-7.5dB)이 발생했다.

추가:
- core/streaming.py: render_offline(기준)/render_streamed(연속 블록,
  reset_per_block·reset_first 옵션) + BlockTiming RT factor 측정
- core/discontinuity.py: 클릭 triage. 블록 경계 정렬 여부로 "스트리밍 상태
  단절(=DAW 클릭)" vs "소스 클릭" 구분, NaN/Inf, offline 대비 null test
- core/rt_bench.py: RT factor p50/p99/max, xrun, worst-case 동시 트랙 추정
- cli/stream.py: audioman stream {bench,triage,compare,play}. --json은 기존
  finding.v1.json 스키마 그대로. builtin: 접두사로 VST3 없이 테스트 가능
- VST3PluginWrapper.process(reset=): reset 인자 추가(기본 True로 하위호환)
- tests/unit/test_streaming.py (14): null test, 블록 경계 클릭 검출,
  RT factor 단조성/블록 크기 의존성

이 working tree에는 이전 세션의 미커밋 변경 'LLM-native Phase A'도 함께
포함된다(app.py가 두 작업에 걸쳐 분리 불가하여 동봉):
- --plain 글로벌 출력 모드, i18n 인프라 삭제(src/audioman/i18n.py 제거)
- Finding 스키마(core/findings.py) + detectors.py
- audioman observe / changelog / schemas 명령, schemas/*.json 발행
- tests: test_plain_mode/test_findings/test_observe/test_changelog_cmd (29)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant