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;
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());
}
}
}