From 9a8e4117be8d30109229600346e7d9561c52a3e3 Mon Sep 17 00:00:00 2001 From: Astatin Date: Thu, 3 Apr 2025 18:35:03 +0200 Subject: Separate core from desktop target --- src/desktop/audio.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/desktop/audio.rs (limited to 'src/desktop/audio.rs') diff --git a/src/desktop/audio.rs b/src/desktop/audio.rs new file mode 100644 index 0000000..60d32df --- /dev/null +++ b/src/desktop/audio.rs @@ -0,0 +1,54 @@ +use rodio::{OutputStream, Sink, Source}; + +use crate::io::Audio; +use crate::audio::SAMPLE_RATE; +use std::time::Duration; + +pub struct RodioAudio { + _stream: OutputStream, + _sink: Sink, +} + +struct RodioWave(W); + +impl Iterator for RodioWave where ::Item: rodio::Sample { + type Item = W::Item; + + fn next(&mut self) -> Option { + self.0.next() + } +} + +impl Source for RodioWave where ::Item: rodio::Sample { + fn current_frame_len(&self) -> Option { + None + } + + fn channels(&self) -> u16 { + 1 + } + + fn sample_rate(&self) -> u32 { + SAMPLE_RATE + } + + fn total_duration(&self) -> Option { + None + } +} + + +impl Audio for RodioAudio { + fn new + Send + 'static>(wave: S) -> Self { + let (stream, stream_handle) = OutputStream::try_default().unwrap(); + + let sink = Sink::try_new(&stream_handle).unwrap(); + sink.append(RodioWave(wave)); + + + RodioAudio { + _stream: stream, + _sink: sink, + } + } +} -- cgit v1.2.3-70-g09d2