Skip to content

Stash v0.9.93

Latest

Choose a tag to compare

@github-actions github-actions released this 09 Aug 06:10

Battery: playback no longer pays for effects you have off

The audio pipeline used to run every DSP stage on every buffer even when it was doing nothing — a disabled equalizer still copied the whole stream through itself, sample by sample. Profiling on-device put the pipeline at roughly half a CPU core during playback, with about a third of that burned by the disabled EQ, bass-boost, and preamp stages.

Stages that are off are now dropped from the pipeline entirely:

  • EQ off (the default): the equalizer, bass boost, and preamp cost exactly zero while you listen.
  • Loudness normalization off too: the whole effects pipeline disappears — playback is just decode and output.
  • Effects you do use are unchanged — same math, same sound. Toggling EQ or loudness mid-track still applies seamlessly; the pipeline rebuilds itself in place without a gap.

Also fixed along the way: seeking no longer lets ~2 ms of pre-seek audio bleed into the new position through the limiter's lookahead buffer.

Fixed: deleting a large playlist crashed the app (#380)

With a playlist in the thousands of tracks, Library → long-press → Delete Playlist & Songs could kill the app mid-delete (Couldn't read row N from CursorWindow) and strand the delete half-finished. The same fault could crash the Songs, Albums, and Artists tabs any time the library changed underneath them on a big collection.

Root cause: Android re-runs a query every time a large result set crosses a ~2 MB cursor window, and a delete landing between those re-runs made the rows shift under the reader. Library feeds (TrackDao.getLibraryByDateAdded, getByPlaylist, getAllArtists, getAllAlbums) now read one consistent snapshot per refresh, and the Songs feed fetches only the columns it renders instead of entire track rows. Verified on-device against an 8,000-track playlist delete: the old build died inside 90 seconds; this build runs the full delete clean.