14.5.0
Added
- Multi-channel rendering, including a dedicated stereo mode. Renderers can now interpret audio as
.merged(default, unchanged),.specific(N)for a single channel, or.stereofor a split L/R image. Use viaLinearWaveformRenderer(channelSelection:)or the newLinearWaveformRenderer.stereofactory; passchannelSelection:toWaveformAnalyzer.samples(...)if you're consuming raw samples. See Multi-Channel (Stereo) Support in the README. #111
Fixed
- Multi-hour audio files no longer crash with OOM (#93). The end-of-loop backfill in
WaveformAnalyzerpreviously padded the input sample buffer with up to gigabytes of zeros when the read produced fewer samples than the target (most commonly when the reader was interrupted by backgrounding). It now pads the output array with silence-equivalent floats — allocation is O(target), independent of audio duration. Per-chunk reads are wrapped inautoreleasepoolto keepCMSampleBufferreferences from pinning memory during long reads. CircularWaveformRenderer(kind: .ring(_))now renders a true annulus for.filled,.gradient,.outlined, and.gradientOutlined(previously only.stripedlooked right; the others filled the inner disk).
Changed
WaveformAnalyzer.AnalyzeErrorgained.invalidChannelIndex(requested:available:)for the new.specific(N)selector. Source-breaking for exhaustive switches without@unknown default:.
Full Changelog: 14.4.0...14.5.0