/
/
/
# What does this implement/fix? The volume and mute callbacks on the Sendspin bridge hand their value straight to the AirPlay player instead of going through the player controller, which reads like they skip the volume limits and the control resolution. They don't. The level arrives on the AirPlay device's own scale, and where the speaker has no volume of its own to resolve to, the bridge role is what the player's volume resolves to while it streams - so a volume from Music Assistant has already been through the controller and been scaled into the configured min/max range by the time it gets here. It is the last leg of that command, not a new one. Routing it back through the controller would scale it a second time and arrive again over the same route, so a speaker limited to 60 would settle below the level it was asked for. A volume a Sendspin controller set never passed the player at all, which makes it an externally changed volume like any other - clamped to the limits on the next state update, the same as a volume changed on the speaker itself. No behaviour change. **Related issue (if applicable):** - related issue <link to issue> ## Types of changes - [ ] 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` - [x] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` Changes: - the AirPlay bridge's volume and mute callbacks explain which scale they receive, and when the role is what the player's volume resolves to - noted that a volume set from a Sendspin controller is an externally changed volume, with the limits enforced on the player's state update - the bridge role states that a volume it delivers is on the scale it reports - added a test covering that a volume from the role reaches the speaker unchanged ## 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.