Skip to content

Commit b218492

Browse files
chore(release): prep 4.5.2 — suspend #65 VOD wedge detector while paused
One bug fix, no public API change. #65: the 4.2.2 backpressure wedge-breaker misread an ordinary user pause (>~24s) of bridged-audio loopback-HLS content as a producer wedge and re-anchored against a player that cannot advance, leaving a permanent wedge that needed a force-quit. Wedge detection now gates on play intent (timeControlStatus), so a pause never trips it while a genuine starved wedge still does. Reported independently by rrgomes and reckloon. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XZTEfmztPE8hAdjHdBr9BH
1 parent 29221f0 commit b218492

2 files changed

Lines changed: 11 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ the public-API contract.
1010

1111
## [Unreleased]
1212

13+
## [4.5.2] — 2026-06-26
14+
15+
### Fixed
16+
17+
- **A user pause was misread as a backpressure wedge, deadlocking the loopback-HLS VOD path (#65).** The 4.2.2 wedge-breaker re-anchors the producer when the consumer's fetch target freezes. A paused AVPlayer freezes that target legitimately (it issues no forward fetch by design), so a pause longer than ~24 s on a bridged-audio loopback-HLS title (TrueHD, DTS-HD MA, or any codec that routes through the FLAC/EAC3 bridge) tripped the breaker. The re-anchor loop then ran against a player that cannot advance, exhausted its attempts, and left the producer re-anchored ahead of a buffer stranded behind the playhead, a state resume could not recover (force-quit required). Wedge detection now gates on play intent: it tracks `timeControlStatus` and suspends while the player is paused, so a pause of any length never trips it and the window after resume starts fresh. A genuine starved wedge (the player wants to play but is buffer-starved, `waitingToPlay`) still trips, and the seek-deadline reconcile gets the same pause guard so a paused scrub is not mistaken for a starved seek. Thanks to rrgomes and reckloon for the independent captures and the precise root-cause analysis.
18+
19+
([release notes](https://github.com/superuser404notfound/AetherEngine/releases/tag/4.5.2))
20+
1321
## [4.5.1] — 2026-06-26
1422

1523
### Fixed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ Subtitle cues land in raw source PTS; render the overlay against `player.sourceT
152152
Install via Swift Package Manager:
153153

154154
```swift
155-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.5.1")
155+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.5.2")
156156
```
157157

158158
Two complementary samples ship in `Examples/`:
@@ -275,10 +275,10 @@ Browse all of this as a searchable site at **[aetherengine.superuser404.de](http
275275
AetherEngine uses [Semantic Versioning](https://semver.org). The public API surface — every `public` declaration in `Sources/AetherEngine/` — is the stability contract. **Major** removes / renames public symbols or breaks adopters; **Minor** adds public API or codec / format support; **Patch** fixes bugs with no public API change. `internal` types are not part of the contract.
276276

277277
```swift
278-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.5.1")
278+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "4.5.2")
279279
```
280280

281-
Pin to `.upToNextMinor(from: "4.5.1")` for stricter teams that prefer to opt into minor bumps explicitly.
281+
Pin to `.upToNextMinor(from: "4.5.2")` for stricter teams that prefer to opt into minor bumps explicitly.
282282

283283
## Requirements
284284

0 commit comments

Comments
 (0)