breadcast/vendor/rust_cast-0.21.0/PATCHES.md
Breadway 8c745d18e0
Some checks failed
dev release / build (push) Failing after 12s
Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration
Builds out the full v1 scope: a vendored+patched openscreen subset for
low-latency Cast Streaming (Mirroring receiver 0F5096E8) alongside the
existing Cast V2/HLS and new DLNA/AVTransport casting paths, breadcastd's
Idle/Casting state machine with a private IPC socket, the breadcast GTK4
popup as a thin IPC client, and bread.cast.*/bread.command.cast.* breadd
integration (device discovery, start/stop, mirroring lifecycle events).
Also adds bakery/systemd/Forgejo CI packaging.

Validated end-to-end against a real Chromecast/Google TV: negotiated
Cast Streaming session, live pipeline playback, and daemon+GUI click-to-cast/
stop through the actual popup.
2026-08-03 09:07:21 +08:00

1.7 KiB

Vendoring notes

This is rust_cast 0.21.0 (MIT licensed), vendored via [patch.crates-io] in the workspace Cargo.toml purely to add one method upstream doesn't have: a generic point-to-point send on an arbitrary CASTV2 namespace.

Why

breadcast's Cast Streaming integration (breadcast-caststream-sys, wrapping a vendored chromium/openscreen) needs to exchange OFFER/ANSWER JSON with a launched receiver app on the urn:x-cast:com.google.cast.webrtc namespace -- a point-to-point conversation targeting that app's transport_id, the same target ConnectionChannel/MediaChannel already use. None of rust_cast's built-in channels expose that: ReceiverChannel::broadcast_message() is the closest, but it hardcodes destination "*", which is a different conversation than a namespace-specific exchange with one particular app.

Receiving such messages needs no patch -- CastDevice::receive() already returns them as ChannelMessage::Raw(CastMessage) whenever no built-in channel claims the namespace.

The patch

src/lib.rs: added CastDevice::send_message<M: Serialize>(&self, namespace, destination, message), built the same way ReceiverChannel::broadcast_message() is internally, but with a caller-supplied destination instead of a hardcoded "*". See the doc comment on that method for the exact rationale (marked "LOCAL PATCH (breadcast, not upstream)").

Rolling the pin

To move to a newer rust_cast release: copy the new version from ~/.cargo/registry/src/*/rust_cast-<version>/, re-apply the same method addition (small enough to redo by hand), swap the version in this directory's own Cargo.toml, and update the path if the directory name changes.