github chrisuthe/SendspinDroid v2.0.0-Beta18

latest release: dev-latest
pre-release3 hours ago

This build speaks the Sendspin 1.0.0-rc1 protocol. It needs a server that does too: Music Assistant 2.11 (beta or nightly), or anything built on aiosendspin 10 or later. It will not connect to older servers, so update the server first, or stay on Beta17 until you can.

Requires an rc1 server

The wire format changed in 1.0.0-rc1 and this build only speaks the new one: every message is encrypted, audio chunks carry a longer header, large messages are fragmented, and pairing uses the released method names. Existing pairings made with Beta17 against an older server may need to be made again after the server is updated.

New

  • Seek from the app, and the transport buttons now follow what the server says it supports.
  • Artwork over the Sendspin connection (artwork@v1), so album art no longer depends on a separate HTTP fetch.
  • Calls pause the group; other apps' audio mutes this player. A phone call sends a pause to the server and resumes afterwards. A video or notification in another app mutes this player while the group keeps playing, and unmutes when it finishes.
  • Reconnecting never gives up. The playback service now owns one reconnect loop: it retries with a growing delay up to once a minute, indefinitely, and immediately when the server reappears on the network. Previously it stopped after a fixed number of attempts and could sit in "Network error" until the app was restarted (#263).
  • Mute is independent of volume and is remembered.

Sync and playback

  • Sync correction follows the player@v1 specification: small, inaudible one-sample corrections inside the spec's speed limit, and a single resync when the error passes 1 ms. Measured on a test tablet it holds within about a tenth of a millisecond once settled.
  • The clock's measured drift is now applied when converting timestamps.
  • The buffer the player asks the server for is sized from how late audio actually arrives on your network, instead of a fixed value.
  • Skipping tracks is clean: a skipped track's audio can no longer be played after the skip, and a new track starts in about half a second.
  • Pause stops at once and play comes back in time, with no blip of old audio.
  • FLAC: fixed a stumble of about a tenth of a second at the start of tracks. Decoded audio was occasionally placed one chunk late and the following chunk dropped. Opus had the same fault once per session.
  • Decoding takes about a third of the time it did.
  • A stream whose codec cannot be set up is now silent instead of playing noise.
  • The automatic output-latency estimator is removed. The manual sync offset in Settings remains for speaker or Bluetooth delay.

Protocol and security

  • Cleartext messages after the encrypted handshake are rejected and close the connection.
  • client/goodbye is delivered before disconnecting; a handshake that stalls times out.
  • The player stays available once its clock has synchronised, which fixes Music Assistant showing a spinner on play.
  • Metadata and controller state from the server are treated as complete state, and fields a new track does not have are cleared.
  • The store that holds pairing secrets is excluded from device backup and is never reopened unencrypted. If it cannot be read it is recreated, and servers need pairing again.
  • Pairing secrets are kept out of the debug log.

Fixed

  • stream/end and stream/clear were ignored when the server used unversioned role names (#253).
  • output_delay_ms is reported and accepted under the name the spec gives it (#258).
  • A new track's elapsed time starts from the new position.
  • The add-server button no longer sits under the navigation bar.

Removed

  • A large amount of unused code from the old XML interface, with no change in behaviour.

Known issues

  • #254 - transport controls can freeze after backgrounding with Back and returning
  • #255 - server volume pushes move the slider without changing device volume
  • #262 - High Power mode may not take effect until the app is force-stopped
  • #264 - IPv4 fallback with mDNS
  • A cold connect can make one small sync correction in the first couple of seconds.
  • Dynamic pairing code has not been tested on a device against an rc1 server.
  • Sync has been measured on one tablet model; reports from other devices are welcome.

Don't miss a new SendspinDroid release

NewReleases is sending notifications on new releases.