use std::sync::Arc;
use std::sync::atomic::AtomicU64;
use super::backend::{AudioBackend, AudioEngineHandle, BackendError, DeviceInfo};
use super::engine;
pub struct IosAudioBackend;
fn current_route() -> DeviceInfo {
DeviceInfo {
name: "System Output".to_string(),
sample_rates: vec![44100.0, 48000.0],
platform_id: 0,
}
}
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(IosEngineHandle { engine }))
}
}
struct IosEngineHandle {
engine: engine::AudioEngine,
}
unsafe impl Send for IosEngineHandle {}
impl AudioEngineHandle for IosEngineHandle {
fn start(&self) -> Result<(), BackendError> {
self.engine
.start()
.map_err(|e| BackendError::Platform(e.to_string()))
}
fn stop(&self) -> Result<(), BackendError> {
self.engine
.stop()
.map_err(|e| BackendError::Platform(e.to_string()))
}
fn is_running(&self) -> bool {
self.engine.is_running()
}
fn fade_out(&self) {
self.engine.fade().fade_out();
}
fn fade_in(&self) -> Result<(), BackendError> {
if self.engine.is_running() {
self.engine.fade().fade_in(false);
return Ok(());
}
self.engine.fade().fade_in(true);
self.start()
}
fn is_silent(&self) -> bool {
self.engine.fade().is_silent()
}
}