/
/
# What does this implement/fix? Spotify's own playback engine levels the loudness and applies the queue's crossfade, and Music Assistant deliberately stays out of both. Until now the only outcome it could report was "disabled", which means nothing is happening at all — so the stream details showed volume normalization and crossfade as off while the audio really was levelled and faded, just not by us. Both now report as handled by the source. Nothing about the audio changes: every gate that means "Music Assistant applies nothing" was audited and treats the new value exactly like disabled, so no second normalization pass and no F32 headroom cost come back. A source fade is only credited where one can actually happen: tracks only, only while the source is the one delivering at playback pace, and never on an item with nothing queued after it. A running Spotify session answers for itself, because the engine reads the crossfade setting once at startup — following the current setting instead would claim a fade the engine is not applying, or deny the one it still is. **Related issue (if applicable):** - models: https://github.com/music-assistant/models/pull/374 - frontend: https://github.com/music-assistant/frontend/pull/2621 - deferred from https://github.com/music-assistant/server/pull/5918 ## Changes - Report `SOURCE` instead of `DISABLED` for volume normalization when the provider levels its own audio, and for crossfade when it fades its own playback. - Providers declare the crossfade the same way they already declare normalization; Spotify says so from the running Soloist session. - Source-normalized audio reports who levelled it and nothing else — our target and any stored measurement describe neither. - The loudness analyzer, the F32 headroom check and the bit-perfect check keep treating it as nothing we applied. - Volume normalization no longer offers "Source" or "Unknown" in its dropdown: both are only ever outcomes, never something to ask for. ## 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. - [x] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [x] 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.