use std::convert::TryInto; use std::time::Duration; extern crate ndk; use crate::{ BackendSpecificError, BuildStreamError, PauseStreamError, PlayStreamError, StreamError, StreamInstant, }; pub fn to_stream_instant(duration: Duration) -> StreamInstant { StreamInstant::new( duration.as_secs().try_into().unwrap(), duration.subsec_nanos(), ) } pub fn stream_instant(stream: &ndk::audio::AudioStream) -> StreamInstant { let ts = stream .timestamp(ndk::audio::Clockid::Monotonic) .unwrap_or(ndk::audio::Timestamp { frame_position: 0, time_nanoseconds: 0, }); to_stream_instant(Duration::from_nanos(ts.time_nanoseconds as u64)) } impl From for StreamError { fn from(error: ndk::audio::AudioError) -> Self { use self::ndk::audio::AudioError::*; match error { Disconnected | Unavailable => Self::DeviceNotAvailable, e => (BackendSpecificError { description: e.to_string(), }) .into(), } } } impl From for PlayStreamError { fn from(error: ndk::audio::AudioError) -> Self { use self::ndk::audio::AudioError::*; match error { Disconnected | Unavailable => Self::DeviceNotAvailable, e => (BackendSpecificError { description: e.to_string(), }) .into(), } } } impl From for PauseStreamError { fn from(error: ndk::audio::AudioError) -> Self { use self::ndk::audio::AudioError::*; match error { Disconnected | Unavailable => Self::DeviceNotAvailable, e => (BackendSpecificError { description: e.to_string(), }) .into(), } } } impl From for BuildStreamError { fn from(error: ndk::audio::AudioError) -> Self { use self::ndk::audio::AudioError::*; match error { Disconnected | Unavailable => Self::DeviceNotAvailable, NoFreeHandles => Self::StreamIdOverflow, InvalidFormat | InvalidRate => Self::StreamConfigNotSupported, IllegalArgument => Self::InvalidArgument, e => (BackendSpecificError { description: e.to_string(), }) .into(), } } }