playlists + lyrics: setlists with pages of their own, and the words timed to the voice

This commit is contained in:
KeelrLeek committed 2026-08-17 18:05:31 -05:00
1 parent c4ff6269a3
commit df3d15553a
49 files changed
+14419 -599

No files matched your search

+14
View File
@@ -8,6 +8,7 @@
mod loudness;
mod source;
pub mod vocals;
mod waveform;
pub use loudness::{analyze_loudness, Analysis, AnalysisSource, Incomplete, LoudnessMeter};
@@ -494,6 +495,19 @@ fn start_decoder(
.into(),
)
.spawn(move || {
// Refuse formats there is no decoder for, BEFORE opening them.
//
// Most simply fail to build and report themselves. WavPack does
// not: a `.wv` carrying the original RIFF header in its wrapper is
// probed as raw PCM, so the decoder reports success and streams the
// compressed body as samples — measured at 136,815 NaN/Inf values
// in a single track, straight into the mixer and the normaliser.
// An extension check is the only thing that can stop that, because
// by the time there is a decoder there is no error to notice.
if let Some(reason) = audio_formats::unplayable_path_reason(&track.path) {
let _ = tx.send(Err((generation, reason.to_string())));
return;
}
let (reader, byte_len): (Box<dyn source::MediaRead>, u64) = match track.stream.clone() {
Some(progress) => {
match GrowingFile::open(&track.path, track.total_bytes, progress) {