aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2018-10-28 19:53:50 +0100
committerTeddy Wing2018-10-28 19:53:50 +0100
commite8ba4dc878a44f14e656664fa2e9d0ea362cbc10 (patch)
tree000e1b8467b352f40c15a9502c61f8fad858b5e2
parenteb261f29d0ae15c2f941c2d84972bd321bf764ac (diff)
downloaddome-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.rs2
-rw-r--r--src/map.rs27
-rw-r--r--src/sounds.rs32
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);
diff --git a/src/map.rs b/src/map.rs
index 750a728..b24474b 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -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();
+ }
+}