diff --git a/examples/gain.rs b/examples/gain.rs new file mode 100644 index 0000000..78214b0 --- /dev/null +++ b/examples/gain.rs @@ -0,0 +1,67 @@ +use bevy::{ + prelude::{App, Assets, Commands, Deref, Handle, Res, ResMut, StartupStage}, + reflect::TypeUuid, + time::Time, + DefaultPlugins, +}; +use bevy_oddio::{builtins::sine, output::AudioSink, Audio, AudioApp, AudioPlugin, ToSignal}; +use oddio::Sample; + +#[derive(TypeUuid)] +#[uuid = "54498976-f7db-4ee7-a2e6-5fee0fcadbfb"] +struct SineWithGain; + +impl ToSignal for SineWithGain { + type Settings = sine::Settings; + type Signal = oddio::Gain; + + fn to_signal(&self, settings: Self::Settings) -> Self::Signal { + oddio::Gain::new(oddio::Sine::new(settings.phase, settings.frequency_hz)) + } +} + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_plugin(AudioPlugin) + .add_audio_source::<1, _, SineWithGain>() + .add_startup_system(init_assets) + .add_startup_system_to_stage(StartupStage::PostStartup, play_sine_with_gain) + .add_system(change_volume) + .run(); +} + +#[derive(Deref)] +struct SineWithGainHandle(Handle); + +struct SineWithGainSink(Handle>); + +fn init_assets(mut commands: Commands, mut assets: ResMut>) { + let handle = assets.add(SineWithGain); + commands.insert_resource(SineWithGainHandle(handle)); +} + +fn play_sine_with_gain( + mut commands: Commands, + mut audio: ResMut>, + sine_with_gain: Res, +) { + let handle = audio.play(sine_with_gain.clone(), sine::Settings::new(0.0, 440.0)); + commands.insert_resource(SineWithGainSink(handle)); +} + +fn change_volume( + sink_handle: Res, + mut sinks: ResMut>>, + time: Res