summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2023-04-28 09:38:40 -0400
committerpommicket <pommicket@gmail.com>2023-04-28 09:38:40 -0400
commit16ef421688e18667f168d335a3e32eeb79c686d6 (patch)
tree0f7c8682bd702880d7081c5011d79881824c7ee2 /src
parentaa7737e17a979fe00b1a1569365abb9763fd6e56 (diff)
Diffstat (limited to 'src')
-rw-r--r--src/main.rs36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs
index dbdcbaf..2e084c0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,21 +6,21 @@ License:
do what the fuck you want to
*/
+use anyhow::{Context, Result};
use clap::Parser;
-use std::fs::File;
use std::fmt::{Debug, Display};
-use anyhow::{Result, Context};
+use std::fs::File;
/// Turn a .wav file into a seamless loop.
#[derive(Parser, Debug)]
struct Args {
/// Input file
file: String,
-
+
/// Output file. Defaults to "x-seamless.wav" for input file "x.wav".
#[arg(short)]
output: Option<String>,
-
+
/// Duration in seconds of the fade.
#[arg(short, default_value_t = 0.03)]
duration: f32,
@@ -39,7 +39,7 @@ macro_rules! impl_audio_sample {
(a * (1.0 - t) + b * t).clamp($min, $max) as Self
}
}
- }
+ };
}
impl_audio_sample!(u8, 0.0, 255.0);
@@ -48,14 +48,22 @@ impl_audio_sample!(i16, -32767.0, 32767.0);
impl_audio_sample!(i32, -i32::MAX as f32, i32::MAX as f32);
impl_audio_sample!(f32, -1.0, 1.0);
-fn make_seamless<T: AudioSample>(data: &mut Vec<T>, channels: u16, fade_samples: usize) -> Result<()> {
+fn make_seamless<T: AudioSample>(
+ data: &mut Vec<T>,
+ channels: u16,
+ fade_samples: usize,
+) -> Result<()> {
let channels: usize = channels.into();
let audio_samples = data.len();
if fade_samples * 2 >= audio_samples {
- return Err(anyhow::anyhow!("Fade duration is too long (must be less than half of audio file's duration)."));
+ return Err(anyhow::anyhow!(
+ "Fade duration is too long (must be less than half of audio file's duration)."
+ ));
}
if audio_samples % channels != 0 {
- return Err(anyhow::anyhow!("Sample count is not multiple of channel count (this shouldn't happen)."));
+ return Err(anyhow::anyhow!(
+ "Sample count is not multiple of channel count (this shouldn't happen)."
+ ));
}
let fade_frames = fade_samples / channels;
let audio_frames = audio_samples / channels;
@@ -77,10 +85,11 @@ fn main() -> Result<()> {
let name = input.strip_suffix(".wav").unwrap_or(input);
name.to_string() + "-seamless.wav"
});
- let mut input_file = File::open(input).with_context(|| format!("Couldn't open input file {input}"))?;
+ let mut input_file =
+ File::open(input).with_context(|| format!("Couldn't open input file {input}"))?;
let (header, mut data) = wav::read(&mut input_file)?;
drop(input_file);
-
+
let samples = header.sampling_rate as f32 * args.duration;
if !samples.is_finite() || samples < 0.0 || samples > usize::MAX as f32 {
return Err(anyhow::anyhow!("Bad duration"));
@@ -95,9 +104,10 @@ fn main() -> Result<()> {
BitDepth::ThirtyTwoFloat(data) => make_seamless(data, channels, samples)?,
BitDepth::Empty => return Err(anyhow::anyhow!("No audio data")),
}
-
- let mut output_file = File::create(&output).with_context(|| format!("Couldn't open output file {output}"))?;
+
+ let mut output_file =
+ File::create(&output).with_context(|| format!("Couldn't open output file {output}"))?;
wav::write(header, &data, &mut output_file)?;
-
+
Ok(())
}