diff --git a/Cargo.lock b/Cargo.lock index 02e6365..6f5ced0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,9 +39,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "clap" @@ -124,9 +124,9 @@ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "hermit-abi" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" dependencies = [ "libc", ] @@ -139,9 +139,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "libc" -version = "0.2.81" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" [[package]] name = "ryu" @@ -151,15 +151,15 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "serde" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -189,9 +189,9 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "uuid" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" [[package]] name = "vec_map" diff --git a/examples/wave-deinter.rs b/examples/wave-deinter.rs index 767dff1..48350df 100644 --- a/examples/wave-deinter.rs +++ b/examples/wave-deinter.rs @@ -8,7 +8,7 @@ use std::io; use std::path::Path; extern crate bwavfile; -use bwavfile::{Error,WaveReader, ChannelDescriptor, ChannelMask}; +use bwavfile::{Error,WaveReader, WaveWriter, ChannelDescriptor, ChannelMask, WaveFmt, AudioFrameWriter}; #[macro_use] extern crate clap; @@ -44,9 +44,10 @@ fn name_suffix(force_numeric : bool, delim : &str, index: usize, channel_descrip } fn process_file(infile: &str, delim : &str, numeric_channel_names : bool) -> Result<(), Error> { - let mut read_wave = WaveReader::open(infile)?; - let channel_desc = read_wave.channels()?; - + let mut input_file = WaveReader::open(infile)?; + let channel_desc = input_file.channels()?; + let input_format = input_file.format()?; + if channel_desc.len() == 1 { println!("Input file in monoaural, exiting."); return Ok(()); @@ -56,10 +57,27 @@ fn process_file(infile: &str, delim : &str, numeric_channel_names : bool) -> Res let basename = infile_path.file_stem().expect("Unable to extract file basename").to_str().unwrap(); let output_dir = infile_path.parent().expect("Unable to derive parent directory"); + let ouptut_format = WaveFmt::new_pcm_mono(input_format.sample_rate, input_format.bits_per_sample); + let mut input_wave_reader = input_file.audio_frame_reader()?; + for (n, channel) in channel_desc.iter().enumerate() { let suffix = name_suffix(numeric_channel_names, delim, n + 1, channel); - let outfile_name = output_dir.join(format!("{}{}.wav", basename, suffix)).into_os_string().into_string().unwrap(); + let outfile_name = output_dir.join(format!("{}{}.wav", basename, suffix)) + .into_os_string().into_string().unwrap(); + println!("Will create file {}", outfile_name); + + let output_file = WaveWriter::create(&outfile_name, ouptut_format).expect("Failed to create new file"); + + let mut output_wave_writer = output_file.audio_frame_writer()?; + let mut buffer = input_format.create_frame_buffer(); + + while input_wave_reader.read_integer_frame(&mut buffer)? > 0 { + output_wave_writer.write_integer_frames(&buffer[n..=n])?; + } + + output_wave_writer.end()?; + input_wave_reader.locate(0)?; } Ok(())