What’s Changed
🐛 Bugfixes
- #559 - Fix an audio gap after a player reconnects (@maximmaxim345)
- #558 - Fix a missing audio frame after a player rejoins (@maximmaxim345)
- #557 - Fix too little buffer at the start of the first stream (@maximmaxim345)
- #556 - Keep players at their
min_buffer_msbetween commits (@maximmaxim345) - #555 - Keep the server listening when mDNS setup fails (@maximmaxim345)
- #554 - Fix audio gap when a player joins a playing group (@maximmaxim345)
- #552 - Drop late player audio in the first seconds of a stream (@maximmaxim345)
- #551 - Flag messages sent during re-handshake,
pin_mismatchand negative seeks (@maximmaxim345) - #553 - Fix redialing a client whose mDNS address changes during goodbye (@maximmaxim345)
- #550 - Clamp backward relative seeks into the seekable range (@maximmaxim345)
- #548 - Fix lost and unwanted client redials after a disconnect (@maximmaxim345)
- #546 - Flag clients that ignore
server/unpair(@maximmaxim345) - #547 - Fix late-join historical audio starting with too little lead (@maximmaxim345)
- #544 - Stop offering management to clients that don't support it (@maximmaxim345)
- #545 - Fix grouped players drifting out of sync after stalls (@maximmaxim345)
- #542 - Flag messages sent before pairing's first
server/activate(@maximmaxim345) - #543 - Fix stale stream messages sent around
stream/end(@maximmaxim345) - #541 - Answer malformed
client/initframes with the rightserver/error(@maximmaxim345) - #540 - Fix late
group/updateand strict-modeclient/statedeadline (@maximmaxim345) - #538 - Skip empty FLAC and Opus source chunks (@maximmaxim345)
- #537 - Flag out-of-sequence pairing messages (@maximmaxim345)
- #535 - Log unrecognized pair-method descriptor values (@maximmaxim345)
- #536 - Fix pairing record mismatch after a stalled finalize (@maximmaxim345)
- #534 - Reject non-ASCII pairing tokens (@maximmaxim345)
- #533 - Fix how the server dials mDNS-discovered clients (@maximmaxim345)
- #531 - Flag invalid source chunks and unsent source starts (@maximmaxim345)
- #532 - Flag and reject
nullin optional client fields (@maximmaxim345) - #530 - Fix artwork handling of disabled channels (@maximmaxim345)
- #523 - Reject
server/activatewith unrecognized activities (@maximmaxim345) - #529 - Fix visualizer data and
stream/startdeviating from the spec (@maximmaxim345) - #526 - Fix late-joining players getting audio with too little lead (@maximmaxim345)
- #528 - Fix player format selection for 10 channels, Opus and reconnects (@maximmaxim345)
- #525 - Refuse unadvertised pairing methods in strict mode (@maximmaxim345)
- #527 - Send
stream/endon stop to players switching formats (@maximmaxim345) - #524 - Stop disconnecting clients with unknown application-specific role versions (@maximmaxim345)
- #522 - Flag and reject non-array values in list fields (@maximmaxim345)
- #521 - Fix noncompliance warnings naming only the first wrong field (@maximmaxim345)
- #517 - Cap visualizer
rate_maxat 120 frames per second (@maximmaxim345) - #519 - Limit draft visualizer spectrum to 1024 display bins (@maximmaxim345)
- #518 - Limit visualizer spectrum to 1024 display bins (@maximmaxim345)
- #514 - Take time sync receive timestamps before decryption (@maximmaxim345)
- #516 - Fix pairing code methods missing for older clients (@maximmaxim345)
- #515 - Fix pairing config changes ignored by older clients (@maximmaxim345)
- #513 - Fix volume and mute commands delayed behind player audio (@maximmaxim345)
- #484 - Flag and reject client messages with wrong JSON types (@maximmaxim345)
- #509 - Reject malformed client messages in strict mode (@maximmaxim345)
- #508 - Fix
client-stream/endsent without a payload object (@maximmaxim345) - #507 - Flag invalid source stream starts before acting on them (@maximmaxim345)
- #506 - Stop flooding client logs with malformed binary message warnings (@maximmaxim345)
- #504 - Flag more
sourcerole spec violations (@maximmaxim345) - #503 - Flag client message and binary frame spec violations (@maximmaxim345)
- #502 - Reject non-canonical pairing fields from clients in strict mode (@maximmaxim345)
- #500 - Flag stray pairing messages and retries past the round limit (@maximmaxim345)
- #501 - Reject long-term PSKs reusing the Sentinel or pairing PSK (@maximmaxim345)
- #499 - Reject non-canonical handshake input from clients in strict mode (@maximmaxim345)
- #497 - Flag more
client/helloandclient/statespec violations (@maximmaxim345) - #496 - Stop flooding logs with source audio decode errors (@maximmaxim345)
- #495 - Stop clients flooding logs with noncompliance warnings (@maximmaxim345)
- #494 - Fix first playback warnings hidden right after boot (@maximmaxim345)
- #491 - Fix clients disconnecting on an invalid
client/statevalue (@maximmaxim345) - #492 - Stop flooding logs with unhandled binary message warnings (@maximmaxim345)
- #493 - Ignore
client_idsent in encrypted client hellos (@maximmaxim345) - #486 - Fix encrypted clients rejected for sending
versionin their hello (@maximmaxim345) - #488 - Fix static pairing code dropped for QR-only devices (@maximmaxim345)
- #487 - Fix connections stuck in pairing after a
concurrent_attemptabort (@maximmaxim345) - #485 - Fix opus being skipped at bit depths other than 16 (@maximmaxim345)
🧰 Maintenance
- #549 - Fix server tests that were flaky or never reached their checks (@maximmaxim345)
- #510 - Deduplicate the message
typepeek helper (@maximmaxim345) - #505 - Fix mypy error on main after the 2.4.0 bump (@maximmaxim345)
- #498 - Mark old client compatibility code for removal (@maximmaxim345)
- #490 - Fix stale docstrings on legacy
server/stateclears (@maximmaxim345)
⬆️ Dependencies
3 changes
- #482 - Build(deps-dev): Bump mypy from 2.3.1 to 2.4.0 (@dependabot[bot])
- #483 - Build(deps): Bump release-drafter/release-drafter from 7.7.0 to 7.9.0 (@dependabot[bot])
- #481 - Build(deps-dev): Bump ruff from 0.16.9 to 0.16.10 (@dependabot[bot])