pub extern crate ether_dream;
use std::io;
use std::sync::Arc;
use std::time::Duration;
pub use dac::{DetectDacs, DetectDacsAsync, DetectedDac, DetectedDacCallback, Id as DacId};
pub use point::{Point, RawPoint};
pub use stream::frame::Frame;
pub use stream::frame::Stream as FrameStream;
pub use stream::raw::Stream as RawStream;
pub use stream::raw::{Buffer, StreamError, StreamErrorAction};
pub mod dac;
#[cfg(feature = "ffi")]
pub mod ffi;
#[cfg(feature = "ilda-idtf")]
pub mod ilda_idtf;
pub mod point;
pub mod stream;
pub mod util;
pub struct Api {
inner: Arc<Inner>,
}
pub(crate) struct Inner;
impl Default for Api {
fn default() -> Self {
Self::new()
}
}
impl Api {
pub fn new() -> Self {
Api {
inner: Arc::new(Inner),
}
}
pub fn detect_dacs(&self) -> io::Result<DetectDacs> {
self.inner.detect_dacs()
}
pub fn detect_dac(&self, id: DacId) -> io::Result<DetectedDac> {
self.inner.detect_dac(id)
}
pub fn detect_dacs_async<F>(
&self,
timeout: Option<Duration>,
callback: F,
) -> io::Result<DetectDacsAsync>
where
F: 'static + DetectedDacCallback + Send,
{
self.inner.detect_dacs_async(timeout, callback)
}
pub fn new_frame_stream<M, F>(&self, model: M, render: F) -> stream::frame::Builder<M, F>
where
F: stream::frame::RenderFn<M>,
{
let api_inner = self.inner.clone();
let builder = Default::default();
let frame_hz = None;
let interpolation_conf = Default::default();
let enable_optimisations = stream::DEFAULT_ENABLE_OPTIMISATIONS;
let enable_draw_reorder = stream::DEFAULT_ENABLE_DRAW_REORDER;
let process_raw = stream::frame::default_process_raw_fn;
let stream_error = stream::raw::default_stream_error_fn;
stream::frame::Builder {
api_inner,
builder,
model,
render,
process_raw,
stream_error,
frame_hz,
interpolation_conf,
enable_optimisations,
enable_draw_reorder,
}
}
pub fn new_raw_stream<M, F>(&self, model: M, render: F) -> stream::raw::Builder<M, F>
where
F: stream::raw::RenderFn<M>,
{
let api_inner = self.inner.clone();
let builder = Default::default();
let stream_error = stream::raw::default_stream_error_fn;
stream::raw::Builder {
api_inner,
builder,
model,
render,
stream_error,
}
}
}
impl Inner {
pub(crate) fn detect_dacs(&self) -> io::Result<DetectDacs> {
dac::detect_dacs()
}
pub(crate) fn detect_dac(&self, id: DacId) -> io::Result<DetectedDac> {
for res in self.detect_dacs()? {
let dac = res?;
if dac.id() == id {
return Ok(dac);
}
}
unreachable!("DAC detection iterator should never return `None`")
}
fn detect_dacs_async<F>(
&self,
timeout: Option<Duration>,
callback: F,
) -> io::Result<DetectDacsAsync>
where
F: 'static + DetectedDacCallback + Send,
{
dac::detect_dacs_async(timeout, callback)
}
}
impl AsRef<Point> for Point {
fn as_ref(&self) -> &Point {
self
}
}