Skip to content

Commit ac28a2f

Browse files
committed
Utilize message passing in worklet_message_port.rs (control to render)
1 parent 4ee4c67 commit ac28a2f

File tree

2 files changed

+16
-19
lines changed

2 files changed

+16
-19
lines changed

examples/worklet.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,5 @@ fn main() {
9090
osc.connect(&worklet);
9191
osc.start();
9292

93-
worklet.port().post_message(123);
94-
9593
std::thread::sleep(std::time::Duration::from_millis(5000));
9694
}

examples/worklet_message_port.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use crossbeam_channel::{self, Receiver, Sender};
21
use rand::Rng;
2+
3+
use std::any::Any;
34
use std::collections::HashMap;
45

56
use web_audio_api::context::{
@@ -30,48 +31,42 @@ enum NoiseColor {
3031
/// Audio source node emitting white noise (random samples)
3132
struct WhiteNoiseNode {
3233
node: AudioWorkletNode,
33-
sender: Sender<NoiseColor>,
3434
}
3535

3636
impl WhiteNoiseNode {
3737
fn new(context: &AudioContext) -> Self {
38-
// use a bounded channel for real-time safety
39-
let (sender, receiver) = crossbeam_channel::bounded(16);
40-
4138
let options = AudioWorkletNodeOptions {
4239
number_of_inputs: 0,
4340
number_of_outputs: 1,
4441
output_channel_count: vec![1],
4542
parameter_data: HashMap::new(),
46-
processor_options: receiver,
43+
processor_options: (),
4744
channel_config: ChannelConfigOptions::default(),
4845
};
4946

5047
let node = AudioWorkletNode::new::<WhiteNoiseProcessor>(context.base(), options);
51-
Self { node, sender }
48+
Self { node }
5249
}
5350

5451
fn node(&self) -> &AudioWorkletNode {
5552
&self.node
5653
}
5754

5855
fn set_noise_color(&self, color: NoiseColor) {
59-
self.sender.send(color).unwrap();
56+
self.node.port().post_message(color);
6057
}
6158
}
6259

6360
struct WhiteNoiseProcessor {
6461
color: NoiseColor,
65-
receiver: Receiver<NoiseColor>,
6662
}
6763

6864
impl AudioWorkletProcessor for WhiteNoiseProcessor {
69-
type ProcessorOptions = Receiver<NoiseColor>;
65+
type ProcessorOptions = ();
7066

71-
fn constructor(opts: Self::ProcessorOptions) -> Self {
67+
fn constructor(_opts: Self::ProcessorOptions) -> Self {
7268
Self {
7369
color: NoiseColor::White,
74-
receiver: opts,
7570
}
7671
}
7772

@@ -82,11 +77,6 @@ impl AudioWorkletProcessor for WhiteNoiseProcessor {
8277
_params: AudioParamValues<'_>,
8378
_scope: &RenderScope,
8479
) -> bool {
85-
// handle incoming messages
86-
if let Ok(color) = self.receiver.try_recv() {
87-
self.color = color;
88-
}
89-
9080
// edit the output buffer in place
9181
outputs[0].iter_mut().for_each(|buf| {
9282
let mut rng = rand::thread_rng();
@@ -105,6 +95,15 @@ impl AudioWorkletProcessor for WhiteNoiseProcessor {
10595

10696
true // tail time, source node will always be active
10797
}
98+
99+
fn onmessage(&mut self, msg: &mut dyn Any) {
100+
if let Some(&color) = msg.downcast_ref::<NoiseColor>() {
101+
self.color = color;
102+
return;
103+
}
104+
105+
log::warn!("WhiteNoiseProcessor: Ignoring incoming message");
106+
}
108107
}
109108

110109
fn main() {

0 commit comments

Comments
 (0)