use std::sync::Arc;
use std::sync::atomic::AtomicU64;
use super::backend::{AudioBackend, AudioEngineHandle, BackendError, DeviceInfo};
use super::engine;
pub struct IosAudioBackend;
static ROUTE: parking_lot::RwLock<Option<String>> = parking_lot::RwLock::new(None);
pub fn set_route(name: String) {
*ROUTE.write() = Some(name);
}
fn current_route() -> DeviceInfo {
DeviceInfo {
name: ROUTE
.read()
.clone()
.unwrap_or_else(|| "System Output".to_string()),
sample_rates: vec![44100.0, 48000.0],
platform_id: 0,
kind: Default::default(),
}
}
impl AudioBackend for IosAudioBackend {
fn list_devices(&self) -> Result<Vec<DeviceInfo>, BackendError> {
Ok(vec![current_route()])
}
fn default_device(&self) -> Result<DeviceInfo, BackendError> {
Ok(current_route())
}
fn supported_sample_rates(&self, _device: &DeviceInfo) -> Result<Vec<f64>, BackendError> {
Ok(current_route().sample_rates)
}
fn get_device_sample_rate(&self, _device: &DeviceInfo) -> Result<f64, BackendError> {
Ok(0.0)
}
fn set_device_sample_rate(&self, _device: &DeviceInfo, rate: f64) -> Result<f64, BackendError> {
Ok(rate)
}
fn create_engine(
&self,
_device: &DeviceInfo,
sample_rate: f64,
channels: u32,
consumer: rtrb::Consumer<f32>,
samples_played: Arc<AtomicU64>,
) -> Result<Box<dyn AudioEngineHandle>, BackendError> {
let engine = engine::AudioEngine::new(0, sample_rate, channels, consumer, samples_played)
.map_err(|e| BackendError::StreamCreation(e.to_string()))?;
Ok(Box::new(engine))
}
}