blob: 32e2b471d8f5e7df6e2a0c1ac1552e7fb676d2cf [file] [log] [blame]
// Hound -- A wav encoding and decoding library in Rust
// Copyright (C) 2017 Ruud van Asseldonk
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// A copy of the License has been included in the root of the repository.
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This example computes the root mean square (rms) of an audio file with
// integer or float samples, of at most 32 bits per sample. It is a slightly
// more elaborate version of the example found in the readme, mostly useful for
// checking whether Hound can read a specific file.
extern crate hound;
use std::env;
use std::io;
/// Compute the RMS of either integers or float samples.
fn compute_rms<S, R>(reader: &mut hound::WavReader<R>) -> f64
where
f64: From<S>,
S: hound::Sample,
R: io::Read,
{
let sqr_sum = reader.samples::<S>().fold(0.0, |sqr_sum, s| {
let sample = f64::from(s.unwrap());
sqr_sum + sample * sample
});
(sqr_sum / reader.len() as f64).sqrt()
}
fn main() {
// Compute the RMS for all files given on the command line.
for fname in env::args().skip(1) {
let mut reader = hound::WavReader::open(&fname).unwrap();
let rms = match reader.spec().sample_format {
hound::SampleFormat::Float => compute_rms::<f32, _>(&mut reader),
hound::SampleFormat::Int => compute_rms::<i32, _>(&mut reader),
};
println!("{}: {:0.1} ({} samples)", fname, rms, reader.len());
}
}