#![warn(missing_docs)]
#![warn(clippy::pedantic)]
#![allow(clippy::doc_markdown)]
use {
backend::{Backend, DefaultBackend},
bevy::prelude::{AddAsset, App, Plugin},
dsp_graph::DspGraph,
dsp_manager::DspManager,
dsp_source::{DspSource, SourceType},
once_cell::sync::Lazy,
};
pub mod backend;
pub mod dsp_graph;
pub mod dsp_manager;
pub mod dsp_source;
pub struct DspPlugin {
sample_rate: f32,
}
impl DspPlugin {
#[allow(clippy::must_use_candidate)]
pub fn new(sample_rate: f32) -> Self {
Self { sample_rate }
}
}
impl Default for DspPlugin {
fn default() -> Self {
Self::new(*DEFAULT_SAMPLE_RATE)
}
}
impl Plugin for DspPlugin {
fn build(&self, app: &mut App) {
app.insert_resource(DspManager::new(self.sample_rate))
.add_asset::<DspSource>();
DefaultBackend::init_app(app);
}
}
pub trait DspAppExt {
fn add_dsp_source<D: DspGraph>(&mut self, dsp_graph: D, source_type: SourceType) -> &mut Self;
}
impl DspAppExt for App {
fn add_dsp_source<D: DspGraph>(&mut self, dsp_graph: D, source_type: SourceType) -> &mut Self {
let mut dsp_manager = self.world.resource_mut::<DspManager>();
dsp_manager.add_graph(dsp_graph, source_type);
self
}
}
static DEFAULT_SAMPLE_RATE: Lazy<f32> = Lazy::new(default_sample_rate);
#[cfg(not(test))]
fn default_sample_rate() -> f32 {
use cpal::traits::{DeviceTrait, HostTrait};
let host = cpal::default_host();
let device = host
.default_output_device()
.unwrap_or_else(|| panic!("No output device available."));
let default_config = device
.default_output_config()
.unwrap_or_else(|err| panic!("Cannot find default stream config. Error: {err}"));
#[allow(clippy::cast_precision_loss)]
{
default_config.sample_rate().0 as f32
}
}
#[cfg(test)]
fn default_sample_rate() -> f32 {
bevy::log::warn!("This is in test mode!");
44100.0
}
pub mod prelude {
pub use {
crate::{
backend::{Backend, DefaultBackend, DspAudioExt},
dsp_graph::DspGraph,
dsp_manager::DspManager,
dsp_source::{DspSource, Iter, IterMono, SourceType},
DspAppExt, DspPlugin,
},
fundsp::hacker32::*,
};
}
#[doc = include_str!("../README.md")]
#[cfg(all(feature = "bevy_audio", doctest))]
struct DocTestsForReadMe;