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