diff options
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/mod.rs | 15 | ||||
| -rw-r--r-- | src/audio/mpv.rs | 5 | ||||
| -rw-r--r-- | src/audio/rodio.rs | 23 |
3 files changed, 27 insertions, 16 deletions
diff --git a/src/audio/mod.rs b/src/audio/mod.rs index 7fca1a7..5aae19a 100644 --- a/src/audio/mod.rs +++ b/src/audio/mod.rs @@ -1,10 +1,6 @@ mod mpv; mod rodio; -pub trait AudioBackend { - fn play(&self, url: &str); -} - #[allow(dead_code)] pub enum AudioBackends { Mpv(mpv::Mpv), @@ -12,14 +8,15 @@ pub enum AudioBackends { } pub fn get_backend() -> AudioBackends { - AudioBackends::Mpv(mpv::Mpv {}) + // AudioBackends::Mpv(mpv::Mpv {}) + AudioBackends::Rodio(rodio::Rodio {}) } -impl AudioBackend for AudioBackends { - fn play(&self, url: &str) { +impl AudioBackends { + pub async fn play(&self, url: &str) { match self { - AudioBackends::Mpv(m) => m.play(url), - AudioBackends::Rodio(r) => r.play(url), + AudioBackends::Mpv(m) => m.play(url).await, + AudioBackends::Rodio(r) => r.play(url).await, } } } diff --git a/src/audio/mpv.rs b/src/audio/mpv.rs index dddb6b2..fde2711 100644 --- a/src/audio/mpv.rs +++ b/src/audio/mpv.rs @@ -1,10 +1,9 @@ -use super::AudioBackend; use std::process::Command; pub struct Mpv {} -impl AudioBackend for Mpv { - fn play(&self, url: &str) { +impl Mpv { + pub async fn play(&self, url: &str) { Command::new("mpv") .args([url]) .output() diff --git a/src/audio/rodio.rs b/src/audio/rodio.rs index 04883dd..8262b82 100644 --- a/src/audio/rodio.rs +++ b/src/audio/rodio.rs @@ -1,9 +1,24 @@ -use super::AudioBackend; +use rodio::{Decoder, OutputStream, Sink}; +use stream_download::{storage::temp::TempStorageProvider, Settings, StreamDownload}; pub struct Rodio {} -impl AudioBackend for Rodio { - fn play(&self, _url: &str) { - todo!() +impl Rodio { + pub async fn play(&self, url: &str) { + let reader = StreamDownload::new_http( + url.parse().unwrap(), + TempStorageProvider::new(), + Settings::default(), + ) + .await + .unwrap(); + + let _res = tokio::task::spawn_blocking(move || { + let (_stream, handle) = OutputStream::try_default().unwrap(); + let sink = Sink::try_new(&handle).unwrap(); + sink.append(Decoder::new(reader).unwrap()); + sink.sleep_until_end(); + }) + .await; } } |
