#![warn(missing_docs)]
#![warn(clippy::pedantic)]
#![allow(clippy::doc_markdown)]
use backend::{Backend, DefaultBackend};
use bevy::prelude::{AddAsset, App, Plugin};
use dsp_graph::DspGraph;
use dsp_manager::DspManager;
use dsp_source::{DspSource, SourceType};
use 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};
pub use crate::dsp_graph::DspGraph;
pub use crate::dsp_manager::DspManager;
pub use crate::dsp_source::{DspSource, Iter, IterMono, SourceType};
pub use crate::DspAppExt;
pub use crate::DspPlugin;
pub use fundsp::hacker32::*;
}
#[doc = include_str!("../README.md")]
#[cfg(all(feature = "bevy_audio", doctest))]
struct DocTestsForReadMe;