Skip to content

Commit 8b5b963

Browse files
committed
AudioBufferSourceNode: Use RefCell to encapsulate the loop state
1 parent 4f07fb8 commit 8b5b963

File tree

12 files changed

+45
-45
lines changed

12 files changed

+45
-45
lines changed

benches/my_benchmark.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ pub fn bench_stereo_panning_automation() {
168168
panner.pan().set_value_at_time(-1., 0.);
169169
panner.pan().set_value_at_time(0.2, 0.5);
170170

171-
let mut src = ctx.create_buffer_source();
171+
let src = ctx.create_buffer_source();
172172
src.connect(&panner);
173173
src.set_buffer(buffer);
174174
src.set_loop(true);
@@ -188,7 +188,7 @@ pub fn bench_analyser_node() {
188188
let analyser = ctx.create_analyser();
189189
analyser.connect(&ctx.destination());
190190

191-
let mut src = ctx.create_buffer_source();
191+
let src = ctx.create_buffer_source();
192192
src.connect(&analyser);
193193
src.set_buffer(buffer);
194194
src.set_loop(true);

examples/audio_buffer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn main() {
4343
buffer.copy_to_channel(&sine, 0);
4444

4545
// play the buffer in a loop
46-
let mut src = context.create_buffer_source();
46+
let src = context.create_buffer_source();
4747
src.set_buffer(buffer.clone());
4848
src.set_loop(true);
4949
src.connect(&context.destination());

examples/benchmarks.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ fn main() {
9595
let name = "Simple source test without resampling (Mono)";
9696

9797
let context = OfflineAudioContext::new(1, DURATION * sample_rate as usize, sample_rate);
98-
let mut source = context.create_buffer_source();
98+
let source = context.create_buffer_source();
9999
let buf = get_buffer(&sources, sample_rate, 1);
100100
source.set_buffer(buf);
101101
source.set_loop(true);
@@ -109,7 +109,7 @@ fn main() {
109109
let name = "Simple source test without resampling (Stereo)";
110110

111111
let context = OfflineAudioContext::new(2, DURATION * sample_rate as usize, sample_rate);
112-
let mut source = context.create_buffer_source();
112+
let source = context.create_buffer_source();
113113
let buf = get_buffer(&sources, sample_rate, 2);
114114
source.set_buffer(buf);
115115
source.set_loop(true);
@@ -133,7 +133,7 @@ fn main() {
133133
panner.orientation_y().set_value(2.);
134134
panner.orientation_z().set_value(3.);
135135

136-
let mut source = context.create_buffer_source();
136+
let source = context.create_buffer_source();
137137
source.connect(&panner);
138138

139139
let buf = get_buffer(&sources, sample_rate, 2);
@@ -148,7 +148,7 @@ fn main() {
148148
let name = "Simple source test with resampling (Mono)";
149149

150150
let context = OfflineAudioContext::new(1, DURATION * sample_rate as usize, sample_rate);
151-
let mut source = context.create_buffer_source();
151+
let source = context.create_buffer_source();
152152
let buf = get_buffer(&sources, 38000., 1);
153153
source.set_buffer(buf);
154154
source.set_loop(true);
@@ -162,7 +162,7 @@ fn main() {
162162
let name = "Simple source test with resampling (Stereo)";
163163

164164
let context = OfflineAudioContext::new(2, DURATION * sample_rate as usize, sample_rate);
165-
let mut source = context.create_buffer_source();
165+
let source = context.create_buffer_source();
166166
let buf = get_buffer(&sources, 38000., 2);
167167
source.set_buffer(buf);
168168
source.set_loop(true);
@@ -186,7 +186,7 @@ fn main() {
186186
panner.orientation_y().set_value(2.);
187187
panner.orientation_z().set_value(3.);
188188

189-
let mut source = context.create_buffer_source();
189+
let source = context.create_buffer_source();
190190
source.connect(&panner);
191191

192192
let buf = get_buffer(&sources, 38000., 2);
@@ -201,7 +201,7 @@ fn main() {
201201
let name = "Upmix without resampling (Mono -> Stereo)";
202202

203203
let context = OfflineAudioContext::new(2, DURATION * sample_rate as usize, sample_rate);
204-
let mut source = context.create_buffer_source();
204+
let source = context.create_buffer_source();
205205
let buf = get_buffer(&sources, sample_rate, 1);
206206
source.set_buffer(buf);
207207
source.set_loop(true);
@@ -215,7 +215,7 @@ fn main() {
215215
let name = "Downmix without resampling (Stereo -> Mono)";
216216

217217
let context = OfflineAudioContext::new(1, DURATION * sample_rate as usize, sample_rate);
218-
let mut source = context.create_buffer_source();
218+
let source = context.create_buffer_source();
219219
let buf = get_buffer(&sources, sample_rate, 2);
220220
source.set_buffer(buf);
221221
source.set_loop(true);
@@ -233,7 +233,7 @@ fn main() {
233233
OfflineAudioContext::new(2, adjusted_duration * sample_rate as usize, sample_rate);
234234

235235
for _ in 0..100 {
236-
let mut source = context.create_buffer_source();
236+
let source = context.create_buffer_source();
237237
let buf = get_buffer(&sources, 38000., 1);
238238
source.set_buffer(buf);
239239
source.set_loop(true);
@@ -257,7 +257,7 @@ fn main() {
257257
let mut buffer = context.create_buffer(1, reference.length(), 38000.);
258258
buffer.copy_to_channel(channel_data, 0);
259259

260-
let mut source = context.create_buffer_source();
260+
let source = context.create_buffer_source();
261261
source.set_buffer(buffer);
262262
source.set_loop(true);
263263
source.connect(&context.destination());
@@ -288,7 +288,7 @@ fn main() {
288288
for _ in 0..2 {
289289
let buf = get_buffer(&sources, 38000., 1);
290290

291-
let mut source = context.create_buffer_source();
291+
let source = context.create_buffer_source();
292292
source.set_buffer(buf);
293293
source.set_loop(true);
294294
source.start();
@@ -339,7 +339,7 @@ fn main() {
339339
convolver.set_buffer(buffer);
340340
convolver.connect(&context.destination());
341341

342-
let mut source = context.create_buffer_source();
342+
let source = context.create_buffer_source();
343343
source.set_buffer(buf);
344344
source.set_loop(true);
345345
source.start();
@@ -512,7 +512,7 @@ fn main() {
512512
panner.connect(&context.destination());
513513
panner.pan().set_value(0.1);
514514

515-
let mut src = context.create_buffer_source();
515+
let src = context.create_buffer_source();
516516
let buffer = get_buffer(&sources, sample_rate, 2);
517517
src.connect(&panner);
518518
src.set_buffer(buffer);
@@ -532,7 +532,7 @@ fn main() {
532532
panner.pan().set_value_at_time(-1., 0.);
533533
panner.pan().set_value_at_time(0.2, 0.5);
534534

535-
let mut src = context.create_buffer_source();
535+
let src = context.create_buffer_source();
536536
let buffer = get_buffer(&sources, sample_rate, 2);
537537
src.connect(&panner);
538538
src.set_buffer(buffer);
@@ -567,7 +567,7 @@ fn main() {
567567
delay.delay_time().set_value(1.);
568568
delay.connect(&context.destination());
569569

570-
let mut source = context.create_buffer_source();
570+
let source = context.create_buffer_source();
571571
let buf = get_buffer(&sources, sample_rate, 2);
572572
source.set_buffer(buf);
573573
source.set_loop(true);
@@ -595,7 +595,7 @@ fn main() {
595595
let iir = context.create_iir_filter(feedforward, feedback);
596596
iir.connect(&context.destination());
597597

598-
let mut src = context.create_buffer_source();
598+
let src = context.create_buffer_source();
599599
let buffer = get_buffer(&sources, sample_rate, 2);
600600
src.connect(&iir);
601601
src.set_buffer(buffer);
@@ -615,7 +615,7 @@ fn main() {
615615
biquad.connect(&context.destination());
616616
biquad.frequency().set_value(200.);
617617

618-
let mut src = context.create_buffer_source();
618+
let src = context.create_buffer_source();
619619
let buffer = get_buffer(&sources, sample_rate, 2);
620620
src.connect(&biquad);
621621
src.set_buffer(buffer);

examples/biquad.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn main() {
4242
.exponential_ramp_to_value_at_time(10000., now + 10.);
4343

4444
// pipe the audio buffer source into the lowpass filter
45-
let mut src = context.create_buffer_source();
45+
let src = context.create_buffer_source();
4646
src.connect(&biquad);
4747
src.set_buffer(buffer);
4848
src.set_loop(true);

examples/doppler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fn main() {
4141
let file = File::open("samples/siren.mp3").unwrap();
4242
let buffer = context.decode_audio_data_sync(file).unwrap();
4343

44-
let mut src = context.create_buffer_source();
44+
let src = context.create_buffer_source();
4545
src.set_buffer(buffer);
4646
src.set_loop(true);
4747

examples/iir.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn main() {
4343
iir.connect(&context.destination());
4444

4545
// Play buffer and pipe to filter
46-
let mut src = context.create_buffer_source();
46+
let src = context.create_buffer_source();
4747
src.connect(&iir);
4848
src.set_buffer(buffer);
4949
src.set_loop(true);

examples/spatial.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn main() {
3636
// Create looping 'siren' sound
3737
let file = std::fs::File::open("samples/siren.mp3").unwrap();
3838
let buffer = context.decode_audio_data_sync(file).unwrap();
39-
let mut tone = context.create_buffer_source();
39+
let tone = context.create_buffer_source();
4040
tone.set_buffer(buffer);
4141
tone.set_loop(true);
4242
tone.start();

examples/trigger_soundfile.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ fn main() {
103103

104104
{
105105
println!("++ simple loop (x2)");
106-
let mut src = context.create_buffer_source();
106+
let src = context.create_buffer_source();
107107
src.set_buffer(audio_buffer.clone());
108108
src.connect(&context.destination());
109109
src.set_loop(true);
@@ -115,7 +115,7 @@ fn main() {
115115

116116
{
117117
println!("++ loop between 1 and 2 starting from 0");
118-
let mut src = context.create_buffer_source();
118+
let src = context.create_buffer_source();
119119
src.set_buffer(audio_buffer.clone());
120120
src.connect(&context.destination());
121121
src.set_loop(true);
@@ -131,7 +131,7 @@ fn main() {
131131

132132
{
133133
println!("++ loop backward between 1 and 2 starting from end");
134-
let mut src = context.create_buffer_source();
134+
let src = context.create_buffer_source();
135135
src.set_buffer(audio_buffer.clone());
136136
src.connect(&context.destination());
137137
src.playback_rate().set_value(-1.);

src/buffer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub struct AudioBufferOptions {
5353
/// buffer.copy_to_channel(&sine, 0);
5454
///
5555
/// // play the buffer in a loop
56-
/// let mut src = context.create_buffer_source();
56+
/// let src = context.create_buffer_source();
5757
/// src.set_buffer(buffer.clone());
5858
/// src.set_loop(true);
5959
/// src.connect(&context.destination());

src/node/audio_buffer_source.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::any::Any;
2-
use std::cell::OnceCell;
2+
use std::cell::{OnceCell, RefCell};
33
use std::sync::atomic::{AtomicBool, Ordering};
44

55
use crate::buffer::AudioBuffer;
@@ -102,7 +102,7 @@ pub struct AudioBufferSourceNode {
102102
channel_config: ChannelConfig,
103103
detune: AudioParam, // has constraints, no a-rate
104104
playback_rate: AudioParam, // has constraints, no a-rate
105-
loop_state: LoopState,
105+
loop_state: RefCell<LoopState>,
106106
buffer: OnceCell<AudioBuffer>,
107107
source_started: AtomicBool,
108108
}
@@ -210,7 +210,7 @@ impl AudioBufferSourceNode {
210210
channel_config: ChannelConfig::default(),
211211
detune: d_param,
212212
playback_rate: pr_param,
213-
loop_state,
213+
loop_state: RefCell::new(loop_state),
214214
buffer: OnceCell::new(),
215215
source_started: AtomicBool::new(false),
216216
};
@@ -287,32 +287,32 @@ impl AudioBufferSourceNode {
287287

288288
/// Defines if the playback the [`AudioBuffer`] should be looped
289289
pub fn loop_(&self) -> bool {
290-
self.loop_state.is_looping
290+
self.loop_state.borrow().is_looping
291291
}
292292

293-
pub fn set_loop(&mut self, value: bool) {
294-
self.loop_state.is_looping = value;
293+
pub fn set_loop(&self, value: bool) {
294+
self.loop_state.borrow_mut().is_looping = value;
295295
self.registration.post_message(ControlMessage::Loop(value));
296296
}
297297

298298
/// Defines the loop start point, in the time reference of the [`AudioBuffer`]
299299
pub fn loop_start(&self) -> f64 {
300-
self.loop_state.start
300+
self.loop_state.borrow().start
301301
}
302302

303-
pub fn set_loop_start(&mut self, value: f64) {
304-
self.loop_state.start = value;
303+
pub fn set_loop_start(&self, value: f64) {
304+
self.loop_state.borrow_mut().start = value;
305305
self.registration
306306
.post_message(ControlMessage::LoopStart(value));
307307
}
308308

309309
/// Defines the loop end point, in the time reference of the [`AudioBuffer`]
310310
pub fn loop_end(&self) -> f64 {
311-
self.loop_state.end
311+
self.loop_state.borrow().end
312312
}
313313

314-
pub fn set_loop_end(&mut self, value: f64) {
315-
self.loop_state.end = value;
314+
pub fn set_loop_end(&self, value: f64) {
315+
self.loop_state.borrow_mut().end = value;
316316
self.registration
317317
.post_message(ControlMessage::LoopEnd(value));
318318
}
@@ -1252,7 +1252,7 @@ mod tests {
12521252
let mut dirac = context.create_buffer(1, RENDER_QUANTUM_SIZE / 2, sample_rate);
12531253
dirac.copy_to_channel(&[1.], 0);
12541254

1255-
let mut src = context.create_buffer_source();
1255+
let src = context.create_buffer_source();
12561256
src.connect(&context.destination());
12571257
src.set_loop(true);
12581258
src.set_buffer(dirac);
@@ -1279,7 +1279,7 @@ mod tests {
12791279
let mut dirac = context.create_buffer(1, 129, sample_rate);
12801280
dirac.copy_to_channel(&[1.], 0);
12811281

1282-
let mut src = context.create_buffer_source();
1282+
let src = context.create_buffer_source();
12831283
src.connect(&context.destination());
12841284
src.set_loop(true);
12851285
src.set_buffer(dirac);
@@ -1307,7 +1307,7 @@ mod tests {
13071307
dirac.copy_to_channel(&[1.], 0);
13081308
dirac.copy_to_channel(&[0., 1.], 1);
13091309

1310-
let mut src = context.create_buffer_source();
1310+
let src = context.create_buffer_source();
13111311
src.connect(&context.destination());
13121312
src.set_loop(true);
13131313
src.set_buffer(dirac);

0 commit comments

Comments
 (0)