Timbra 0.7.44
Timbra 0.7.44
Playback robustness
- Play MPEG audio inside RIFF/WAVE containers (fmt tag 0x55/0x50) via a new
RiffMpegExtractor — these files were claimed by WavExtractor and then rejected
as a source error, so they simply refused to play. - A track that errors out now skips to the next one instead of leaving the
player IDLE with a dead play button. - Tracks that wedge while buffering at the very end (rips whose reported
duration overruns the actual audio) are finished by seeking past the last
frame instead of hanging. - A failed controller connection is retried rather than leaving the app
silent. - If the saved current track was deleted, playback restores the nearest
surviving song in that list instead of coming up empty.
Shuffle and "play next"
- "Play next" is honoured under shuffle: enqueued songs lead the shuffle order
instead of joining the random pool, and the enqueued block stays contiguous. - Cycling the shuffle button (Shuffle-Songs → OFF) no longer wipes the queue.
The manually enqueued block is now lifted off the timeline and spliced back on
both mode transitions, so it survives the round trip. - A "play next" insertion is absorbed into the running shuffle session, so the
no-repeat history is kept instead of reset. Enqueued duplicates and a
completed shuffle pass no longer clear that history either. - Play-next items are marked consumed once they play, fixing songs
resurrecting after a shuffle change, after a reorder that crosses the current
song, and Clear Queue cutting playback off.
Advance-List
- The next-folder step lives in one shared implementation owned by the
service, so queue ends, stuck tracks, and Next from the notification or
Bluetooth all advance identically.
Library, sorting and metadata
- Disc numbers are kept, so multi-disc albums stop interleaving their tracks;
the track-1000 edge case is fixed too. - Folder sort is persisted app-wide, so browse order and play order always
agree. - List rows and their tap targets are committed together, so a tap landing
during a re-sort plays the song you actually touched. - Repository caches are rescan-safe, and the album/artist groupings are shared
rather than rebuilt.
Equalizer
- Output is rounded instead of truncated, filter state resets when
coefficients change, and coefficients are published atomically (no torn reads
mid-block). - The last fader step of a drag is persisted — previously it could be dropped
on release.
Artwork and UI
- Art decodes are sized to the target view and the cache is keyed by size; the
legacy album-art path is sampled instead of decoded full-size. - Pending marquee work is cancelled, so it can no longer overwrite another
screen's toolbar title. - Queue-screen updates that arrive mid-drag are re-applied afterwards, and
taps are guarded by media id. - Navigation launched after a suspending load is guarded against a stopped
activity. - Transport binding, dialogs, and the player controls layout are shared
between portrait and landscape.