summaryrefslogtreecommitdiff
path: root/src/flac.rs
diff options
context:
space:
mode:
authorjakka <jakkadoujin@gmail.com>2025-07-07 14:01:46 +0300
committerjakka <jakkadoujin@gmail.com>2025-07-07 14:01:46 +0300
commit9b459adeafffcecdcb19e60806272a466e02b184 (patch)
tree0029a4abfbca5f60cddbce2ad63dc685f70f0176 /src/flac.rs
parentfccc22cd4a4a84211d8b61cf561d0f4463f500f1 (diff)
added better mutex handlingv0.2.3
Diffstat (limited to 'src/flac.rs')
-rw-r--r--src/flac.rs64
1 files changed, 40 insertions, 24 deletions
diff --git a/src/flac.rs b/src/flac.rs
index 823f4e4..0879faa 100644
--- a/src/flac.rs
+++ b/src/flac.rs
@@ -3,7 +3,13 @@ use claxon::{FlacReader, FlacReaderOptions};
use flac_bound::FlacEncoder;
use md5::{Digest, Md5};
use metaflac::{Block, Tag};
-use std::path::Path;
+use std::{
+ path::Path,
+ sync::{
+ Arc,
+ atomic::{AtomicBool, Ordering},
+ },
+};
pub const CURRENT_VENDOR: &str = "reference libFLAC 1.5.0 20250211";
@@ -35,7 +41,7 @@ fn write_tags(filename: impl AsRef<Path>, hash: Vec<u8>) -> Result<()> {
Ok(())
}
-fn encode_file(filename: impl AsRef<Path>) -> Result<()> {
+fn encode_file(filename: impl AsRef<Path>, handler: Arc<AtomicBool>) -> Result<bool> {
let temp_name = filename.as_ref().with_extension("tmp");
if temp_name.exists() {
std::fs::remove_file(&temp_name)?;
@@ -55,7 +61,7 @@ fn encode_file(filename: impl AsRef<Path>) -> Result<()> {
let mut hasher = Md5::new();
- let samples = decoder
+ for samples in decoder
.samples()
.map(|res| {
let sample = res.unwrap();
@@ -73,11 +79,17 @@ fn encode_file(filename: impl AsRef<Path>) -> Result<()> {
}
sample
})
- .collect::<Vec<i32>>();
-
- encoder
- .process_interleaved(&samples, samples.len() as u32 / streaminfo.channels)
- .unwrap();
+ .collect::<Vec<i32>>()
+ .chunks(streaminfo.channels as usize)
+ {
+ if handler.load(Ordering::SeqCst) {
+ let _ =
+ encoder.process_interleaved(samples, samples.len() as u32 / streaminfo.channels);
+ } else {
+ let _ = std::fs::remove_file(temp_name);
+ return Ok(true);
+ }
+ }
if let Err(enc) = encoder.finish() {
return Err(anyhow!("Encoding failed:\t{:?}", enc.state()));
@@ -86,15 +98,16 @@ fn encode_file(filename: impl AsRef<Path>) -> Result<()> {
let hash = hasher.finalize().to_vec();
write_tags(&filename, hash)?;
std::fs::rename(temp_name, filename)?;
- Ok(())
+ Ok(false)
}
-pub fn handle_encode(filename: impl AsRef<Path>) -> Result<()> {
- if let Err(error) = encode_file(&filename) {
- let _ = std::fs::remove_file(filename.as_ref().with_extension("tmp"));
- Err(error)
- } else {
- Ok(())
+pub fn handle_encode(filename: impl AsRef<Path>, handler: Arc<AtomicBool>) -> Result<bool> {
+ match encode_file(&filename, handler) {
+ Err(error) => {
+ let _ = std::fs::remove_file(filename.as_ref().with_extension("tmp"));
+ Err(error)
+ }
+ Ok(res) => Ok(res),
}
}
@@ -120,10 +133,11 @@ mod tests {
#[test]
fn bit16() {
- let name = "16bit.flac";
- let tempname = "16bit.flac.temp";
+ let name = "./samples/16bit.flac";
+ let tempname = "./samples/16bit.flac.temp";
std::fs::copy(name, tempname).unwrap();
- encode_file(name).unwrap();
+ let handler = Arc::new(AtomicBool::new(true));
+ encode_file(name, handler).unwrap();
let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum;
let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum;
@@ -133,10 +147,11 @@ mod tests {
#[test]
fn bit24() {
- let name = "24bit.flac";
- let tempname = "24bit.flac.temp";
+ let name = "./samples/24bit.flac";
+ let tempname = "./samples/24bit.flac.temp";
std::fs::copy(name, tempname).unwrap();
- encode_file(name).unwrap();
+ let handler = Arc::new(AtomicBool::new(true));
+ encode_file(name, handler).unwrap();
let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum;
let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum;
@@ -146,10 +161,11 @@ mod tests {
#[test]
fn bit32() {
- let name = "32bit.flac";
- let tempname = "32bit.flac.temp";
+ let name = "./samples/32bit.flac";
+ let tempname = "./samples/32bit.flac.temp";
std::fs::copy(name, tempname).unwrap();
- encode_file(name).unwrap();
+ let handler = Arc::new(AtomicBool::new(true));
+ encode_file(name, handler).unwrap();
let target_md5 = FlacReader::open(tempname).unwrap().streaminfo().md5sum;
let temp_md5 = FlacReader::open(name).unwrap().streaminfo().md5sum;