github chrisuthe/SendspinDroid v2.0.0

4 hours ago

SendSpin Player 2.0.0 is the first stable release since 1.0.52. It is a rewrite of the app, tested over 24 betas, and it speaks SendSpin 1.0 with encrypted connections.

Before you update

  • Your server must speak SendSpin 1.0: Music Assistant 2.11 or newer. 2.0.0 cannot connect to older servers, so update the server first. There is no way back: Android will not install 1.0.52 over 2.0.0, and uninstalling to go back deletes your saved servers and settings.
  • Updates in place. 2.0.0 installs over 1.0.x from GitHub Releases and keeps your data. It still runs on Android 8.0 and newer.
  • Installed from Google Play? The APK on this page may not install over the Play copy, and uninstalling to get round that deletes your saved servers and settings.
  • Your settings carry over. That covers saved servers and your default server, Player Name, Manual Sync Offset, Preferred Audio Codec, Full Screen Mode, Keep Screen On and Low Memory Mode.
  • The server will likely list a new player. The app now identifies itself with a new encryption key instead of the old player ID, so your server will most likely show it as a new player. Groups and settings made for the old entry on the server, and Home Assistant automations or dashboards that use the old player, do not carry over. Remove the old entry and point them at the new one.
  • How it finds the server on first start. If you had a default server, the app keeps searching and connects to it as before. If not, it uses the new default: it announces itself on the network and waits for a server to connect. Any SendSpin server on your network can then connect to it and play. To search instead, and stop waiting, tap "Search for servers instead".
  • Remote access and proxy access are gone. The app connects on the local network only. A saved server with only a Remote ID or a proxy address stays in the list but cannot connect: edit it and save it with its local address.
  • Codec on WiFi and Codec on Cellular are gone. The app uses your Preferred Audio Codec on every network.
  • Debug Logging is now a Log Level. If it was off, it is now Warn, so a bug report has something in it. Logs stay on the device until you share them. You can set Off in Settings > Diagnostics & Feedback.
  • Low Memory Mode can turn itself on. On a device with 2 GB of RAM or less it turns on, unless 1.0.x saved the setting, which it did if you ever opened Settings there. When on, it hides album art, also on the lock screen and notification, and limits PCM to 16-bit. You can change it in Settings > Performance.
  • A notification stays up while the app is connected or waiting for a server. It keeps Android from cutting the connection in the background.
  • Permissions changed. The camera permission is gone. Starting at boot (for Auto-Start on Boot) and the battery optimization exemption (for High Power Mode) are new. Neither asks you anything when you update.
  • Coming from a 2.0 beta? The Music Assistant library, search and queue (in the app and in Android Auto), speaker grouping and the Music Assistant login from the early betas were removed in Beta16 and Beta19. They are not in 2.0.0. Browse and group from Music Assistant itself.

What's new

Connecting and pairing

  • Every connection to the server is encrypted.
  • Pairing: Settings > Pairing shows this device's pairing token, with a copy button and a QR code, to enter on a server that asks for pairing. It also shows the Client ID, the result of the last pairing attempt, and your paired servers, each with a Forget button.
  • When a server will not play until the player is paired or approved, Now Playing says what to do instead of showing controls that do nothing.
  • Two ways to connect: the app announces itself on the network and waits for a server such as Music Assistant to connect (the default for new installs), or it searches for servers and you pick one. Switch between them from the server screen. Adding a server by address works in both.
  • Reconnecting never gives up. It retries with a growing delay, up to once a minute, and tries again at once when the network or the server comes back. A dead connection, such as a server that went silent, is noticed within about 20 seconds, sooner while playing, instead of showing "Connected" forever.
  • A saved server whose IP address changed, for example after a router restart, is found again at its new address.
  • Moving to a different network reconnects at once. Changes that are not a real network switch (an IPv6 address rotation, a DHCP renewal, a VPN going on or off) no longer reset sync or drop a working connection. IPv6 addresses and IPv6-only servers work.
  • Add Server is a full-screen guided flow: find the server, test the connection with a clear error if it fails, then save it, optionally as the default.

Playback and sync

  • Playback starts at the actual hardware output position. After that, sync errors over 0.1 ms are corrected one sample at a time, and anything over 1 ms is fixed at once. 1.0.x let up to 10 ms go before it corrected.
  • The clock re-syncs right after the device wakes from deep sleep, and playback recovers from clock jumps and dropouts without throwing away the audio it has buffered.
  • Pause stops at once, and no audio from the skipped track plays after a skip.
  • Seek with the progress bar on Now Playing when the server supports seeking: drag it on a phone or tablet, or select it and press Left or Right on TV. You can also seek from the lock screen, the notification and Android Auto. 1.0.x could not seek.
  • The track position follows the server's progress and playback speed, in the app and on the lock screen.
  • A phone call pauses the group on the server and resumes it afterwards. Short sounds from other apps, such as a notification or a navigation prompt, mute only this player while the group plays on. If another app starts playing for good, such as another music app, this player mutes and drops out of the group until you play on it again. Unplugging headphones or disconnecting Bluetooth pauses the group instead of switching to the phone speaker.
  • Volume follows the SendSpin loudness curve on the device's own volume steps, so grouped players of different makes play at matching levels. The same percentage may sound different from 1.0.x. On HDMI and other fixed-volume outputs the volume is kept, and mute is now separate from volume. Both are remembered across restarts.
  • The audio thread runs at audio priority, so playback stays smooth with the screen off and under Android Auto.

Audio formats

  • PCM can be the Preferred Audio Codec, next to Opus and FLAC. Codecs this device cannot decode are grayed out.
  • PCM at 24 and 32 bits on Android 12 and newer.
  • A codec or bit depth change during playback is gapless and plays at the right pitch.

Phones, tablets and TV

  • The whole interface is rebuilt in Jetpack Compose, with layouts for phones, 7-inch and 10-inch tablets, TVs and car head units, in portrait and landscape.
  • Now Playing shows elapsed and total time, the release year and, on tablets and TV, the album artist when it differs from the track artist. Swipe the album art to see the artist photo when the server sends one (on TV, press OK).
  • Album colors: Now Playing takes its colors from the palette the server sends for the track. On by default. Settings > Display also has a Theme choice: System, Light or Dark.
  • Android TV: the app shows in the TV launcher, works with the D-pad remote, has a side menu, and uses the dark theme by default. The remote controls the volume, and turning the TV on or off does not pause the group.
  • Head Unit layout for large portrait car screens, with big album art and large controls: Settings > Layout Mode > Head Unit.
  • The first-run welcome asks for the player's name, so servers see that name from the start. Renaming the player in Settings reaches the server right away.
  • The APK is about 5 MB, down from about 69 MB.

Android Auto

  • The Connect list shows your saved servers, most recently used first. When the app is set to search for servers, the servers found on the network follow. It replaces the Recent and Manual Servers folders. With no server around, it says what to do instead of showing an empty screen.
  • The app requests audio focus when it starts playing, so the car switches its output over from the radio or another app.
  • The car screen and the lock screen no longer keep the previous track's title, artist or album when the new track has none.

Settings and diagnostics

  • Auto-Start on Boot (off by default) starts the player when the device boots, waiting for a server or connecting to your default server.
  • High Power Mode (off by default) is for always-on devices. While connected, it keeps WiFi and the CPU awake, and the screen on while the app is open. It also offers to turn off battery optimization for the app.
  • Low Memory Mode now also asks the server for 16-bit PCM only and turns off the image cache.
  • Report a problem (Settings > Diagnostics & Feedback) shares redacted logs and a diagnostic snapshot through the share sheet. The message includes a link to a pre-filled GitHub issue. After a crash, the next launch offers to share the redacted logs. Log Level goes from Off to Verbose, and exported logs have IP addresses, URLs, tokens and the names of your saved servers removed.
  • Stats for Nerds is reworked: whether playback is in sync at the top, then sync, clock, buffer, protocol and network detail, the stream format, the encryption and pairing state, and recent reconnects.
  • Optional anonymous telemetry, off by default, shares network handoff outcomes with no addresses, names or logs, over unmetered networks only.

Known limitations

  • Dynamic pairing code is off by default and marked Experimental. It stays that way until it has been tested against Music Assistant 2.11. It lets a server pair with a 6-digit code or a QR code shown on the device. To try it, turn on Settings > Pairing > Dynamic pairing code. The pairing token keeps working either way.
  • Local network only. There is no remote or proxy access. To listen away from home, bring the device onto your home network with a VPN.
  • Waiting for a server needs the server to reach the device. The server connects on TCP port 8928, or the port shown on screen. A guest network or a firewall can block that. Search for the server or add it by address instead.
  • On Android 15 and newer, Auto-Start on Boot posts a notification to tap. It does not start the player by itself, because Android no longer lets media apps start at boot. Notifications must be allowed for it.
  • Switching the Preferred Audio Codec to Opus or FLAC applies from the next connection. The stream already playing keeps its codec.
  • Artwork can go stale on the lock screen. A track with no artwork after one with artwork can keep the previous image on the lock screen, notification and Android Auto.
  • Speaker groups are managed on the server. The app can switch between groups but cannot change who is in one.
  • An error message is out of date. For a server that is too old, the app may say "Music Assistant 2.9 or newer is required". 2.0.0 needs Music Assistant 2.11 or newer.

Full Changelog: v1.0.52...v2.0.0

Don't miss a new SendspinDroid release

NewReleases is sending notifications on new releases.