use rodio::{OutputStream, Sink, Source}; use crate::audio::SAMPLE_RATE; use crate::io::{Wave, Audio}; use std::time::Duration; pub struct RodioAudio { _stream: OutputStream, _sink: Sink, } struct RodioWave(W, usize); impl Iterator for RodioWave { type Item = f32; fn next(&mut self) -> Option { self.1 += 1; let left = self.1 % 2 == 0; let result = self.0.next(left); result } } impl Source for RodioWave { fn current_frame_len(&self) -> Option { None } fn channels(&self) -> u16 { 2 } fn sample_rate(&self) -> u32 { SAMPLE_RATE } fn total_duration(&self) -> Option { None } } impl Audio for RodioAudio { fn new(wave: S) -> Self { let (stream, stream_handle) = OutputStream::try_default().unwrap(); let sink = Sink::try_new(&stream_handle).unwrap(); sink.append(RodioWave(wave, 0)); RodioAudio { _stream: stream, _sink: sink, } } }