/
/
/
# What does this implement/fix? Announcements on AirPlay players no longer interrupt the music. The cliairplay binary (v0.4.14) mixes the announcement clip directly into the live stream with the music ducked underneath - no stop, no restart, and a sync group keeps playing in perfect sync while every room renders the announcement at the same instant. Validated on real hardware (solo players, ad-hoc sync, syncgroups, Sonos-via-AirPlay). - New `announce.py` orchestration in the AirPlay provider: renders the clip once per member audio format, arms the targets at one shared audible instant and tracks per-member results - Targeting semantics: a syncgroup member addressed individually announces alone (even the one leading the audio session); the syncgroup entity announces on all members in sync; an ad-hoc sync leader represents its whole group, its synced members announce alone - The music ducks -18 dB under the clip and stays ducked briefly past it; the announcement volume is compensated into the duck (the AirPlay volume scale is linear dB) so the music never gets louder during an announcement, and volume changes are timed on the actual audible window - Announcement routing now prefers the output that is actively rendering (e.g. a Sonos playing through its AirPlay child gets the clip mixed into that stream, in sync with the group); native support (Sonos audioClip) is used when idle or playing natively, and a playing device is never seized through an idle linked protocol - Players that are idle or paused play the announcement as a short dedicated session (ending idle, like the generic flow); Sendspin-bridged players mix natively whenever there is a live stream to mix into - Bumps cliairplay to v0.4.14 (the release that adds the ANNOUNCE command) ## Types of changes - [ ] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [x] 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.