AetherEngine 2.2.0
AetherEngine 2.2.0
New public API: an audio-only playback path. Minor bump, purely additive. Existing 2.1.x callers compile and run unchanged.
Audio-only path
LoadOptions.audioOnly routes a source into a lean audio pipeline that never builds the HLS loopback server, the display layer, or the video producer. Decode is native-first:
- Codecs on the
avPlayerCanDecodeAudiowhitelist hand the URL straight to a bareAVPlayer(AudioAVPlayerHost). - Everything else falls back to an FFmpeg decode into
AVSampleBufferAudioRenderer(AudioPlaybackHost).
The engine branches load() into the audio path, routes transport (play / pause / seek) to the active host, and tears the host down in stopInternal for a clean handoff back to the video path.
System Now-Playing (tvOS / iOS)
The AVPlayer host owns a persistent per-player MPNowPlayingSession (exposed via audioNowPlayingSession) that stays the active Now-Playing app across a background pause, auto-publishes now-playing info from the player, and carries externalMetadata. The host survives across tracks (no per-track teardown) and does not pause when the app backgrounds, so audio keeps playing with the system overlay live.
All Now-Playing code is gated #if os(tvOS) || os(iOS). The path builds clean on macOS (no system session there), iOS, and tvOS.
Tooling
New aetherctl audio subcommand for audio-path smoke testing: prints the active decoder and final duration, driven under CFRunLoop so end-of-track fires at playback end rather than demux EOF.
Compatibility
Purely additive public API, no breaking changes. Pin from: "2.0.0" continues to pick this up.