Skip to content

LowEnd Native Audio v0.2.8

Choose a tag to compare

@Gomtanga Gomtanga released this 24 Jun 06:59
· 8 commits to main since this release

LowEnd Native Audio v0.2.8 adds experimental live PCM 2× output conditioning and a new read-only Diagnostics/Status panel, on top of the v0.2.7 output-conditioning engine. The real-time audio callback stays allocation-free and lock-free throughout.

Highlights

Live PCM 2× output conditioning (experimental)

  • Wires the existing offline polyphase resampler into the live capture→output path.
  • Enable Output Conditioning + PCM Oversampling + 2× to activate (44.1k→88.2k, 48k→96k only); 4×/8×, dither, and DSD stay bypass.
  • The output device is switched to 2× on the manager queue — never inside the audio callback — while the aggregate/tap stays at 1×, so processLive doubles the captured signal.
  • Unsupported device/rate combinations fall back to PCM bypass with a posted reason.
  • ResamplingOutputConditioningEngine.processLive is out-of-place 2× polyphase upsampling (headroom + finite guard), allocation/lock-free; every non-2× configuration is a verbatim identity copy.

Diagnostics/Status panel (new)

A read-only "진단" sidebar page surfaces the live pipeline state. It reads only existing off-callback state and never touches the realtime callback:

  • tap / engine / output-device sample rates
  • output format (bit depth / sample type)
  • Output Conditioning status: off / PCM 2× active / fallback (+ fallback reason)
  • HighExciter resolved oversampling mode: 1× / 2× / 4× / safety-limited
  • dropout / underrun / drop counters and engine restart count
  • current output device name · id

UI & build

  • DSD/DoP picker disabled and badged "(오프라인/테스트 전용)"; captions state capability-check-only.
  • Build identity: CFBundleVersion is stamped from the git commit count, with LCBuildCommit / LCBuildDate / LCBuildID shown in Settings.

Real-time safety

The live render path performs no allocation, lock, dispatch, logging, coefficient generation, or device-format change. All Diagnostics-panel values are read off-callback (NotificationCenter mirror + diagnosticsSnapshot() + ExciterOversamplingPolicy.resolve + a single off-thread CoreAudio device-name query).

Verification

swift build, LowEndSupportChecks, SystemAudioProcessor --self-test (debug + release), and ./scripts/build-native-system-audio-app.sh all pass. Idle CPU is unchanged with Output Conditioning off (default).

한국어 요약

  • v0.2.7의 출력 컨디셔닝 엔진 위에 실험적 라이브 PCM 2× 출력 컨디셔닝읽기 전용 진단/상태 패널을 추가했습니다.
  • 라이브 PCM 2×: 활성화 + PCM Oversampling + 2×일 때 동작합니다(44.1k→88.2k, 48k→96k만). 출력 장치는 오디오 콜백 밖(manager queue)에서 2×로 전환되며, 미지원 장치/레이트는 안전하게 PCM으로 폴백합니다.
  • 진단 패널: tap/engine/출력 장치 샘플레이트, 출력 포맷, Output Conditioning 상태(off / PCM 2× active / fallback)와 폴백 사유, HighExciter 실제 오버샘플링 모드(1×/2×/4×/safety-limited), dropout/underrun 카운터, 출력 장치 이름·ID를 표시합니다. 오디오 콜백에 영향 없이 기존 상태만 읽습니다.
  • DSD/DoP는 오프라인/테스트 전용으로 명확히 표시하고, 빌드 식별 정보(commit/hash/시각)를 추가했습니다.
  • swift build, LowEndSupportChecks, --self-test, 빌드 스크립트가 모두 통과하며, 컨디셔닝이 꺼진 기본 상태의 대기 CPU는 변동이 없습니다.