qwac 0.29.0

Rust client crate for making qwac games
Documentation
mod delay_node;
mod delay_time;
mod destination_node;
mod detune;
mod frequency;
mod gain;
mod gain_node;
mod oscillator_node;

pub use delay_node::DelayNode;
pub use delay_time::DelayTime;
pub use destination_node::DestinationNode;
pub use detune::Detune;
pub use frequency::Frequency;
pub use gain::Gain;
pub use gain_node::GainNode;
pub use oscillator_node::{OscillatorNode, OscillatorType};

use qwac_sys::audio;
use std::time::Duration;

/// An audio slot, indicating that audio nodes and parameters share an ID pool.
pub trait Slot {
    fn id(&self) -> i32;
}

pub trait Output: Slot {}

pub trait Param: Output {
    fn cancel_and_hold_at_time(&mut self, time: Duration) {
        unsafe {
            audio::param_cancel_and_hold_at_time(self.id(), time.as_secs_f32());
        }
    }
    fn cancel_scheduled_values(&mut self, time: Duration) {
        unsafe {
            audio::param_cancel_scheduled_values(self.id(), time.as_secs_f32());
        }
    }

    fn set_value(&mut self, value: f32) {
        unsafe {
            audio::param_set_value(self.id(), value);
        }
    }
    fn set_value_at_time(&mut self, value: f32, time: Duration) {
        unsafe {
            audio::param_set_value_at_time(self.id(), value, time.as_secs_f32());
        }
    }
    fn set_target_at_time(&mut self, target: f32, start_time: Duration, time_constant: Duration) {
        unsafe {
            audio::param_set_target_at_time(
                self.id(),
                target,
                start_time.as_secs_f32(),
                time_constant.as_secs_f32(),
            );
        }
    }
    fn linear_ramp_to_value_at_time(&mut self, value: f32, end_time: Duration) {
        unsafe {
            audio::param_linear_ramp_to_value_at_time(self.id(), value, end_time.as_secs_f32());
        }
    }
    fn exponential_ramp_to_value_at_time(&mut self, value: f32, end_time: Duration) {
        unsafe {
            audio::param_exponential_ramp_to_value_at_time(
                self.id(),
                value,
                end_time.as_secs_f32(),
            );
        }
    }
}

pub trait Input: Slot {
    fn connect<'a, 'b, A>(&'a mut self, target: &'b mut A)
    where
        A: Output,
    {
        unsafe {
            audio::connect(self.id(), target.id());
        }
    }

    fn disconnect<'a, 'b, A>(&'a mut self, target: &'b mut A)
    where
        A: Output,
    {
        unsafe {
            audio::disconnect(self.id(), target.id());
        }
    }

    fn disconnect_all(&mut self) {
        unsafe {
            audio::disconnect(self.id(), -1);
        }
    }
}

pub trait Source: Input {
    fn start(&mut self, time: Duration) {
        unsafe {
            audio::start(self.id(), time.as_secs_f32());
        }
    }

    fn stop(&mut self, time: Duration) {
        unsafe {
            audio::stop(self.id(), time.as_secs_f32());
        }
    }
}