-
Notifications
You must be signed in to change notification settings - Fork 49
/
params_connect2.rs
60 lines (56 loc) · 2.19 KB
/
params_connect2.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
extern crate servo_media;
extern crate servo_media_auto;
use servo_media::audio::gain_node::GainNodeOptions;
use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage, AudioScheduledSourceNodeMessage};
use servo_media::audio::oscillator_node::OscillatorNodeOptions;
use servo_media::audio::param::{ParamType, RampKind, UserAutomationEvent};
use servo_media::{ClientContextId, ServoMedia};
use std::sync::Arc;
use std::{thread, time};
fn run_example(servo_media: Arc<ServoMedia>) {
let context =
servo_media.create_audio_context(&ClientContextId::build(1, 1), Default::default());
let context = context.lock().unwrap();
let mut options = OscillatorNodeOptions::default();
options.freq = 2.0;
let lfo = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default());
let osc = context.create_node(
AudioNodeInit::OscillatorNode(Default::default()),
Default::default(),
);
let mut options = GainNodeOptions::default();
options.gain = 100.;
let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default());
let dest = context.dest_node();
context.connect_ports(lfo.output(0), gain.input(0));
context.connect_ports(gain.output(0), osc.param(ParamType::Frequency));
context.connect_ports(osc.output(0), dest.input(0));
let _ = context.resume();
context.message_node(
osc,
AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Start(0.)),
);
context.message_node(
lfo,
AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Start(0.)),
);
thread::sleep(time::Duration::from_millis(3000));
// 0.75s - 1.75s: Linearly ramp frequency to 880Hz
context.message_node(
gain,
AudioNodeMessage::SetParam(
ParamType::Gain,
UserAutomationEvent::RampToValueAtTime(RampKind::Linear, 0., 6.),
),
);
thread::sleep(time::Duration::from_millis(3000));
let _ = context.close();
}
fn main() {
ServoMedia::init::<servo_media_auto::Backend>();
if let Ok(servo_media) = ServoMedia::get() {
run_example(servo_media);
} else {
unreachable!();
}
}