blob: 5c32d4b960e9828359c821aa419c2c96ed7e95ce [file] [log] [blame] [edit]
// Hound -- A wav encoding and decoding library in Rust
// Copyright (C) 2015 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 mean value and rms of a file, where samples are
// first interpreted as 16-bit signed integer, and then as a 16-bit unsigned
// integer. This should allow us to determine whether the samples stored are
// signed or unsigned: for signed the average value is expected to be 0, and
// for unsigned the value is expected to be 2^16 - 1.
// Note that this example is not a particularly good example of proper coding
// style; it does not handle failure properly, and it assumes that the provided
// file has 16 bits per sample.
// TODO: This example should probably be removed, it is just here for verifying
// and assumption at this point.
extern crate hound;
use std::env;
fn main() {
let fname = env::args().nth(1).expect("no file given");
let mut reader = hound::WavReader::open(&fname).unwrap();
let samples: Vec<i16> = reader.samples().map(|s| s.unwrap()).collect();
let (ts, tu, n) = samples.iter().fold((0.0, 0.0, 0.0), |(ts, tu, n), &s| {
let signed = s as f64;
let unsigned = (s as u16) as f64;
(ts + signed, tu + unsigned, n + 1.0)
});
let ms = ts / n;
let mu = tu / n;
println!("mean signed: {} (should be 0, deviation is {})", ms, ms.abs());
println!("mean unsigned: {} (should be 2^16 - 1, deviation is {})", mu, (mu - 32767.0).abs());
let (ts, tu) = samples.iter().fold((0.0, 0.0), |(ts, tu), &s| {
let ds = s as f64 - ms;
let du = (s as u16) as f64 - mu;
(ts + ds * ds, tu + du * du)
});
let rmss = (ts / n).sqrt();
let rmsu = (tu / n).sqrt();
println!("rms signed: {}", rmss);
println!("rms unsigned: {}", rmsu);
}