Skip to content

Commit f76da36

Browse files
committed
WaveshaperNode: don't use OnceLock and Atomics for interior mutability
1 parent fcdd80e commit f76da36

File tree

3 files changed

+24
-22
lines changed

3 files changed

+24
-22
lines changed

examples/waveshaper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fn main() {
5252
post_gain.connect(&context.destination());
5353
post_gain.gain().set_value(0.);
5454

55-
let shaper = context.create_wave_shaper();
55+
let mut shaper = context.create_wave_shaper();
5656
shaper.set_oversample(OverSampleType::None);
5757
// shaper.set_oversample(OverSampleType::X2);
5858
// shaper.set_oversample(OverSampleType::X4);

showcase/mic_playback/src/main.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@ fn poll_frequency_graph(
237237

238238
// todo, check BaseAudioContext.state if it is still running
239239

240-
analyser.lock().unwrap().get_float_frequency_data(&mut freq_buffer);
240+
analyser
241+
.lock()
242+
.unwrap()
243+
.get_float_frequency_data(&mut freq_buffer);
241244

242245
let points: Vec<_> = freq_buffer
243246
.iter()

src/node/waveshaper.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
use std::any::Any;
2-
use std::sync::atomic::{AtomicU32, Ordering};
3-
use std::sync::OnceLock;
42

53
use rubato::{FftFixedInOut, Resampler as _};
64

@@ -102,7 +100,7 @@ impl Default for WaveShaperOptions {
102100
/// post_gain.connect(&context.destination());
103101
/// post_gain.gain().set_value(1. / drive);
104102
///
105-
/// let shaper = context.create_wave_shaper();
103+
/// let mut shaper = context.create_wave_shaper();
106104
/// shaper.connect(&post_gain);
107105
/// shaper.set_curve(curve);
108106
///
@@ -126,9 +124,9 @@ pub struct WaveShaperNode {
126124
/// Infos about audio node channel configuration
127125
channel_config: ChannelConfig,
128126
/// distortion curve
129-
curve: OnceLock<Vec<f32>>,
127+
curve: Option<Vec<f32>>,
130128
/// oversample type
131-
oversample: AtomicU32,
129+
oversample: OverSampleType,
132130
}
133131

134132
impl AudioNode for WaveShaperNode {
@@ -163,7 +161,7 @@ impl WaveShaperNode {
163161
channel_config,
164162
} = options;
165163

166-
let node = context.register(move |registration| {
164+
let mut node = context.register(move |registration| {
167165
let sample_rate = context.sample_rate() as usize;
168166

169167
let renderer = WaveShaperRenderer::new(RendererConfig {
@@ -174,8 +172,8 @@ impl WaveShaperNode {
174172
let node = Self {
175173
registration,
176174
channel_config: channel_config.into(),
177-
curve: OnceLock::new(),
178-
oversample: AtomicU32::new(oversample as u32),
175+
curve: None,
176+
oversample,
179177
};
180178

181179
(node, Box::new(renderer))
@@ -192,7 +190,7 @@ impl WaveShaperNode {
192190
/// Returns the distortion curve
193191
#[must_use]
194192
pub fn curve(&self) -> Option<&[f32]> {
195-
self.curve.get().map(Vec::as_slice)
193+
self.curve.as_deref()
196194
}
197195

198196
/// Set the distortion `curve` of this node
@@ -205,29 +203,30 @@ impl WaveShaperNode {
205203
///
206204
/// Panics if a curve has already been given to the source (though `new` or through
207205
/// `set_curve`)
208-
pub fn set_curve(&self, curve: Vec<f32>) {
209-
let clone = curve.clone();
210-
211-
if self.curve.set(curve).is_err() {
206+
pub fn set_curve(&mut self, curve: Vec<f32>) {
207+
if self.curve.is_some() {
212208
panic!("InvalidStateError - cannot assign curve twice");
213209
}
214210

211+
let clone = curve.clone();
212+
213+
self.curve = Some(curve);
215214
self.registration.post_message(Some(clone));
216215
}
217216

218217
/// Returns the `oversample` faactor of this node
219218
#[must_use]
220219
pub fn oversample(&self) -> OverSampleType {
221-
self.oversample.load(Ordering::Acquire).into()
220+
self.oversample
222221
}
223222

224223
/// set the `oversample` factor of this node
225224
///
226225
/// # Arguments
227226
///
228227
/// * `oversample` - the desired `OversampleType` variant
229-
pub fn set_oversample(&self, oversample: OverSampleType) {
230-
self.oversample.store(oversample as u32, Ordering::Release);
228+
pub fn set_oversample(&mut self, oversample: OverSampleType) {
229+
self.oversample = oversample;
231230
self.registration.post_message(oversample);
232231
}
233232
}
@@ -618,7 +617,7 @@ mod tests {
618617
..Default::default()
619618
};
620619

621-
let shaper = WaveShaperNode::new(&context, options);
620+
let mut shaper = WaveShaperNode::new(&context, options);
622621
assert_eq!(shaper.curve(), Some(&[1.0][..]));
623622
assert_eq!(shaper.oversample(), OverSampleType::X2);
624623

@@ -641,7 +640,7 @@ mod tests {
641640
..Default::default()
642641
};
643642

644-
let shaper = WaveShaperNode::new(&context, options);
643+
let mut shaper = WaveShaperNode::new(&context, options);
645644
assert_eq!(shaper.curve(), None);
646645
assert_eq!(shaper.oversample(), OverSampleType::X2);
647646

@@ -659,7 +658,7 @@ mod tests {
659658
let sample_rate = 44100.;
660659
let context = OfflineAudioContext::new(1, 3 * RENDER_QUANTUM_SIZE, sample_rate);
661660

662-
let shaper = context.create_wave_shaper();
661+
let mut shaper = context.create_wave_shaper();
663662
let curve = vec![-0.5, 0., 0.5];
664663
shaper.set_curve(curve);
665664
shaper.connect(&context.destination());
@@ -697,7 +696,7 @@ mod tests {
697696
let sample_rate = 44100.;
698697
let context = OfflineAudioContext::new(1, RENDER_QUANTUM_SIZE, sample_rate);
699698

700-
let shaper = context.create_wave_shaper();
699+
let mut shaper = context.create_wave_shaper();
701700
let curve = vec![-0.5, 0., 0.5];
702701
shaper.set_curve(curve);
703702
shaper.connect(&context.destination());

0 commit comments

Comments
 (0)