Skip to content

AetherEngine 2.2.0

Choose a tag to compare

@superuser404notfound superuser404notfound released this 05 Jun 15:10
· 313 commits to main since this release

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 avPlayerCanDecodeAudio whitelist hand the URL straight to a bare AVPlayer (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.