use cpal::traits::HostTrait;
use std::marker::PhantomData;
use std::sync::Arc;
pub use self::buffer::Buffer;
pub use self::device::{Device, Devices};
pub use self::receiver::Receiver;
pub use self::requester::Requester;
pub use self::stream::Stream;
pub use cpal;
#[doc(inline)]
pub use cpal::{
BackendSpecificError, BufferSize, BuildStreamError, DefaultStreamConfigError, DeviceNameError,
DevicesError, HostId, HostUnavailable, InputCallbackInfo, InputStreamTimestamp,
OutputCallbackInfo, OutputStreamTimestamp, PauseStreamError, PlayStreamError, StreamError,
SupportedBufferSize, SupportedInputConfigs, SupportedOutputConfigs, SupportedStreamConfig,
SupportedStreamConfigsError,
};
pub use dasp_sample;
pub mod buffer;
pub mod device;
pub mod receiver;
pub mod requester;
pub mod stream;
pub struct Host {
host: Arc<cpal::Host>,
}
impl Host {
pub fn from_id(id: HostId) -> Result<Self, HostUnavailable> {
let host = cpal::host_from_id(id)?;
Ok(Self::from_cpal_host(host))
}
pub fn new() -> Self {
let host = cpal::default_host();
Self::from_cpal_host(host)
}
fn from_cpal_host(host: cpal::Host) -> Self {
let host = Arc::new(host);
Host { host }
}
pub fn devices(&self) -> Result<Devices, DevicesError> {
let devices = self.host.devices()?;
Ok(Devices { devices })
}
pub fn input_devices(&self) -> Result<stream::input::Devices, DevicesError> {
let devices = self.host.input_devices()?;
Ok(stream::input::Devices { devices })
}
pub fn output_devices(&self) -> Result<stream::output::Devices, DevicesError> {
let devices = self.host.output_devices()?;
Ok(stream::output::Devices { devices })
}
pub fn default_input_device(&self) -> Option<Device> {
self.host
.default_input_device()
.map(|device| Device { device })
}
pub fn default_output_device(&self) -> Option<Device> {
self.host
.default_output_device()
.map(|device| Device { device })
}
pub fn new_input_stream<M, S>(&self, model: M) -> stream::input::BuilderInit<M, S> {
stream::input::Builder {
capture: stream::input::default_capture_fn,
error: stream::default_error_fn,
builder: self.new_stream(model),
}
}
pub fn new_output_stream<M, S>(&self, model: M) -> stream::output::BuilderInit<M, S> {
stream::output::Builder {
render: stream::output::default_render_fn,
error: stream::default_error_fn,
builder: self.new_stream(model),
}
}
fn new_stream<M, S>(&self, model: M) -> stream::Builder<M, S> {
stream::Builder {
host: self.host.clone(),
model,
sample_rate: None,
channels: None,
frames_per_buffer: None,
device_buffer_size: None,
device: None,
sample_format: PhantomData,
}
}
}
impl Default for Host {
fn default() -> Self {
Self::new()
}
}