use bevy_platform::prelude::{String, Vec};
use core::error::Error;
use core::time::Duration;
use firewheel_core::{node::StreamStatus, StreamInfo};
use crate::processor::FirewheelProcessor;
pub trait AudioBackend: Sized {
type Enumerator;
type Config: Default;
type StartStreamError: Error;
type StreamError: Error;
type Instant: Send + Clone;
fn enumerator() -> Self::Enumerator;
fn input_devices_simple(&mut self) -> Vec<DeviceInfoSimple> {
Vec::new()
}
fn output_devices_simple(&mut self) -> Vec<DeviceInfoSimple> {
Vec::new()
}
fn convert_simple_config(&mut self, config: &SimpleStreamConfig) -> Self::Config {
let _ = config;
Self::Config::default()
}
fn start_stream(config: Self::Config) -> Result<(Self, StreamInfo), Self::StartStreamError>;
fn set_processor(&mut self, processor: FirewheelProcessor<Self>);
fn poll_status(&mut self) -> Result<(), Self::StreamError>;
fn delay_from_last_process(&self, process_timestamp: Self::Instant) -> Option<Duration>;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BackendProcessInfo<B: AudioBackend> {
pub num_in_channels: usize,
pub num_out_channels: usize,
pub frames: usize,
pub process_timestamp: B::Instant,
pub duration_since_stream_start: Duration,
pub input_stream_status: StreamStatus,
pub output_stream_status: StreamStatus,
pub dropped_frames: u32,
}
#[derive(Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "bevy_reflect", derive(bevy_reflect::Reflect))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeviceInfoSimple {
pub name: String,
pub id: String,
}
#[derive(Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "bevy_reflect", derive(bevy_reflect::Reflect))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SimpleDeviceConfig {
pub device: Option<String>,
pub channels: Option<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "bevy_reflect", derive(bevy_reflect::Reflect))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SimpleStreamConfig {
pub output: SimpleDeviceConfig,
pub input: Option<SimpleDeviceConfig>,
pub desired_block_frames: Option<u32>,
pub desired_sample_rate: Option<u32>,
}
impl Default for SimpleStreamConfig {
fn default() -> Self {
Self {
output: SimpleDeviceConfig::default(),
input: None,
desired_block_frames: Some(1024),
desired_sample_rate: None,
}
}
}