1
1
use std::any::Any;
2
2
use std::f32::consts::PI;
3
- use std::sync::atomic::{AtomicU8, Ordering};
4
3
5
4
use float_eq::float_eq;
6
5
use hrtf::{HrirSphere, HrtfContext, HrtfProcessor, Vec3};
7
6
8
7
use crate::context::{AudioContextRegistration, AudioParamId, BaseAudioContext};
9
8
use crate::param::{AudioParam, AudioParamDescriptor};
10
9
use crate::render::{AudioParamValues, AudioProcessor, AudioRenderQuantum, RenderScope};
11
- use crate::{AtomicF64, RENDER_QUANTUM_SIZE} ;
10
+ use crate::RENDER_QUANTUM_SIZE;
12
11
13
12
use super::{
14
13
AudioNode, ChannelConfig, ChannelConfigOptions, ChannelCountMode, ChannelInterpretation,
@@ -115,7 +114,7 @@ impl Default for PannerOptions {
115
114
}
116
115
117
116
enum ControlMessage {
118
- DistanceModel(u8 ),
117
+ DistanceModel(DistanceModelType ),
119
118
// Box this payload - one large variant can penalize the memory layout of this enum
120
119
PanningModel(Box<Option<HrtfState>>),
121
120
RefDistance(f64),
@@ -282,14 +281,14 @@ pub struct PannerNode {
282
281
orientation_x: AudioParam,
283
282
orientation_y: AudioParam,
284
283
orientation_z: AudioParam,
285
- cone_inner_angle: AtomicF64 ,
286
- cone_outer_angle: AtomicF64 ,
287
- cone_outer_gain: AtomicF64 ,
288
- distance_model: AtomicU8 ,
289
- ref_distance: AtomicF64 ,
290
- max_distance: AtomicF64 ,
291
- rolloff_factor: AtomicF64 ,
292
- panning_model: AtomicU8 ,
284
+ cone_inner_angle: f64 ,
285
+ cone_outer_angle: f64 ,
286
+ cone_outer_gain: f64 ,
287
+ distance_model: DistanceModelType ,
288
+ ref_distance: f64 ,
289
+ max_distance: f64 ,
290
+ rolloff_factor: f64 ,
291
+ panning_model: PanningModelType ,
293
292
}
294
293
295
294
impl AudioNode for PannerNode {
@@ -340,7 +339,7 @@ impl PannerNode {
340
339
/// Can panic when loading HRIR-sphere
341
340
#[allow(clippy::missing_panics_doc)]
342
341
pub fn new<C: BaseAudioContext>(context: &C, options: PannerOptions) -> Self {
343
- let node = context.register(|registration| {
342
+ let mut node = context.register(|registration| {
344
343
use crate::spatial::PARAM_OPTS;
345
344
346
345
let PannerOptions {
@@ -409,14 +408,14 @@ impl PannerNode {
409
408
orientation_x: param_ox,
410
409
orientation_y: param_oy,
411
410
orientation_z: param_oz,
412
- distance_model: AtomicU8::new(distance_model as u8) ,
413
- ref_distance: AtomicF64::new(ref_distance) ,
414
- max_distance: AtomicF64::new(max_distance) ,
415
- rolloff_factor: AtomicF64::new(rolloff_factor) ,
416
- cone_inner_angle: AtomicF64::new(cone_inner_angle) ,
417
- cone_outer_angle: AtomicF64::new(cone_outer_angle) ,
418
- cone_outer_gain: AtomicF64::new(cone_outer_gain) ,
419
- panning_model: AtomicU8::new(panning_model as u8) ,
411
+ distance_model,
412
+ ref_distance,
413
+ max_distance,
414
+ rolloff_factor,
415
+ cone_inner_angle,
416
+ cone_outer_angle,
417
+ cone_outer_gain,
418
+ panning_model,
420
419
};
421
420
422
421
// instruct to BaseContext to add the AudioListener if it has not already
@@ -473,82 +472,81 @@ impl PannerNode {
473
472
}
474
473
475
474
pub fn distance_model(&self) -> DistanceModelType {
476
- self.distance_model.load(Ordering::Acquire).into()
475
+ self.distance_model
477
476
}
478
477
479
- pub fn set_distance_model(&self, value: DistanceModelType) {
480
- let value = value as u8;
481
- self.distance_model.store(value, Ordering::Release);
478
+ pub fn set_distance_model(&mut self, value: DistanceModelType) {
479
+ self.distance_model = value;
482
480
self.registration
483
481
.post_message(ControlMessage::DistanceModel(value));
484
482
}
485
483
486
484
pub fn ref_distance(&self) -> f64 {
487
- self.ref_distance.load(Ordering::Acquire)
485
+ self.ref_distance
488
486
}
489
487
490
- pub fn set_ref_distance(&self, value: f64) {
491
- self.ref_distance.store(value, Ordering::Release) ;
488
+ pub fn set_ref_distance(&mut self, value: f64) {
489
+ self.ref_distance = value ;
492
490
self.registration
493
491
.post_message(ControlMessage::RefDistance(value));
494
492
}
495
493
496
494
pub fn max_distance(&self) -> f64 {
497
- self.max_distance.load(Ordering::Acquire)
495
+ self.max_distance
498
496
}
499
497
500
- pub fn set_max_distance(&self, value: f64) {
501
- self.max_distance.store(value, Ordering::Release) ;
498
+ pub fn set_max_distance(&mut self, value: f64) {
499
+ self.max_distance = value ;
502
500
self.registration
503
501
.post_message(ControlMessage::MaxDistance(value));
504
502
}
505
503
506
504
pub fn rolloff_factor(&self) -> f64 {
507
- self.rolloff_factor.load(Ordering::Acquire)
505
+ self.rolloff_factor
508
506
}
509
507
510
- pub fn set_rolloff_factor(&self, value: f64) {
511
- self.rolloff_factor.store(value, Ordering::Release) ;
508
+ pub fn set_rolloff_factor(&mut self, value: f64) {
509
+ self.rolloff_factor = value ;
512
510
self.registration
513
511
.post_message(ControlMessage::RollOffFactor(value));
514
512
}
515
513
516
514
pub fn cone_inner_angle(&self) -> f64 {
517
- self.cone_inner_angle.load(Ordering::Acquire)
515
+ self.cone_inner_angle
518
516
}
519
517
520
- pub fn set_cone_inner_angle(&self, value: f64) {
521
- self.cone_inner_angle.store(value, Ordering::Release) ;
518
+ pub fn set_cone_inner_angle(&mut self, value: f64) {
519
+ self.cone_inner_angle = value ;
522
520
self.registration
523
521
.post_message(ControlMessage::ConeInnerAngle(value));
524
522
}
525
523
526
524
pub fn cone_outer_angle(&self) -> f64 {
527
- self.cone_outer_angle.load(Ordering::Acquire)
525
+ self.cone_outer_angle
528
526
}
529
527
530
- pub fn set_cone_outer_angle(&self, value: f64) {
531
- self.cone_outer_angle.store(value, Ordering::Release) ;
528
+ pub fn set_cone_outer_angle(&mut self, value: f64) {
529
+ self.cone_outer_angle = value ;
532
530
self.registration
533
531
.post_message(ControlMessage::ConeOuterAngle(value));
534
532
}
535
533
536
534
pub fn cone_outer_gain(&self) -> f64 {
537
- self.cone_outer_gain.load(Ordering::Acquire)
535
+ self.cone_outer_gain
538
536
}
539
537
540
- pub fn set_cone_outer_gain(&self, value: f64) {
541
- self.cone_outer_gain.store(value, Ordering::Release) ;
538
+ pub fn set_cone_outer_gain(&mut self, value: f64) {
539
+ self.cone_outer_gain = value ;
542
540
self.registration
543
541
.post_message(ControlMessage::ConeOuterGain(value));
544
542
}
545
543
546
544
pub fn panning_model(&self) -> PanningModelType {
547
- self.panning_model.load(Ordering::Acquire).into()
545
+ self.panning_model
548
546
}
549
547
550
548
#[allow(clippy::missing_panics_doc)] // loading the provided HRTF will not panic
551
- pub fn set_panning_model(&self, value: PanningModelType) {
549
+ pub fn set_panning_model(&mut self, value: PanningModelType) {
552
550
let hrtf_option = match value {
553
551
PanningModelType::EqualPower => None,
554
552
PanningModelType::HRTF => {
@@ -559,7 +557,7 @@ impl PannerNode {
559
557
}
560
558
};
561
559
562
- self.panning_model.store(value as u8, Ordering::Release) ;
560
+ self.panning_model = value ;
563
561
self.registration
564
562
.post_message(ControlMessage::PanningModel(Box::new(hrtf_option)));
565
563
}
@@ -797,7 +795,7 @@ impl AudioProcessor for PannerRenderer {
797
795
fn onmessage(&mut self, msg: &mut dyn Any) {
798
796
if let Some(control) = msg.downcast_mut::<ControlMessage>() {
799
797
match control {
800
- ControlMessage::DistanceModel(value) => self.distance_model = ( *value).into() ,
798
+ ControlMessage::DistanceModel(value) => self.distance_model = *value,
801
799
ControlMessage::RefDistance(value) => self.ref_distance = *value,
802
800
ControlMessage::MaxDistance(value) => self.max_distance = *value,
803
801
ControlMessage::RollOffFactor(value) => self.rolloff_factor = *value,
0 commit comments