Switching the library between online and offline rebuilt the player unconditionally (release -> new ExoPlayer -> setMediaItems -> prepare), which paused audio and even restarted playback after server property edits. - entering automatic offline is now a pure state flip: the queue and the player are untouched, unplayable entries are skipped by the playback failure recovery, and the original order resumes once the server is reachable again - returning online does nothing: stream URLs are re-resolved on the next load through the regenerated music service - engaging manual offline mode prunes the timeline in place instead of rebuilding the player: removals never touch the playing item, rebuilt URIs are applied via replaceMediaItem at adjusted indexes - the transition decision is extracted into AccessStateTransitions and the prune plan into OfflineQueuePruner, both unit-tested - the bus subscription is replaced by a single accessState collector, which also removes the cross-coroutine serverSelectionChanged flag race and the pointless player restart on server property edits - the access state reaction replaces the racy flag with a previous-state comparison; full player rebuilds remain for JUKEBOX switches, server switches and the unplayable-current-item fallback
Ultrasonic
Ultrasonic is free and open-source music streaming Android client for OpenSubsonic API (version 1.7.0 or higher) compatible servers.
Help wanted
We currently don't have that much time to spend developing Ultrasonic, so any contributions or active developers are always welcomed. Have a look at CONTRIBUTING to get started.
Download
App is available to download at following stores:
Warning: All three versions (Google Play, F-Droid and the APKs) are not compatible (not signed by the same key)! You must uninstall one to install the other, which will delete all your data.
If you want to use the version downloaded from F-Droid or from GitLab with Android Auto, you must enable Unknown Sources as it is described in this wiki page.
Bugs and issues
First, see if your issue haven’t been yet reported here, otherwise open a new issue.
Documentation
See documentation.
Contributing
See CONTRIBUTING.
Supported (tested) OpenSubsonic API implementations
Other OpenSubsonic API implementations should work as well as long as they follow API documentation.
License
This software is licensed under the terms of the GNU General Public License version 3 (GPLv3).
Full text of the license is available in the LICENSE file and online.


