use rodio::mixer;
use rodio::source::{SineWave, Source};
use rodio::Float;
use std::error::Error;
use std::num::NonZero;
use std::time::Duration;
const NOTE_DURATION: Duration = Duration::from_secs(1);
const NOTE_AMPLITUDE: Float = 0.20;
fn main() -> Result<(), Box<dyn Error>> {
let (controller, mixer) = mixer::mixer(NonZero::new(2).unwrap(), NonZero::new(44_100).unwrap());
let stream_handle = rodio::DeviceSinkBuilder::open_default_sink()?;
let player = rodio::Player::connect_new(stream_handle.mixer());
let source_c = SineWave::new(261.63)
.take_duration(NOTE_DURATION)
.amplify(NOTE_AMPLITUDE);
let source_e = SineWave::new(329.63)
.take_duration(NOTE_DURATION)
.amplify(NOTE_AMPLITUDE);
let source_g = SineWave::new(392.0)
.take_duration(NOTE_DURATION)
.amplify(NOTE_AMPLITUDE);
let source_a = SineWave::new(440.0)
.take_duration(NOTE_DURATION)
.amplify(NOTE_AMPLITUDE);
controller.add(source_c);
controller.add(source_e);
controller.add(source_g);
controller.add(source_a);
player.append(mixer);
player.sleep_until_end();
Ok(())
}