Skip to content

Releases: chrisuthe/SendspinDroid

DEVELOPMENT BUILD

06 Mar 18:39
4d59d9c

Choose a tag to compare

DEVELOPMENT BUILD Pre-release
Pre-release

Automated development build from commit 4d59d9c

v2.0.0-Beta5

05 Mar 14:23

Choose a tag to compare

v2.0.0-Beta5 Pre-release
Pre-release

What's Changed

Bug Fixes

  • Fixed "Queue not found" error when tapping to play -- Queue resolution now uses the server's player_queues/get_active_queue API instead of a client-side approximation that only checked sync leader. This properly handles grouped players, active source routing, and protocol player fallbacks. (#50)

  • Fixed Add to Queue and Play Next silently replacing the queue -- The play media command was sending the wrong parameter name (enqueue instead of option), causing the server to ignore the enqueue mode and default to replacing the queue on every play action. Add to Queue and Play Next now work as expected. (#50)

Full Changelog: v2.0.0-Beta4...v2.0.0-Beta5

v2.0.0-Beta4

04 Mar 20:53

Choose a tag to compare

v2.0.0-Beta4 Pre-release
Pre-release

What's New

Queue Actions for Folders

Browse folder rows now have a 3-dot menu with Append to Queue and Replace Queue actions, making it easy to queue entire folders without navigating into them first.

Smarter Audio Buffer Sizing

Buffer capacity is now calculated from a target duration (35 seconds) and the stream's actual audio format, instead of using flat byte limits. This keeps memory usage predictable regardless of codec -- PCM streams get ~35s of buffer, while compressed formats like FLAC naturally fit more.

Bug Fixes

  • Keystore crash on some devices -- Fixed a crash on certain MediaTek/OEM devices where the Android Keystore would throw an Error (not Exception) during first-run key generation for encrypted preferences.
  • Player unavailable after idle -- When a player goes idle and becomes unavailable, the app now shows a friendly message instead of a raw API error.

Internal

  • Release builds now include native debug symbols and R8 mapping files for improved crash reporting on Google Play.

Full Changelog: v2.0.0-Beta3...v2.0.0-Beta4

v2.0.0-Beta3

04 Mar 03:07

Choose a tag to compare

v2.0.0-Beta3 Pre-release
Pre-release

SendSpinDroid v2.0.0-Beta3 Release Notes

Changes since v2.0.0-Beta1 -- 212 files changed, ~18k lines added, ~10k removed.

Architecture: Kotlin Multiplatform Restructure

The entire Music Assistant integration layer was migrated to a new :shared KMP module, laying the groundwork for future iOS support:

  • Created :shared module with platform abstractions, models, filters, and protocol code
  • Migrated transports from OkHttp to Ktor for cross-platform compatibility
  • Moved MA models, WebSocket transport, multiplexer, and SignalingClient to :shared
  • Extracted MaCommandClient and MaAuthHelper as shared components
  • Consolidated ServerRepository into a single UnifiedServerRepository
  • Added 96 unit tests for the shared MA layer
  • Comprehensive code review pass: fixed all 18 critical, 30 high, 35 medium, and 12 low-priority issues
  • Encrypted auth token storage

New Features

  • Redesigned mini-player -- Replaced volume slider with skip controls and elapsed/remaining time display; smooth progress interpolation; configurable position (top/bottom); thicker 3dp progress bar
  • Album-artist filter -- New filter chip on the Artists tab to show only album artists, reducing clutter from featured/compilation artists
  • Audiobook support -- Chapter navigation and playback speed control for audiobook media
  • Friendly server names -- mDNS discovery now extracts the human-readable name from TXT records instead of showing the raw service ID
  • Artwork clearing -- Properly clears album art when the server sends an empty artwork payload (e.g., between tracks with no art)
  • 24-bit and 32-bit PCM audio -- Advertises higher bit depth PCM formats on supported hardware (API 31+) for improved audio quality
  • Static delay reporting -- Sends static_delay_ms in client state for better server-side latency compensation
  • Exit App option -- Added to the overflow menu for clean shutdown
  • FOSS compliance -- Replaced Google ML Kit with zxing-cpp for QR scanning; added fastlane metadata (screenshots, icon, changelogs); disabled dependenciesInfo for F-Droid/IzzyOnDroid compatibility

Bug Fixes

  • Fixed buffering spinner showing over album art when playback is paused
  • Fixed FLAC audio garbled on devices that advertised 32-bit -- compressed codecs now correctly stay at 16-bit
  • Fixed home screen stuck on "Failed to load" after backgrounding
  • Fixed WebRTC remote connections not auto-reconnecting when backgrounded
  • Fixed track timer resetting when navigating between mini-player and Now Playing
  • Fixed Now Playing state lost after returning from Settings
  • Fixed edge-to-edge nav bar overlap in Add Server Wizard
  • Fixed debug log export FileProvider path mismatch
  • Fixed playlist pagination only loading first 15 items (now loads all)
  • Fixed dashes in pasted Remote IDs causing connection failures
  • Fixed top bar title wrapping to a second line
  • Made clock sync convergence threshold adaptive to network jitter
  • Fixed JSON opt* extensions throwing on non-primitive values

CI/Build

  • Refactored CI workflows into focused single-purpose steps

v2.0.0-Beta2

19 Feb 04:07

Choose a tag to compare

v2.0.0-Beta2 Pre-release
Pre-release

What's New

Mini Player Improvements

  • Redesigned bottom mini player — Replaced volume slider with skip controls (previous/next) and a time display for a more useful compact view
  • Track progress bar — Added a thin progress indicator line at the bottom of the mini player that fills as the track plays
  • Smooth progress interpolation — Mini player timer and progress bar now interpolate smoothly between server updates instead of appearing stuck
  • Top/bottom position setting — The Mini Player Position setting in App Settings now works — place the mini player above or below your browse content

Bug Fixes

  • Fixed home screen getting stuck on "Failed to load" after backgrounding the app
  • Fixed track timer resetting to 0:00 when navigating between mini player and Now Playing
  • Fixed Now Playing state being lost after returning from Settings
  • Fixed WebRTC remote connections not auto-reconnecting when the app was backgrounded
  • Fixed edge-to-edge navigation bar overlap in the Add Server Wizard
  • Fixed debug log export crashing due to FileProvider path mismatch
  • Fixed top bar title wrapping to a second line

Connectivity & Performance

  • Adaptive clock sync — Convergence threshold now adapts to network jitter for more stable audio synchronization
  • Remote ID input — Dashes are now automatically stripped when pasting Remote IDs

Under the Hood

  • KMP restructure — Major refactor moving shared code into a Kotlin Multiplatform :shared module (protocols, models, transports, filters, MA layer)
  • Consolidated ServerRepository into UnifiedServerRepository
  • Migrated transports from OkHttp to Ktor in the shared module
  • Encrypted auth tokens in storage
  • Extracted hardcoded strings to resources
  • Comprehensive code review fixes (18 critical, 30 high, 35 medium, 12 low priority issues)
  • Added 96 new unit tests for the shared MA layer
  • Added Exit App option to overflow menu

v2.0.0-Beta1

17 Feb 01:10

Choose a tag to compare

v2.0.0-Beta1 Pre-release
Pre-release

SendSpin Player 2.0 is a ground-up rebuild of the Android app. Whether you're upgrading from 1.x or trying SendSpin for the first time, here's everything in the box.


Redesigned Interface

The entire UI has been rewritten in Jetpack Compose with Material 3 and dynamic color theming (Material You on Android 12+). The interface adapts automatically to your device:

  • Phone portrait — bottom navigation with a compact mini player
  • Phone landscape — navigation rail with a side mini player
  • Tablet — two-column Now Playing with an inline queue panel
  • Android TV — cinematic layout with full D-pad navigation and focus rings

Music Assistant Integration

2.0 adds a full library browser powered by Music Assistant. A tabbed Library screen lets you explore your collection across Albums, Artists, Tracks, Playlists, Radio Stations, and Podcasts — with detail screens, infinite scroll, and pull-to-refresh throughout.

The Home screen surfaces curated carousels (Recently Played, Recently Added, top Albums, Artists, Playlists, and Radio) so you can get to music quickly. A dedicated Browse tab provides folder-based navigation into provider content (local files, streaming services, etc.).

Search works across your entire library with real-time results grouped by type and filterable with chips.

Queue & Playlist Management

  • View, reorder, and clear the upcoming queue
  • Play Next to jump a track to the top
  • Save as Playlist from the queue overflow menu
  • Create, edit, and delete playlists; add or remove tracks from any screen
  • Tablet and TV layouts can toggle an inline queue panel alongside Now Playing

Speaker Groups

Manage your multi-room setup directly from the app. A speaker button on the Now Playing screen opens a sheet where you can view all compatible players, toggle them into a group, and see per-speaker loading states. Players are automatically powered on when added.

Android Auto

The Auto experience has been overhauled:

  • Flattened browse tree with top-level category tabs
  • Native queue listing with track metadata
  • Voice search integration
  • Track progress with elapsed/total time
  • Saved servers on the Connect screen
  • Proper audio focus handling and artwork display

Remote Access & Connectivity

  • WebRTC connections for reaching your Music Assistant server from outside the home network
  • QR code scanner for quick Remote ID entry
  • HTTP proxy support with authentication
  • mDNS/Zeroconf automatic server discovery on local networks
  • Redesigned Add Server wizard — a guided full-screen flow covering discovery, local/remote/proxy configuration, Music Assistant login, and connection testing

Audio Sync Improvements

The synchronization engine has been significantly refined:

  • DAC-position-aware startup — measures actual hardware playback position for faster initial lock and tighter alignment
  • Always-on silence — keeps DAC timestamps warm between tracks for quicker transitions
  • Slow time sync — after convergence, the Kalman filter drops to low-frequency maintenance bursts, reducing network overhead
  • Cursor-based sync error measurement — more accurate tracking of the gap between expected and actual playback position
  • Sync correction crossfades use 3-point interpolation to stay inaudible

Settings & Diagnostics

  • Configurable mini-player position (top or bottom)
  • Full-screen immersive mode and keep-screen-on toggles
  • Per-network codec preferences (WiFi vs. cellular)
  • Custom player name
  • Sync offset tuning
  • High Power Mode for always-on devices
  • Low memory mode for constrained hardware
  • Stats for Nerds — a real-time diagnostic panel showing clock offset, drift, sync error, buffer health, and DAC calibration with color-coded status indicators
  • Debug log export via system share

Testing & Quality

This release introduces a comprehensive automated test suite (160+ unit tests) covering Kalman filters, protocol parsing, playback state machines, connection selection, and library grouping — all enforced through CI on every commit.

Distribution

SendSpin Player is free and open source under the MIT license. Fastlane metadata is included for F-Droid / IzzyOnDroid distribution.

v2.0.0-alpha9

16 Feb 16:22

Choose a tag to compare

v2.0.0-alpha9 Pre-release
Pre-release

What's New

Browse Tab

  • New Browse tab in Library — explore folder-based provider content from SiriusXM channels, filesystem folders, RadioBrowser categories, and more using the Music Assistant browse API
  • Stack-based folder navigation with system back button support
  • Visual "Up" row at the top of subfolder lists for easy navigation
  • Pull-to-refresh support

Phone Landscape Layout

  • Side mini player — in phone landscape mode, the mini player moves to a vertical panel on the right side (200dp wide), freeing up vertical screen space for content
  • Navigation rail — phone landscape now uses a left-side navigation rail instead of the bottom bar
  • Phone vs tablet detection uses smallestScreenWidthDp for accurate layout selection
  • Stop button removed from mini player in both orientations

v2.0.0-alpha8

16 Feb 13:43

Choose a tag to compare

v2.0.0-alpha8 Pre-release
Pre-release

What's New

Tablet Now Playing - Toggleable Queue Panel

  • The inline queue panel on tablet Now Playing screen can now be toggled on and off via a queue button in the top app bar
  • When the queue is hidden in landscape orientation, the layout switches to a side-by-side view (album art left, controls right) so all controls fit without clipping
  • When the queue is hidden, the full secondary controls row (favorite, switch group, players) is displayed beneath the transport controls
  • Queue button styling updates to reflect active/inactive state

Bug Fixes

  • Fixed controls being clipped vertically on landscape tablet when queue panel was dismissed

v2.0.0-alpha10

16 Feb 18:29

Choose a tag to compare

v2.0.0-alpha10 Pre-release
Pre-release

What's New

Podcast Support

  • Podcasts tab in Library — browse your podcast library with publisher info, pagination, and sort options
  • Podcast detail screen — tap a podcast to see all episodes in a sortable list (newest, oldest, name, duration) with play/queue actions and playback status indicators
  • Podcast search results — podcasts now appear in search results with their own section and can be filtered with the Podcasts filter chip
  • Podcasts also appear correctly in Browse tab results

Player Grouping Fix

  • Player group list now filters by compatibility — only players whose provider or ID matches the current player's grouping rules are shown, matching the official Music Assistant frontend behavior
  • GROUP-type players are excluded from the grouping UI
  • Fixes errors when attempting to group incompatible players (e.g. Chromecast with Sendspin)

WebSocket Partial Result Support

  • Fixed truncation of large result sets — the MA server sends results over 500 items in batches. Previously only the first 500 items were captured. The WebSocket multiplexer now correctly accumulates all batches before delivering the complete result. This fixes podcasts with 500+ episodes and benefits any large library/playlist queries.

v2.0.0-alpha7

15 Feb 17:05

Choose a tag to compare

v2.0.0-alpha7 Pre-release
Pre-release

What's New in Alpha 7

Bug Fixes

Queue Now Shows Group Leader's Queue

  • When a player is synced to a group, queue operations now correctly target the group leader's queue instead of the local player's empty queue
  • Fixes the issue where grouped players would see an empty queue instead of the group's active queue
  • Affects all queue operations: viewing, enqueuing, clearing, reordering, shuffle, and repeat

Queue Auto-Refreshes on Track Change (Tablet/TV)

  • The inline queue panel on tablets and TV now automatically reloads when the track changes
  • Previously the "Now Playing" item at the top of the queue would go stale after a track transition

Commits Since Alpha 6

  • eb29060 - Fix queue to use group leader queue ID and auto-refresh on track change

Install: Download the APK below once the build completes and install on Android 8.0+ devices

Previous Release: v2.0.0-alpha6