1 | use crate::alsa; |
2 | use super::error::*; |
3 | use std::{slice, ptr, fmt}; |
4 | |
5 | /// [snd_output_t](http://www.alsa-project.org/alsa-doc/alsa-lib/group___output.html) wrapper |
6 | pub struct Output(*mut alsa::snd_output_t); |
7 | |
8 | unsafe impl Send for Output {} |
9 | |
10 | impl Drop for Output { |
11 | fn drop(&mut self) { unsafe { alsa::snd_output_close(self.0) }; } |
12 | } |
13 | |
14 | impl Output { |
15 | |
16 | pub fn buffer_open() -> Result<Output> { |
17 | let mut q: *mut _snd_output = ptr::null_mut(); |
18 | acheck!(snd_output_buffer_open(&mut q)).map(|_| Output(q)) |
19 | } |
20 | |
21 | pub fn buffer_string<T, F: FnOnce(&[u8]) -> T>(&self, f: F) -> T { |
22 | let b: &[u8] = unsafe { |
23 | let mut q: *mut i8 = ptr::null_mut(); |
24 | let s: usize = alsa::snd_output_buffer_string(self.0, &mut q); |
25 | slice::from_raw_parts(data:q as *const u8, len:s as usize) |
26 | }; |
27 | f(b) |
28 | } |
29 | } |
30 | |
31 | impl fmt::Debug for Output { |
32 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
33 | write!(f, "Output(" )?; |
34 | fmt::Display::fmt(self, f)?; |
35 | write!(f, ")" ) |
36 | /* self.buffer_string(|b| f.write_str(try!(str::from_utf8(b).map_err(|_| fmt::Error)))) */ |
37 | } |
38 | } |
39 | |
40 | impl fmt::Display for Output { |
41 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
42 | self.buffer_string(|b: &[u8]| { |
43 | let s: Cow<'_, str> = String::from_utf8_lossy(b); |
44 | f.write_str(&*s) |
45 | }) |
46 | } |
47 | } |
48 | |
49 | pub fn output_handle(o: &Output) -> *mut alsa::snd_output_t { o.0 } |
50 | |