use std::time::Duration;
use crate::errors::AudioError;
#[derive(Debug)]
pub enum AudioEffect {
FadeIn(Duration),
FadeOut(Duration),
Echo { delay: Duration, decay: f32 },
}
pub fn effect_to_filter(effect: &AudioEffect) -> String {
match effect {
AudioEffect::FadeIn(dur) => {
format!("afade=t=in:st=0:d={}", dur.as_secs_f32())
}
AudioEffect::FadeOut(dur) => {
format!("afade=t=out:st=0:d={}", dur.as_secs_f32())
}
AudioEffect::Echo { delay, decay } => {
format!("aecho=0.8:0.9:{}:{}", delay.as_millis(), decay)
}
}
}
pub fn reverse_audio(input_path: &str, output_path: &str) -> Result<(), AudioError> {
println!("Reversing audio: {} -> {}", input_path, output_path);
let status = std::process::Command::new("ffmpeg")
.args(&["-i", input_path, "-af", "areverse", output_path, "-y"])
.status()
.map_err(|e| AudioError::IoError(e))?;
if status.success() {
Ok(())
} else {
Err(AudioError::FfmpegError("ffmpeg reverse failed".to_string()))
}
}
pub fn normalize_volume(input_path: &str, output_path: &str) -> Result<(), AudioError> {
println!("Normalizing volume: {} -> {}", input_path, output_path);
let status = std::process::Command::new("ffmpeg")
.args(&["-i", input_path, "-af", "loudnorm", output_path, "-y"])
.status()
.map_err(|e| AudioError::IoError(e))?;
if status.success() {
Ok(())
} else {
Err(AudioError::FfmpegError("ffmpeg normalize failed".to_string()))
}
}