/
/
# What does this implement/fix? Pausing or stopping a group with AirPlay speakers in it (through the Sendspin bridge) left those speakers playing for another 4+ seconds, and removing a speaker from a playing group did the same. The bridge kept its AirPlay transport warm so a next track could reuse it, but after a stop there is no next track, so the wait only played out the audio the device still had buffered. The stop and ungroup commands now tell the bridged speakers to tear the transport down immediately: - `SendspinPlayer.stop()` and member removal in `set_members()` notify bridge players through a new `on_explicit_stop` role callback - the AirPlay bridge then cancels the warm-grace window and stops the device at once, while staying in its group so a later play includes it again - seeks, track changes and the natural end of the queue keep the warm handover exactly as before - the bridge now logs stream ends at debug level; their silence is what made this issue hard to diagnose Trade-off: moving a playing speaker straight from one group to another also goes through the remove path, so it now restarts its AirPlay connection on the new group instead of keeping it warm. Going silent at once when leaving a playing group is the expected behaviour, and the warm reuse across groups was best-effort anyway. The speaker's own internal buffer (~2s on some devices) still plays out; that is an AirPlay protocol limitation. The slow start the reporter also mentions is a separate mechanism and will be handled as a follow-up. **Related issue (if applicable):** - related issue https://github.com/music-assistant/support/issues/6195 ## Types of changes - [x] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [ ] Enhancement to an existing feature — `enhancement` - [ ] New music/player/metadata/plugin provider — `new-provider` - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change` - [ ] Refactor (no behaviour change) — `refactor` - [ ] Documentation only — `documentation` - [ ] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` ## Checklist - [x] The code change is tested and works locally. - [x] `pre-commit run --all-files` passes. - [x] `pytest` passes, and tests have been added/updated under `tests/` where applicable. - [ ] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [ ] For changes affecting the UI, the companion PR in `music-assistant/frontend` is linked. - [x] I have read and complied with the project's [AI Policy](https://github.com/music-assistant/.github/blob/main/AI_POLICY.md) for any AI-assisted contributions. - [ ] I have [raised a PR against the documentation repository](https://github.com/music-assistant/music-assistant.io/blob/main/CONTRIBUTING.md) targeting the main or beta branch as appropriate.