Back to corpus
research noteexperiment writeup candidatescore 28

Phase 1 – Engine Bring-up (Weeks 1-6)

Goal: Ship a macOS binary that owns the CoreAudio device, renders audio in a lock-free callback (no allocations once prepared), plays two deck buffers through crossfader + EQ + limiter, and produces real latency/jitter metrics. Everything else can be stubs.

Full HTML reader

Read the full artifact

Open in new tab

Extracted abstract or opening context

Goal: Ship a macOS binary that owns the CoreAudio device, renders audio in a lock-free callback (no allocations once prepared), plays two deck buffers through crossfader + EQ + limiter, and produces real latency/jitter metrics. Everything else can be stubs. ### 1.1 Audio I/O backend - Add `cpal` dependency; create `DevicePicker` that negotiates `f32` stereo 48 kHz stream with the default output device. - Implement `CoreAudioBackend::prepare()` to store stream config and device handles, `start()` to spawn the stream. - Provide `LinuxBackend`/`WasapiBackend` stubs behind `cfg` (return `Unsupported` errors) to keep the crate building on other OSes. ### 1.2 Render callback contract - Define `AudioBlock { channels, frames, data: *mut f32 }` and `AudioCallback` trait with `fn render(&mut self, AudioBlock)`. - Wire the cpal stream so the callback simply forwards the mutable slice to `EngineCore::render()`. - Configure QoS: set audio thread to `UserInteractive` priority via coreaudio APIs; pin control thread to another core. ### 1.3 Channel ring & double buffering - Introduce `ChannelRing<RenderBatch>` (SPSC) using `rtrb`; producer pushes `RenderBatch { left: *const f32, right: *const f32, len }` per block. - Consumer (audio thread) pops and copies into the device buffer; drop oldest batch if ring is full (increment `overruns`). - Add `EngineTelemetry` struct containing `overruns`, `callback_ns`, `blocks_rendered`. **Deliverables:** Binary opens default device and outputs silence; unit test verifies ring operations do not allocate after creation.

Promotion decision

What has to happen next

Attach run IDs, datasets, metrics, and reproduction commands.

Why this is not always a full paper yet

Corpus pages are public-safe readers for discovered workspace artifacts. They are not automatically final papers. A corpus item becomes a polished paper only after the editable source, evidence checkpoints, references, figures, render path, and release status are attached through the paper schema.