Skip to content

CastFabric v0.11.0-alpha.5

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Sep 04:06
· 1 commit to main since this release

CastFabric v0.11.0-alpha.5

This alpha hardens multi-device and multi-protocol ownership at the physical-output boundary.

  • Serialize physical playback commands per output while keeping different speakers independent.
  • Fence DLNA, AirPlay, MiPlay and MCP callbacks by the current session owner so stale stop, resume,
    seek or volume callbacks cannot disrupt a newer session.
  • Delay MiPlay session creation until a valid Open, preventing idle TCP probes from appearing as
    active casting sessions or blocking a real sender; incomplete handshakes now expire after 15 seconds.
  • Give each MiPlay receiver a stable, target-specific discovery identity and advertise the observed
    commonData field.
  • Isolate AirPlay stateful clients with connection tokens and reject a competing stateful client with
    RTSP 453 instead of sharing decoder state.
  • Keep playlist-run preemption and media-session preemption atomic, and improve partial-start,
    shutdown and Zeroconf cleanup.

Upgrade and verification notes

The audio data plane is unchanged: this release does not alter FFmpeg arguments, PCM format, WAV
headers, HTTP stream mode, queue sizing, physical renderer play type or the existing five-second DMR
pull-confirmation boundary. On one output, concurrent control commands are intentionally ordered; a
takeover can therefore wait for an in-flight renderer confirmation. Different outputs do not share a
playback lock.

Automated verification covers same-output serialization, cross-output concurrency, stale callback
fencing, idle MiPlay probes, AirPlay client ownership, DLNA ownership, playlist/session consistency,
the full Python suite, direct audio seek and the offline MiPlay WFD/RTP/MPEG-TS/PCM path. Xiaomi-phone
discovery and audible real-device behavior remain separate deployment gates and must not be inferred
from self-discovery or simulation.

Use the existing persistent /app/conf mount and retain the previous container or immutable image for
rollback. Restarting CastFabric interrupts active routes but does not automatically start playback.