Skip to content

Releases: engabd11/CAMusic

v0.10.8 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 24 Aug 11:45

Stable build of CAMusic for Android phones and tablets (the mobile flavor — same package id every prior release has shipped).

Install

  1. Download camusic-0.10.8.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 53) — same signing key, so your servers, credentials and downloads survive.

Six new features, all off by default and toggled in Settings → Appearance.

New, settings-gated

  • Swipe to skip. Swipe right on Now Playing for the next track, left
    for the previous.
  • A live audio visualizer on Now Playing — animated bars over the
    bottom of the album art, driven by the same analysis Light Sync
    already computes, at no extra cost.
  • An interactive music map below the seek bar for tracks with an
    offline scan: one coloured band per song section, tap to seek there
    directly. Local sessions only.
  • Harmonic DJ mode for the offline auto-queue — the on-device radio
    now favours the next track by Camelot-wheel key/tempo compatibility
    when a scan is available, on top of the existing genre/artist ranking.
  • Phone sensor gestures: shake to skip, flip face-down to pause,
    double-tap the body to play/pause.
  • Listening DNA on the Stats screen — your dominant keys and BPM
    sweet spot, drawn from the same track scans.

Light sync

On-device stem separation for Phantom Stage. The instrument-position
light layer used frequency-band proxies to guess where vocals, bass and
drums sit; it now reads real per-section stem energy computed during the
offline scan (a mid-side decomposition alongside the existing mono
analysis), when the setting is on and a scan provides it.

Fixes

  • A seek could leak into the next track — scrubbing mid-track and
    then skipping before the position caught up left the seek bar and time
    pinned to the old track's position.
  • The transport play/pause icon shifted slightly when its active-state
    glow appeared, because the icon's container had no fixed size.
  • Starting the sleep timer shifted every chip after it in Now
    Playing's chip row; the countdown lives in the chip's accessibility
    label now instead of widening it.

v0.10.7 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 23 Aug 23:56

Stable build of CAMusic for Android phones and tablets.

Install

  1. Download camusic-0.10.7.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 52) — same signing key, so your servers, credentials and downloads survive.

This build is the mobile flavor — the same app every prior release
has shipped, same package id. A separate Android TV build now exists
too (see below) but is not this APK.

Android Auto

Browse, play and speak from the car. A new car session mirrors whichever
of local playback, the phone's own Sendspin stream, or a remote Music
Assistant speaker is actually active, and routes every transport command
through the same ownership authority the rest of the app uses. Tapping a
track in the car always plays it on this phone — never a remote MA
speaker that happens to be selected on the phone's own Speakers screen —
and no stream or cover URL crosses the exported binder, since some
servers embed credentials in those query strings.

Android TV — first release (MVP)

A new tv build flavor, reusing the same business logic as the phone
app behind new D-pad-navigable screens: Now Playing, Library, Queue,
Light Sync and Settings, with first-run setup for Music Assistant,
Navidrome, Jellyfin and local files. Downloads, DSP, Stats and Speakers
are deferred to a fast-follow. Not part of this download — see the
separate TV release if you're setting up on a television.

Phone UI polish

  • Library shelves are two-row carousels that scroll sideways instead
    of wrapping into the page's own grid — finding a section and browsing
    it are now two different gestures instead of one.
  • Category tiles are art-directed: a colour and glyph instead of a
    bordered row with a chevron, tinted from whatever's currently playing.
  • Settings explanations move behind an info chip on the control's
    own title, so a six-line paragraph under one switch no longer pushes
    the next three controls off the screen.
  • One motion language applied consistently across the phone UI.
  • The album cover no longer flashes off and back on when skipping
    between tracks of the same album — some servers hand out a different
    artwork URL per track for the identical picture, which was read as a
    cache miss.

v0.10.6 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 23 Aug 06:34

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.6.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 51) — same signing key, so your servers, credentials and downloads survive.

Fix: 0.10.5's TTS fix made announcements worse

0.10.5 set out to stop announcements losing their last words, and instead
made them cut off right after the pre-announcement tone, before the
sentence began. Four compounding faults, found and fixed:

  • The classifier that tells an announcement apart from a paused/ended
    music stream was reading the wrong field from Music Assistant's event
    and never actually ran — every stream fell back to "music," so none
    of 0.10.5's announcement handling ever engaged.
  • A tail-drain could act on whatever was playing now rather than the
    stream it was started for — and MA plays an announcement by ending the
    music stream and starting the announcement a few hundred milliseconds
    later, squarely inside the drain's own window, so the drain cut the
    announcement it was supposed to protect.
  • The drain considered its job done once bytes reached the player, not
    once they were actually heard, so it could cut up to a second of real
    audio still sitting in the decoder.
  • A signal meaning "no more frames are coming" was also being treated as
    "abandon what's left," which defeated the drain outright on one path.

Not yet verified on a device — this is entirely about the timing of what
Music Assistant sends and when.

Fix: the wave seek bar wobbled on music you hadn't heard yet

The whole bar was one continuous wave clipped into two colours, so the
unplayed stretch ahead of the knob wobbled along with the played part
behind it. Only the played stretch waves now; the rest is a straight
rail, with the wave smoothly flattening into it under the knob.

Android TV preview (debugging build, PR #93)

Choose a tag to compare

@engabd11 engabd11 released this 23 Aug 13:43

Debug-keystore-signed release builds (same signing/minification as the app's normal release build type - see release.yml's comments) built from the feat/android-tv branch, for sideload-testing PR #93 before it merges. Not a real version release - versionName/versionCode are unchanged from v0.10.6.

  • camusic-0.10.6-tv-preview-tv.apk - the new Android TV build. Install on a Google TV/Android TV device or emulator; launches via the LEANBACK_LAUNCHER row.
  • camusic-0.10.6-tv-preview-mobile.apk - the phone build off the same branch/commit, included for side-by-side comparison. Behaviorally identical to v0.10.6.

See PR #93 for details: #93

v0.10.5 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 23 Aug 04:24
11d001e

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.5.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 50) — same signing key, so your servers, credentials and downloads survive.

Fifteen fixes across the library, player, driving bar and light sync,
plus a more accurate offline analyser and a performance pass on the
light-show layers.

Regressions from 0.10.4, fixed

  • Artist pages painted slowly. The previous fix for top-tracks
    pop-in made the whole page wait on the slowest of several sequential
    calls. Each shelf (biography, similar artists, top tracks) now loads
    independently with its own skeleton.
  • The wave seek bar's track and wave didn't line up, from being two
    separately drawn shapes; now one path, drawn twice.

Fixed from 0.10.4's deferred list

  • TTS/announcements were cut off around 40% of the time. The
    stream-end signal is identical for "paused," "track ended" and
    "announcement finished" — a new StreamEndPolicy tells them apart, so
    only a real pause mutes and discards the tail.
  • No sound played over another app (e.g. a YouTube video).
    Announcements asked for permanent, exclusive audio focus instead of a
    transient, duckable request; fixed, and the engine now stays warm for
    a minute after losing focus instead of tearing down and rebuilding for
    the next announcement. A related bug meant MA could go silent
    permanently after any local-player handover, since regaining focus
    never restored the volume a previous loss had zeroed.

Light sync

  • Album colours in the room were muddier than the app's own colour
    picker.
    Backports three corrections already used elsewhere: proper
    k-means++ seeding, a most-chromatic-quarter cluster representative
    instead of a plain mean, and a cap on neutral swatches.
  • MA on a remote speaker claimed to react to the beat and didn't.
    No audio is ever decoded on this phone in that case. The show now
    drives off the offline track scan (beat grid, sections, intensity)
    instead, with a new position-smoothing layer absorbing MA's coarse
    playhead corrections without visible jumps.
  • Optional: react to other apps' audio, via Android's
    MediaProjection capture, off by default and requiring explicit
    consent. YouTube and YouTube Music opt out of capture entirely and
    deliver silence with no error — a watchdog now says so explicitly
    instead of the lights just looking broken.

Everything else

  • Downloads is a real library now — reachable from the library switcher
    with artists, albums and tiles, instead of a flat list on its own.
  • Six independent bugs in the local device-files source, any one of
    which could empty the library (a folder saved as JSON and read by
    splitting on |, a reachability check comparing incompatible URI
    types, a permission that was declared but never requested, and three
    more).
  • The Light Sync tuning sliders no longer snap back on release, and
    claim a larger touch target.
  • The driving bar docks flush to the bottom edge, drags correctly, and
    a car reconnecting no longer un-dismisses it.
  • Album art now turns like a page between albums (never between tracks
    of the same album).

The analyser, version 3

Measured against real music rather than a synthetic test: transposing a
track by N semitones used to move its detected key by N only 12.4% of
the time, against an 8.3% chance floor — barely better than guessing.
Three compounding faults, found by building a measurement harness rather
than by reading the code: the chroma couldn't resolve a semitone across
most of its range, it assumed perfect A440 tuning against a corpus that
runs 4–24 cents off, and it was crediting a note's third harmonic as its
own pitch. Fixed, shift-consistency rises to 71.1%. This is what
MusicDnaLayer's hue anchor and every scan-driven light show read from.

Performance

The four light-show layers were allocating a fresh map and several
short-lived arrays per lamp, every frame, on the one thread in the app
with a hard real-time deadline. Removed, along with two places that were
recomputing an answer that hadn't changed since the last frame.

Also

  • The native output library is now 16 KB page-aligned on 64-bit ABIs,
    so the app no longer loads in Android's compatibility mode on newer
    devices.
  • Fixed a capture-consent crash on Android 12 (a typed API only
    available from 13 onward).

v0.10.4 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 22 Aug 05:29

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.4.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 49) — same signing key, so your servers, credentials and downloads survive.

Build system upgrade: AGP 9.3.1, Gradle 9.7, compileSdk 37

No user-facing change from the upgrade itself, but it brings Material 3
Expressive fully online across the app: spring-based motion physics on
every standard component (switches, sliders, chips, buttons,
navigation), the full emphasized typography set, and the complete
8-level shape scale. Previously only partially wired in by hand; these
now come from the platform.

Fixes

  • Artist pages no longer visibly reflow after opening. Top tracks
    and albums land in the same recomposition instead of the albums
    showing first and the top-tracks shelf popping in a beat later.
  • An MA seek/skip glitch that could jump the timeline by up to 3
    seconds
    — the position was re-anchored from a stale polled value on
    the same tick a seek freeze released, on top of a target it was
    already correctly snapped to.
  • Bluetooth headset buttons now resume whichever player is actually
    paused.
    Hardware transport controls were routed through an MA-only
    path, so resuming from a paused Navidrome session via a headset could
    silently do nothing.
  • A TTS/announcement focus bug that could go silent for the rest of a
    session.
    A single denied audio-focus request (racing another app's
    momentary grab) used to permanently disable every later focus request
    instead of just that one.
  • Onboarding could re-trap returning users on every launch via a
    legacy fallback screen with no way out; removed.
  • The local ("This device") library failed to connect because it
    was rejected for having no server URL, which doesn't apply to local
    files.
  • The driving bar's dismiss (×) now actually dismisses it for the
    current drive, and the overlay no longer draws over the app's own
    foregrounded screen.

New: a wave-style seek bar

Settings → Appearance now offers a "Seek bar" style — Line or Wave. The
wave skin draws the played portion as a sine wave that wobbles while
playing and eases flat on pause.

v0.10.3 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 19 Aug 15:47

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.3.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 48) — same signing key, so your servers, credentials and downloads survive.

Fixes

  • Transport buttons now align with the play button. They were
    centred against the whole quality-chip-plus-play-button column, which
    sat them visibly above the play button's true centre.
  • A library-switch race that could connect to the wrong server.
    Switching libraries from the quick-switch overlay could call connect
    before the new server was persisted to settings, so the app rebuilt the
    connection with the new server's address but the old server's kind and
    credentials — Local sometimes landed on Navidrome, and Navidrome or
    Jellyfin could show an empty library.
  • The Backup & Restore settings row is clickable again — it had a
    leftover no-op tap handler from before it was wired to open in place.

Reverted from 0.10.2

The larger slider touch targets shipped in 0.10.2 caused regressions
elsewhere and are reverted pending a cleaner pass; sliders are back to
their previous size and behaviour for this release.

v0.10.2 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 19 Aug 13:01

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.2.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 47) — same signing key, so your servers, credentials and downloads survive.

Fix: direct Hue light sync going unresponsive on Music Assistant playback

0.10.0's deeper ExoPlayer buffer (added for the pause/seek latency fix in
0.10.1) put several seconds of latency between MA starting playback and
the audio analysis tap actually receiving data — light sync would start
successfully and then sit waiting with no reaction. The buffer is shallow
again; SendspinSyncDataSource's own read-blocking is what paces the
stream, so a deep ExoPlayer buffer was only adding latency, not safety
margin.

Fix: onboarding wrongly asked non-MA users for speaker registration

Jellyfin, Navidrome and local-library users were shown a Music Assistant
speaker registration step that doesn't apply to them, plus an extra
onboarding screen they had no reason to see. Also improves the error
messages shown for common Subsonic/Navidrome connection failures (401,
403, 404, 405) and handles older Navidrome servers that don't support the
OpenSubsonic extensions the app otherwise probes for.

UI smoothing and quick usability fixes

  • Slider touch targets grow from 18dp to 48dp, with a smoother knob
    animation while dragging.
  • Sheet transitions (the queue menu, Now Playing overlay) use softer
    spring physics — less jumpy, no visible correction at the end of the
    motion.
  • The library badge is bigger, centred, and tappable for quick library
    switching.
  • Artist top tracks pre-load alongside artist info instead of after it.
  • Listening stats moves to its own row in the main Settings list instead
    of sitting inside About.
  • Now Playing's transport buttons align to the play button's centre, and
    the quality badge centres between the play button and the seek line.

v0.10.1 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 18 Aug 06:59

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.1.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.10.x (versionCode 46) — same signing key, so your servers, credentials and downloads survive.

Fix: pausing or seeking on Music Assistant could take up to 12 seconds to go silent

Root-caused against a live repro on a real device, across three
compounding issues in the MA playback path:

  • The loader only checked whether to keep buffering once every 1 MB —
    sized for downloading a file, not for pacing FLAC audio — which let it
    pull 6-8 seconds ahead of real time before the buffer limit was ever
    consulted.
  • Whenever the clock filter hadn't reconverged in time, frames were
    handed to the player unpaced with much looser buffer bounds, which was
    the common case on most pause/resume cycles, not an edge one.
  • A frame already popped off the queue and being waited on ignored a
    stream-end signal that arrived mid-wait, so pause could stay audible
    for however many seconds that one frame was scheduled out.

Pause and seek now land in well under a second. The residual buffered
tail (kept deliberately, so a genuine track boundary still sounds
gapless) is muted rather than removed, so pausing sounds like a pause
instead of "it un-pauses, then pauses again a moment later."

Also

  • The Speakers tab's group badge now says LEADER instead of LIVE — the
    useful fact there is which player is driving sync, not that the group
    is live.

v0.10.0 - Stable Release

Choose a tag to compare

@engabd11 engabd11 released this 17 Aug 15:44

Stable build of CAMusic for Android.

Install

  1. Download camusic-0.10.0.apk below (Android 12 / API 31+).
  2. Allow install from unknown sources, then open it. Installs over 0.9.x (versionCode 45) — same signing key, so your servers, credentials and downloads survive.

The v0.10 plan, built from a full codebase audit rather than assumed from
docs. Four new Light Sync layers, four driving-mode features, and a batch
of smaller additions — each independently gated and off by default unless
noted.

Four creative Light Sync layers

Off by default, additive on top of the existing engine:

  • Music DNA — a per-track visual fingerprint from tempo, detected key,
    intensity and song structure.
  • Emotional Arc — colour temperature follows the song's live
    structure rather than staying fixed.
  • Phantom Stage — instrument groups pinned to fixed positions in the
    room, as if the band were standing there.
  • Phone Conductor — the phone's own motion becomes a lighting
    control.

All four stay inside the existing brightness ceiling and effect-rate
limiter.

Driving mode gets four more features

  • Speed limit alert: a single gentle tone once you've been over the
    limit (plus tolerance) for 5 straight readings, repeating at most every
    30 seconds.
  • Speed-adaptive volume, sharing the same GPS subscription as the
    alert.
  • Auto-pause on a phone call, opt-in, that deliberately never
    auto-resumes on hangup — a notification offers the tap back instead,
    since you may not have been mid-song when the call started.
  • A shuffle toggle in the driving bar.

Every driving addition is off by default and asks for its own permission
(location, phone state) only when turned on.

Also new

  • A listening-statistics screen (Settings → About → Listening stats):
    total time, top artists, most-played track, and format/server
    breakdowns over the last 7 days.
  • Encrypted settings backup and restore — export every setting,
    including saved servers, to a password-encrypted file.
  • Long-press the Now Playing cover for quick actions: go to album, go
    to artist, share.
  • Swipe a track row — right to queue it, left to play it next.
  • Beat-aligned track fades, timing the existing sequential
    fade-out/fade-in to land on a beat rather than an arbitrary offset.
  • A notification when a USB DAC connects, pointing at the existing
    output picker in Settings → Audio.
  • Jellyfin's scrobble position no longer drifts on pause — it was
    derived from wall-clock elapsed time, so a paused track could report
    itself finished twice over.

Under the hood

The dead, never-selected SendspinAudioEngine (1,035 lines) is gone; the
ExoPlayer path has been the only Sendspin engine on real hardware since
0.9.0.

The experimental native Oboe output path is unchanged and still off by
default; a further fix and the original investigation stay open on
separate branches for the next release.