diff options
| author | Teddy Wing | 2018-10-28 19:53:50 +0100 | 
|---|---|---|
| committer | Teddy Wing | 2018-10-28 19:53:50 +0100 | 
| commit | e8ba4dc878a44f14e656664fa2e9d0ea362cbc10 (patch) | |
| tree | 000e1b8467b352f40c15a9502c61f8fad858b5e2 | |
| parent | eb261f29d0ae15c2f941c2d84972bd321bf764ac (diff) | |
| download | dome-key-map-e8ba4dc878a44f14e656664fa2e9d0ea362cbc10.tar.bz2 | |
Add `play_audio()` function
Create a new function that encapsulates the code we experimented with
for playing audio.
Clean up what we had and handle errors by passing them back in a
`Result`.
This allows us to encapsulate, audio playing so we can do it in a single
action during mode switching.
| -rw-r--r-- | src/errors.rs | 2 | ||||
| -rw-r--r-- | src/map.rs | 27 | ||||
| -rw-r--r-- | src/sounds.rs | 32 | 
3 files changed, 34 insertions, 27 deletions
| diff --git a/src/errors.rs b/src/errors.rs index f7f3d79..3426cac 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -1,11 +1,13 @@  use chrono;  use magic_crypt; +use rodio;  use xdg;  error_chain! {      foreign_links {          Io(::std::io::Error); +        Rodio(rodio::decoder::DecoderError);          Xdg(xdg::BaseDirectoriesError);          DateCrypt(DateCryptError); @@ -1,10 +1,7 @@  use std::env;  use std::ffi::OsString; -use std::io::BufReader;  use std::process::Command; -use rodio::{self, Source}; -  use {Action, HeadphoneButton, MapAction, MapKind};  use ffi::State;  use sounds; @@ -78,27 +75,3 @@ fn run_action(map_action: &MapAction) {          },      }  } - -#[cfg(test)] -mod tests { -    use super::*; - -    #[test] -    fn play_audio() { -        let mode_activated = include_bytes!("../sounds/activ.wav"); -        // let mut sound = sounds::MODE_ACTIVATED; -        // let mut reader = BufReader::new(sounds::MODE_ACTIVATED); -        let file = ::std::fs::File::open("sounds/activ.wav").unwrap(); -        // let reader = BufReader::new(&mode_activated[..]); -        // let reader = BufReader::new(mode_activated); -        // let reader = BufReader::new(file); -        let reader = ::std::io::Cursor::new(sounds::MODE_ACTIVATED); -let device = rodio::default_output_device().unwrap(); -// let source = rodio::Decoder::new(reader).unwrap(); -// rodio::play_raw(&device, source.convert_samples()); -// ::std::thread::sleep_ms(2000); -let sink = rodio::play_once(&device, reader).unwrap(); -sink.sleep_until_end(); -sink.play(); -    } -} diff --git a/src/sounds.rs b/src/sounds.rs index 8cb6b51..e0c1093 100644 --- a/src/sounds.rs +++ b/src/sounds.rs @@ -1,4 +1,36 @@ +use std::io::Cursor; + +use rodio; + +use errors::*; +  // const MODE_ACTIVATED = include_bytes!("../sounds/mode_activated.ogg");  // const MODE_DEACTIVATED = include_bytes!("../sounds/mode_deactivated.ogg");  pub const MODE_ACTIVATED: &'static [u8] = include_bytes!("../sounds/activ.wav"); + +pub fn play_audio<R>(r: R) -> Result<()> +where R: AsRef<[u8]> + Send + 'static { +    let device = rodio::default_output_device() +        .chain_err(|| "could not find an audio output device")?; + +    let reader = Cursor::new(r); +    let sink = rodio::play_once(&device, reader) +        .chain_err(|| "error playing audio")?; + +    sink.sleep_until_end(); +    sink.play(); + +    Ok(()) +} + + +#[cfg(test)] +mod tests { +    use super::*; + +    #[test] +    fn play_audio_plays_audio() { +        play_audio(MODE_ACTIVATED).unwrap(); +    } +} | 
