From 60efe6b1978c228b0ecd3e982a08dc1f6766e7d0 Mon Sep 17 00:00:00 2001 From: jakka Date: Fri, 11 Jul 2025 10:11:34 +0300 Subject: optimized sample handling and error reporting --- src/flac.rs | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/flac.rs b/src/flac.rs index bbb2b9d..eb38bc5 100644 --- a/src/flac.rs +++ b/src/flac.rs @@ -49,6 +49,9 @@ fn encode_file(filename: impl AsRef, handler: Arc) -> Result, handler: Arc) -> Result { - hasher.update(i16::try_from(sample).unwrap().to_le_bytes()); + hasher.update(i16::try_from(sample)?.to_le_bytes()); } 24 => { - hasher.update(i24::i24::try_from_i32(sample).unwrap().to_le_bytes()); + hasher.update(if let Some(conv_sample) = i24::i24::try_from_i32(sample) { + conv_sample.to_le_bytes() + } else { + return Err(anyhow!("failed to hash samples")); + }); } 32 => { hasher.update(sample.to_le_bytes()); } _ => {} } - sample - }) - .collect::>() - .chunks(streaminfo.channels as usize) - { - if handler.load(Ordering::SeqCst) { - let _ = encoder.process_interleaved(samples, 1); + buf.push(sample); + + if num_channels == buf.len() { + if let Err(_) = encoder.process_interleaved(&buf, 1) { + return Err(anyhow!("failed to process samples:\t{:?}", encoder.state())); + }; + buf.clear(); + } } else { let _ = std::fs::remove_file(temp_name); return Ok(true); -- cgit v1.3.1