summaryrefslogtreecommitdiff
path: root/src/flac.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/flac.rs')
-rw-r--r--src/flac.rs39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/flac.rs b/src/flac.rs
index 8653881..07004dc 100644
--- a/src/flac.rs
+++ b/src/flac.rs
@@ -4,7 +4,7 @@ use flac_bound::{FlacEncoder, WriteWrapper};
use i24::i24;
use md5::{Digest, Md5};
use metaflac::Tag;
-use std::fs::File;
+use std::fs::{File, read};
struct StreamConfig {
channels: u32,
@@ -48,10 +48,9 @@ fn process_samples_i16(
.samples()
.map(|sample| sample.unwrap())
.collect::<Vec<_>>()
- .chunks(4096)
+ .chunks(1024 * usize::try_from(config.channels)?)
{
- enc.process_interleaved(samples, 4096 / config.channels)
- .unwrap();
+ enc.process_interleaved(samples, 1024).unwrap();
let _ = samples
.iter()
.map(|sample| hasher.update((i16::try_from(*sample)).unwrap().to_le_bytes()))
@@ -70,10 +69,9 @@ fn process_samples_i24(
.samples()
.map(|sample| sample.unwrap())
.collect::<Vec<_>>()
- .chunks(4096)
+ .chunks(1024 * usize::try_from(config.channels)?)
{
- enc.process_interleaved(samples, 4096 / config.channels)
- .unwrap();
+ enc.process_interleaved(samples, 1024).unwrap();
let _ = samples
.iter()
.map(|sample| hasher.update((i24::try_from(*sample)).unwrap().to_le_bytes()))
@@ -92,10 +90,9 @@ fn process_samples_i32(
.samples()
.map(|sample| sample.unwrap())
.collect::<Vec<_>>()
- .chunks(4096)
+ .chunks(1024 * usize::try_from(config.channels)?)
{
- enc.process_interleaved(samples, 4096 / config.channels)
- .unwrap();
+ enc.process_interleaved(samples, 1024).unwrap();
let _ = samples
.iter()
.map(|sample| hasher.update(sample.to_le_bytes()))
@@ -133,7 +130,8 @@ pub fn encode_file(file: &std::path::Path) -> Result<()> {
match config.bits_per_sample {
Bps::_16 => process_samples_i16(&mut hasher, reader, &mut enc, &config)?,
Bps::_24 => process_samples_i24(&mut hasher, reader, &mut enc, &config)?,
- Bps::_32 => process_samples_i32(&mut hasher, reader, &mut enc, &config)?,
+ /* Bps::_32 => process_samples_i32(&mut hasher, reader, &mut enc, &config)?, */
+ Bps::_32 => unimplemented!(),
};
if let Err(enc) = enc.finish() {
@@ -147,11 +145,22 @@ pub fn encode_file(file: &std::path::Path) -> Result<()> {
for block in source_tags.blocks() {
todo!()
} */
- let mut tags = Tag::read_from_path(tempname)?;
- let mut streaminfo = tags.get_streaminfo().unwrap().clone();
+ let source_tags = Tag::read_from_path(file)?;
+ let mut out_tags = Tag::new();
+ let mut streaminfo = source_tags.get_streaminfo().unwrap().clone();
+
streaminfo.md5 = hasher.finalize()[..].to_vec();
- tags.set_streaminfo(streaminfo);
- tags.save()?;
+ out_tags.set_streaminfo(streaminfo);
+
+ for block in source_tags.get_blocks(metaflac::BlockType::SeekTable) {
+ out_tags.push_block(block.clone());
+ }
+
+ for block in source_tags.get_blocks(metaflac::BlockType::VorbisComment) {
+ out_tags.push_block(block.clone());
+ }
+
+ out_tags.write_to_path(tempname)?;
Ok(())
}