forked from Keelrleek/SoulStream
playlists + lyrics: setlists with pages of their own, and the words timed to the voice
This commit is contained in:
1 parent
c4ff6269a3
commit
df3d15553a
49 files changed
+14419
-599
No files matched your search
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user