use crate::util::png::write_png_file_rgb_tuples;
use crate::Channels;
use std::fs;
use std::path::PathBuf;
pub fn waveform_static_png_visualize(
samples: &[i16],
channels: Channels,
directory: &str,
filename: &str,
) {
let image_width = 1500;
let image_height = 200;
if channels.is_stereo() {
assert_eq!(
0,
samples.len() % 2,
"If stereo is provided, the length of the audio data must be even!"
);
let (left, right) = channels.stereo_interleavement().to_channel_data(samples);
waveform_static_png_visualize(
&left,
Channels::Mono,
directory,
&format!("left_{}", filename),
);
waveform_static_png_visualize(
&right,
Channels::Mono,
directory,
&format!("right_{}", filename),
);
return;
}
let width_per_sample = image_width as f64 / samples.len() as f64;
let height_per_max_amplitude = image_height as f64 / 2_f64 / i16::MAX as f64;
let mut image = vec![vec![(255, 255, 255); image_width]; image_height];
for (sample_index, sample_value) in samples.iter().enumerate() {
let x = (sample_index as f64 * width_per_sample) as usize;
let sample_value = *sample_value as f64 * -1.0; let mut y = ((image_height / 2) as f64 + sample_value * height_per_max_amplitude) as usize;
if y == image_height {
y -= 1;
}
image[y][x] = (0, 0, 0);
}
if !fs::exists(directory).unwrap() {
fs::create_dir(directory).unwrap();
}
let mut path = PathBuf::new();
path.push(directory);
path.push(filename);
write_png_file_rgb_tuples(&path, &image);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::testutil::{decode_mp3, TEST_OUT_DIR, TEST_SAMPLES_DIR};
use crate::ChannelInterleavement;
#[test]
fn test_no_out_of_bounds_panic() {
let audio_data = vec![i16::MAX, i16::MIN];
waveform_static_png_visualize(
&audio_data,
Channels::Mono,
TEST_OUT_DIR,
"sample_1_waveform-test-out-of-bounds-check.png",
);
}
#[test]
fn test_visualize_png_output() {
let mut path = PathBuf::new();
path.push(TEST_SAMPLES_DIR);
path.push("sample_1.mp3");
let lrlr_mp3_samples = decode_mp3(path.as_path());
waveform_static_png_visualize(
&lrlr_mp3_samples,
Channels::Stereo(ChannelInterleavement::LRLR),
TEST_OUT_DIR,
"waveform_static_png_visualize_example.png",
);
}
}