2121//! Contains various filter effects. For example, lowpass filter could be used to muffle sounds.
2222
2323use crate :: {
24- context:: SAMPLE_RATE ,
2524 dsp:: { filters:: Biquad , filters:: BiquadKind } ,
2625 effects:: EffectRenderTrait ,
2726} ;
@@ -44,6 +43,10 @@ macro_rules! define_filter_effect {
4443 #[ reflect( setter = "set_quality" ) ]
4544 quality: f32 ,
4645
46+ #[ reflect( hidden) ]
47+ #[ visit( skip) ]
48+ sample_rate: u32 ,
49+
4750 #[ reflect( hidden) ]
4851 left: Biquad ,
4952 #[ reflect( hidden) ]
@@ -52,20 +55,37 @@ macro_rules! define_filter_effect {
5255
5356 impl Default for $name {
5457 fn default ( ) -> Self {
55- let mut filter = Self {
58+ Self {
5659 cutoff_frequency_hz: 2200.0 ,
5760 gain: 1.0 ,
5861 quality: 0.5 ,
5962 left: Default :: default ( ) ,
6063 right: Default :: default ( ) ,
61- } ;
62- filter. update( ) ;
63- filter
64+ sample_rate: 0
65+ }
6466 }
6567 }
6668
6769 impl EffectRenderTrait for $name {
68- fn render( & mut self , input: & [ ( f32 , f32 ) ] , output: & mut [ ( f32 , f32 ) ] ) {
70+ fn render( & mut self , sample_rate: u32 , input: & [ ( f32 , f32 ) ] , output: & mut [ ( f32 , f32 ) ] ) {
71+ if self . sample_rate != sample_rate {
72+ self . sample_rate = sample_rate;
73+
74+ self . left. tune(
75+ $kind,
76+ self . cutoff_frequency_hz / self . sample_rate as f32 ,
77+ self . gain,
78+ self . quality
79+ ) ;
80+
81+ self . right. tune(
82+ $kind,
83+ self . cutoff_frequency_hz / self . sample_rate as f32 ,
84+ self . gain,
85+ self . quality
86+ ) ;
87+ }
88+
6989 for ( ( input_left, input_right) , ( output_left, output_right) ) in input. iter( ) . zip( output) {
7090 * output_left = self . left. feed( * input_left) ;
7191 * output_right = self . right. feed( * input_right) ;
@@ -78,7 +98,7 @@ macro_rules! define_filter_effect {
7898 #[ inline]
7999 pub fn set_gain( & mut self , gain: f32 ) {
80100 self . gain = gain;
81- self . update ( ) ;
101+ self . sample_rate = 0 ;
82102 }
83103
84104 /// Returns filter's gain coefficient.
@@ -92,7 +112,7 @@ macro_rules! define_filter_effect {
92112 #[ inline]
93113 pub fn set_cutoff_frequency_hz( & mut self , freq: f32 ) {
94114 self . cutoff_frequency_hz = freq;
95- self . update ( ) ;
115+ self . sample_rate = 0 ;
96116 }
97117
98118 /// Returns a cutoff frequency of the filter in Hertz.
@@ -106,30 +126,14 @@ macro_rules! define_filter_effect {
106126 #[ inline]
107127 pub fn set_quality( & mut self , quality: f32 ) {
108128 self . quality = quality;
109- self . update ( ) ;
129+ self . sample_rate = 0 ;
110130 }
111131
112132 /// Returns the quality of the filter.
113133 #[ inline]
114134 pub fn quality( & self ) -> f32 {
115135 self . quality
116136 }
117-
118- fn update( & mut self ) {
119- self . left. tune(
120- $kind,
121- self . cutoff_frequency_hz / SAMPLE_RATE as f32 ,
122- self . gain,
123- self . quality
124- ) ;
125-
126- self . right. tune(
127- $kind,
128- self . cutoff_frequency_hz / SAMPLE_RATE as f32 ,
129- self . gain,
130- self . quality
131- )
132- }
133137 }
134138 } ;
135139}
0 commit comments