//! Null backend implementation. //! //! Fallback no-op backend for unsupported platforms. use std::time::Duration; use crate::traits::{DeviceTrait, HostTrait, StreamTrait}; use crate::{ BuildStreamError, Data, DefaultStreamConfigError, DeviceDescription, DeviceDescriptionBuilder, DeviceId, DeviceIdError, DeviceNameError, DevicesError, InputCallbackInfo, OutputCallbackInfo, PauseStreamError, PlayStreamError, SampleFormat, StreamConfig, StreamError, SupportedStreamConfig, SupportedStreamConfigRange, SupportedStreamConfigsError, }; #[derive(Default)] pub struct Devices; #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Device; pub struct Host; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Stream; // Compile-time assertion that Stream is Send and Sync crate::assert_stream_send!(Stream); crate::assert_stream_sync!(Stream); #[derive(Clone)] pub struct SupportedInputConfigs; #[derive(Clone)] pub struct SupportedOutputConfigs; impl Host { #[allow(dead_code)] pub fn new() -> Result { Ok(Host) } } impl Devices { pub fn new() -> Result { Ok(Devices) } } impl DeviceTrait for Device { type SupportedInputConfigs = SupportedInputConfigs; type SupportedOutputConfigs = SupportedOutputConfigs; type Stream = Stream; fn name(&self) -> Result { Ok("null".to_string()) } fn description(&self) -> Result { Ok(DeviceDescriptionBuilder::new("Null Device".to_string()).build()) } fn id(&self) -> Result { Ok(DeviceId(crate::platform::HostId::Null, String::new())) } fn supported_input_configs( &self, ) -> Result { unimplemented!() } fn supported_output_configs( &self, ) -> Result { unimplemented!() } fn default_input_config(&self) -> Result { unimplemented!() } fn default_output_config(&self) -> Result { unimplemented!() } fn build_input_stream_raw( &self, _config: StreamConfig, _sample_format: SampleFormat, _data_callback: D, _error_callback: E, _timeout: Option, ) -> Result where D: FnMut(&Data, &InputCallbackInfo) + Send + 'static, E: FnMut(StreamError) + Send + 'static, { unimplemented!() } /// Create an output stream. fn build_output_stream_raw( &self, _config: StreamConfig, _sample_format: SampleFormat, _data_callback: D, _error_callback: E, _timeout: Option, ) -> Result where D: FnMut(&mut Data, &OutputCallbackInfo) + Send + 'static, E: FnMut(StreamError) + Send + 'static, { unimplemented!() } } impl HostTrait for Host { type Devices = Devices; type Device = Device; fn is_available() -> bool { false } fn devices(&self) -> Result { Devices::new() } fn default_input_device(&self) -> Option { None } fn default_output_device(&self) -> Option { None } } impl StreamTrait for Stream { fn play(&self) -> Result<(), PlayStreamError> { unimplemented!() } fn pause(&self) -> Result<(), PauseStreamError> { unimplemented!() } } impl Iterator for Devices { type Item = Device; fn next(&mut self) -> Option { None } } impl Iterator for SupportedInputConfigs { type Item = SupportedStreamConfigRange; fn next(&mut self) -> Option { None } } impl Iterator for SupportedOutputConfigs { type Item = SupportedStreamConfigRange; fn next(&mut self) -> Option { None } }