2323#define PRIVATE_PLUGINS_DEESSER_H_
2424
2525#include < lsp-plug.in/dsp-units/ctl/Bypass.h>
26+ #include < lsp-plug.in/dsp-units/filters/DynamicFilters.h>
2627#include < lsp-plug.in/dsp-units/filters/Equalizer.h>
2728#include < lsp-plug.in/dsp-units/util/Analyzer.h>
29+ #include < lsp-plug.in/dsp-units/util/Crossover.h>
2830#include < lsp-plug.in/dsp-units/util/Delay.h>
31+ #include < lsp-plug.in/dsp-units/util/FFTCrossover.h>
2932#include < lsp-plug.in/plug-fw/plug.h>
3033#include < private/meta/deesser.h>
3134
@@ -56,6 +59,13 @@ namespace lsp
5659 SCM_SYNC_ALL = (SCM_OUT_MESH << 1 ) - 1
5760 };
5861
62+ enum sc_xover_mode_t
63+ {
64+ XOVER_NONE ,
65+ XOVER_CLASSIC ,
66+ XOVER_MODERN ,
67+ XOVER_LINEAR_PHASE
68+ };
5969
6070 typedef struct premix_t
6171 {
@@ -83,6 +93,22 @@ namespace lsp
8393 plug::IPort *pScToLink; // Sidechain -> Link mix
8494 } premix_t ;
8595
96+ typedef struct crossover_t
97+ {
98+ uint32_t nMode; // Work mode
99+ uint32_t nSlope; // Slope
100+ float fFreq ; // Split frequency
101+
102+ float *vLoBand; // Characteristics of the low band
103+ float *vHiBand; // Characteristics of the high band
104+
105+ plug::IPort *pMode; // Crossover mode
106+ plug::IPort *pSlope; // Crossover slope
107+ plug::IPort *pFreq; // Crossover frequency
108+ plug::IPort *pLink; // Crossover split linkage
109+ plug::IPort *pMesh; // Transfer function
110+ } crossover_t ;
111+
86112 typedef struct preeq_t
87113 {
88114 uint32_t nSyncMesh; // Synchronize mesh
@@ -118,50 +144,59 @@ namespace lsp
118144 typedef struct channel_t
119145 {
120146 // DSP processing modules
121- dspu::Bypass sBypass ; // Bypass
122- dspu::Equalizer sSCEq ; // Sidechain equalizer
147+ dspu::Bypass sBypass ; // Bypass
148+ dspu::Equalizer sSCEq ; // Sidechain equalizer
149+ dspu::Crossover sXOver ; // Crossover
150+ dspu::FFTCrossover sFFTXOver ; // FFT crossover
151+
152+ float *vIn; // Input signal
153+ float *vOut; // Output signal
154+ float *vScIn; // Sidechain signal
155+ float *vShmIn; // Shared memory link signal
123156
124- float *vIn; // Input signal
125- float *vOut; // Output signal
126- float *vScIn; // Sidechain signal
127- float *vShmIn; // Shared memory link signal
157+ float *vBuffer; // Buffer for data
128158
129159 // Input ports
130- plug::IPort *pIn; // Input port
131- plug::IPort *pOut; // Output port
132- plug::IPort *pScIn; // Sidechain port
133- plug::IPort *pShmIn; // Shared memory link input
160+ plug::IPort *pIn; // Input port
161+ plug::IPort *pOut; // Output port
162+ plug::IPort *pScIn; // Sidechain port
163+ plug::IPort *pShmIn; // Shared memory link input
134164 } channel_t ;
135165
136166 protected:
137- size_t nChannels; // Number of channels
138- channel_t *vChannels; // Delay channels
139- float *vBuffer; // Temporary buffer for audio processing
140- bool bSidechain; // Sidechain version
167+ size_t nChannels; // Number of channels
168+ channel_t *vChannels; // Delay channels
169+ float *vBuffer; // Temporary buffer for audio processing
170+ bool bSidechain; // Sidechain version
141171
142- dspu::Analyzer sAnalyzer ; // Analyzer
172+ dspu::DynamicFilters sFilters ; // Dynamic filters
173+ dspu::Analyzer sAnalyzer ; // Analyzer
143174
144- premix_t sPremix ; // Premix settings
145- analysis_t sAnalysis ; // Analyzer parameters
146- preeq_t sPreEq ; // Pre-equalization settings
175+ premix_t sPremix ; // Premix settings
176+ analysis_t sAnalysis ; // Analyzer parameters
177+ crossover_t sXOver ; // Crossover settings
178+ preeq_t sPreEq ; // Pre-equalization settings
147179
148- plug::IPort *pBypass; // Bypass
149- plug::IPort *pGainIn; // Input gain
150- plug::IPort *pGainOut; // Output gain
180+ plug::IPort *pBypass; // Bypass
181+ plug::IPort *pGainIn; // Input gain
182+ plug::IPort *pGainOut; // Output gain
151183
152- uint8_t *pData; // Allocated data
184+ uint8_t *pData; // Allocated data
153185
154186 protected:
155- static bool set_filter_params (dspu::Equalizer * eq, uint32_t index, const dspu::filter_params_t * fp);
187+ static bool set_filter_params (dspu::Equalizer * eq, uint32_t index, const dspu::filter_params_t * fp);
188+ static void process_band (void *object, void *subject, size_t band, const float *data, size_t sample, size_t count);
189+ static size_t select_fft_rank (size_t sample_rate);
156190
157191 protected:
158- void do_destroy ();
159- void update_premix ();
160- void update_analyzer ();
161- void update_preeq ();
162- void bind_input_channels ();
163- void premix_channel (uint32_t channel, size_t count);
164- void output_preeq_meshes ();
192+ void do_destroy ();
193+ void update_premix ();
194+ void update_analyzer ();
195+ void update_preeq ();
196+ void update_xover ();
197+ void bind_input_channels ();
198+ void premix_channel (uint32_t channel, size_t count);
199+ void output_preeq_meshes ();
165200
166201 public:
167202 explicit deesser (const meta::plugin_t *meta);
@@ -172,15 +207,15 @@ namespace lsp
172207 deesser & operator = (const deesser &) = delete ;
173208 deesser & operator = (deesser &&) = delete ;
174209
175- virtual void init (plug::IWrapper *wrapper, plug::IPort **ports) override ;
176- virtual void destroy () override ;
210+ virtual void init (plug::IWrapper *wrapper, plug::IPort **ports) override ;
211+ virtual void destroy () override ;
177212
178213 public:
179- virtual void update_sample_rate (long sr) override ;
180- virtual void update_settings () override ;
181- virtual void process (size_t samples) override ;
182- virtual void ui_activated () override ;
183- virtual void dump (dspu::IStateDumper *v) const override ;
214+ virtual void update_sample_rate (long sr) override ;
215+ virtual void update_settings () override ;
216+ virtual void process (size_t samples) override ;
217+ virtual void ui_activated () override ;
218+ virtual void dump (dspu::IStateDumper *v) const override ;
184219 };
185220
186221 } /* namespace plugins */
0 commit comments