blob: b5fbdc42b523be65d6d56c9c974ed080ce1fcc9d [file] [log] [blame] [edit]
// Hound -- A wav encoding and decoding library in Rust
// Copyright 2018 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 appends one second of a 440 Hz sine wave to the file "sine.wav".
// If the file does not exist, it is created instead.
use std::f32::consts::PI;
use std::i16;
use std::path::Path;
extern crate hound;
fn main() {
let spec = hound::WavSpec {
channels: 1,
sample_rate: 44100,
bits_per_sample: 16,
sample_format: hound::SampleFormat::Int,
};
let path: &Path = "sine.wav".as_ref();
let mut writer = match path.is_file() {
true => hound::WavWriter::append(path).unwrap(),
false => hound::WavWriter::create(path, spec).unwrap(),
};
// We should not append blindly, we should make sure that the existing file
// has the right spec, because that is what we assume when writing.
assert_eq!(spec, writer.spec());
println!("Old duration is {} seconds.", writer.duration() / spec.sample_rate);
for t in (0 .. 44100).map(|x| x as f32 / 44100.0) {
let sample = (t * 440.0 * 2.0 * PI).sin();
let amplitude = i16::MAX as f32;
writer.write_sample((sample * amplitude) as i16).unwrap();
}
println!("New duration is {} seconds.", writer.duration() / spec.sample_rate);
writer.finalize().unwrap();
}