v0.10.5 - Stable Release
Stable build of CAMusic for Android.
Install
- Download camusic-0.10.5.apk below (Android 12 / API 31+).
- 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 newStreamEndPolicytells 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
MediaProjectioncapture, 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).