11/*
2- * Copyright (C) 2024 Linux Studio Plugins Project <https://lsp-plug.in/>
3- * (C) 2024 Vladimir Sadovnikov <sadko4u@gmail.com>
2+ * Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
3+ * (C) 2025 Vladimir Sadovnikov <sadko4u@gmail.com>
44 *
55 * This file is part of lsp-plugins-spectrum-analyzer
66 * Created on: 22 июн. 2021 г.
2323#define PRIVATE_PLUGINS_SPECTRUM_ANALYZER_H_
2424
2525#include < lsp-plug.in/dsp-units/ctl/Counter.h>
26+ #include < lsp-plug.in/dsp-units/filters/Equalizer.h>
2627#include < lsp-plug.in/dsp-units/meters/Correlometer.h>
2728#include < lsp-plug.in/dsp-units/util/Analyzer.h>
2829#include < lsp-plug.in/plug-fw/plug.h>
@@ -39,44 +40,47 @@ namespace lsp
3940 protected:
4041 typedef struct sa_channel_t
4142 {
42- bool bOn; // Enabled flag
43- bool bFreeze; // Freeze flag
44- bool bSolo; // Soloing flag
45- bool bSend; // Send to UI flag
46- bool bMSSwitch; // Mid/side switch
47- float fGain ; // Makeup gain
48- float *vIn; // Input buffer pointer
49- float *vOut; // Output buffer pointer
50- float *vRet; // Return buffer
51- float *vBuffer; // Temporary buffer
52- float *vSpc[2 ]; // Spectrum data
53- float *vMax[2 ]; // Maximum data
43+ dspu::Equalizer sInspEq ; // Inspection equalizer
44+
45+ bool bOn; // Enabled flag
46+ bool bFreeze; // Freeze flag
47+ bool bSolo; // Soloing flag
48+ bool bSend; // Send to UI flag
49+ bool bMSSwitch; // Mid/side switch
50+ float fGain ; // Makeup gain
51+ float *vIn; // Input buffer pointer
52+ float *vOut; // Output buffer pointer
53+ float *vRet; // Return buffer
54+ float *vBuffer; // Temporary buffer
55+ float *vSpc[4 ]; // Spectrum data
56+ float *vMax[4 ]; // Maximum data
5457
5558 // Port references
56- plug::IPort *pIn; // Input samples
57- plug::IPort *pOut; // Output samples
58- plug::IPort *pRet; // Return
59- plug::IPort *pMSSwitch; // Mid/Side switch
60- plug::IPort *pOn; // FFT on
61- plug::IPort *pSolo; // Soloing flag
62- plug::IPort *pFreeze; // Freeze flag
63- plug::IPort *pShift; // Shift gain
59+ plug::IPort *pIn; // Input samples
60+ plug::IPort *pOut; // Output samples
61+ plug::IPort *pRet; // Return
62+ plug::IPort *pMSSwitch; // Mid/Side switch
63+ plug::IPort *pOn; // FFT on
64+ plug::IPort *pSolo; // Soloing flag
65+ plug::IPort *pFreeze; // Freeze flag
66+ plug::IPort *pShift; // Shift gain
6467 } sa_channel_t ;
6568
6669 typedef struct sa_spectralizer_t
6770 {
68- int32_t nPortId; // Last port identifier
69- int32_t nChannelId; // Channel identifier
71+ int32_t nPortId; // Last port identifier
72+ int32_t nChannelId; // Channel identifier
73+ bool bLinFreq; // Linear frequency
7074
71- plug::IPort *pPortId; // Port identifier
72- plug::IPort *pFBuffer; // Frame buffer port
75+ plug::IPort *pPortId; // Port identifier
76+ plug::IPort *pFBuffer; // Frame buffer port
7377 } sa_spectralizer_t ;
7478
7579 typedef struct sa_correlometer_t
7680 {
77- dspu::Correlometer sCorr ; // Correlometer
78- float fCorrelation ; // Measured correlation value
79- plug::IPort *pCorrelometer; // Correlometer output value
81+ dspu::Correlometer sCorr ; // Correlometer
82+ float fCorrelation ; // Measured correlation value
83+ plug::IPort *pCorrelometer; // Correlometer output value
8084 } sa_correlometer_t ;
8185
8286 enum mode_t
@@ -91,97 +95,111 @@ namespace lsp
9195
9296 enum flags_t
9397 {
94- F_MASTERING = 1 << 0 ,
95- F_SMOOTH_LOG = 1 << 1 ,
96- F_LOG_SCALE = 1 << 2 ,
97- F_BOOST = 1 << 3
98+ F_MASTERING = 1 << 0 ,
99+ F_SMOOTH_LOG = 1 << 1 ,
100+ F_LOG_SCALE = 1 << 2 ,
101+ F_BOOST = 1 << 3 ,
102+ F_LIN_FREQ = 1 << 4 ,
98103 };
99104
100105 protected:
101- dspu::Analyzer sAnalyzer ;
102- dspu::Counter sCounter ;
103- uint32_t nChannels;
104- uint32_t nCorrelometers;
105- sa_channel_t *vChannels;
106- sa_correlometer_t *vCorrelometers; // Available correlometers
107- float **vAnalyze; // Analysis buffers
108- float *vFrequences;
109- float *vMaxValues[2 ]; // Maximum value tracking
110- float *vMFrequences;
111- uint32_t *vIndexes;
112- uint8_t *pData;
113-
114- bool bBypass;
115- size_t nChannel;
116- float fSelector ;
117- float fMinFreq ;
118- float fMaxFreq ;
119- float fReactivity ; // Reactivity
120- float fTau ; // Time constant (dependent on reactivity)
121- float fPreamp ; // Preamplification level
122- float fZoom ; // Zoom
123- mode_t enMode;
124- bool bLogScale;
125- bool bMSSwitch; // Mid/Side switch for stereo mode
126-
127- float fWndState ; // Variable to save the state of WINDOW
128- float fEnvState ; // Variable to save the state of ENVELOPE
129-
130- plug::IPort *pBypass;
131- plug::IPort *pMode;
132- plug::IPort *pTolerance;
133- plug::IPort *pWindow;
134- plug::IPort *pEnvelope;
135- plug::IPort *pPreamp;
136- plug::IPort *pZoom;
137- plug::IPort *pReactivity;
138- plug::IPort *pChannel;
139- plug::IPort *pSelector;
140- plug::IPort *pFrequency;
141- plug::IPort *pLevel;
142- plug::IPort *pLogScale;
143- plug::IPort *pFftData;
144- plug::IPort *pMSSwitch;
145-
146- plug::IPort *pFreeze;
147- plug::IPort *pMaxReset; // Reset maximum values
148- plug::IPort *pSpp;
149- sa_spectralizer_t vSpc[2 ];
150-
151- core::IDBuffer *pIDisplay; // Inline display buffer
106+ dspu::Analyzer sAnalyzer ;
107+ dspu::Counter sCounter ;
108+ uint32_t nChannels;
109+ uint32_t nCorrelometers;
110+ sa_channel_t *vChannels;
111+ sa_correlometer_t *vCorrelometers; // Available correlometers
112+ dspu::filter_params_t vFP[2 ]; // Filter parameters (current, new)
113+ float **vAnalyze; // Analysis buffers
114+ float *vFrequences[2 ]; // Logarithmic frequencies, linear frequencies
115+ float *vMaxValues[4 ]; // Maximum value tracking
116+ float *vMFrequences;
117+ uint32_t *vIndexes[2 ]; // Logarithimic indexes, linear indexes
118+ uint8_t *pData;
119+
120+ bool bBypass;
121+ uint32_t nChannel;
122+ float fSelector ;
123+ float fMinFreq ;
124+ float fMaxFreq ;
125+ float fReactivity ; // Reactivity
126+ float fTau ; // Time constant (dependent on reactivity)
127+ float fPreamp ; // Preamplification level
128+ float fZoom ; // Zoom
129+ mode_t enMode;
130+ bool bLogScale;
131+ bool bLinFreq; // Linear frequency
132+ bool bMSSwitch; // Mid/Side switch for stereo mode
133+ bool bInspOn; // Frequency inspection is active
134+ bool bSyncInspFilter; // Sync inspect filter characteristics
135+ bool bSmoothInspFilter; // Smooth inspect filter
136+
137+ float fWndState ; // Variable to save the state of WINDOW
138+ float fEnvState ; // Variable to save the state of ENVELOPE
139+
140+ plug::IPort *pBypass;
141+ plug::IPort *pMode;
142+ plug::IPort *pTolerance;
143+ plug::IPort *pWindow;
144+ plug::IPort *pEnvelope;
145+ plug::IPort *pPreamp;
146+ plug::IPort *pZoom;
147+ plug::IPort *pReactivity;
148+ plug::IPort *pChannel;
149+ plug::IPort *pSelector;
150+ plug::IPort *pInspSwitch;
151+ plug::IPort *pInspRange;
152+ plug::IPort *pFrequency;
153+ plug::IPort *pLevel;
154+ plug::IPort *pLogScale;
155+ plug::IPort *pLinFreq;
156+ plug::IPort *pFftData;
157+ plug::IPort *pInspMesh;
158+ plug::IPort *pMSSwitch;
159+
160+ plug::IPort *pFreeze;
161+ plug::IPort *pMaxReset; // Reset maximum values
162+ plug::IPort *pSpp;
163+ sa_spectralizer_t vSpc[2 ];
164+
165+ core::IDBuffer *pIDisplay; // Inline display buffer
152166
153167 protected:
154- bool create_channels (size_t channels);
155- mode_t decode_mode (size_t mode);
156- void do_destroy ();
168+ bool create_channels (size_t channels);
169+ mode_t decode_mode (size_t mode);
170+ void do_destroy ();
157171
158- void update_multiple_settings ();
159- void update_x2_settings (ssize_t ch1, ssize_t ch2);
160- void update_spectralizer_x2_settings (ssize_t ch1, ssize_t ch2);
172+ void update_multiple_settings ();
173+ void update_x2_settings (ssize_t ch1, ssize_t ch2);
174+ void update_spectralizer_x2_settings (ssize_t ch1, ssize_t ch2);
161175
162- void process_multiple ();
163- void process_spectralizer ();
164- void get_spectrum (float *dst, size_t channel, size_t flags);
165- void measure_correlation (size_t count);
166- void prepare_buffers (size_t count);
176+ void analyze_data (size_t samples);
177+ void pass_signal (size_t samples);
178+ void process_multiple ();
179+ void process_spectralizer ();
180+ void get_spectrum (float *dst, size_t channel, size_t flags);
181+ void measure_correlation (size_t count);
182+ void prepare_buffers (size_t count);
167183
168- void output_spectrum ();
184+ void output_spectrum ();
185+ void output_inpect_filter ();
169186
170187 public:
171188 explicit spectrum_analyzer (const meta::plugin_t *metadata);
172189 virtual ~spectrum_analyzer () override ;
173190
174191 public:
175- virtual void init (plug::IWrapper *wrapper, plug::IPort **ports) override ;
176- virtual void destroy () override ;
192+ virtual void init (plug::IWrapper *wrapper, plug::IPort **ports) override ;
193+ virtual void destroy () override ;
177194
178- virtual void update_settings () override ;
179- virtual void update_sample_rate (long sr) override ;
195+ virtual void update_settings () override ;
196+ virtual void update_sample_rate (long sr) override ;
180197
181- virtual void process (size_t samples) override ;
182- virtual bool inline_display (plug::ICanvas *cv, size_t width, size_t height) override ;
198+ virtual void process (size_t samples) override ;
199+ virtual bool inline_display (plug::ICanvas *cv, size_t width, size_t height) override ;
200+ virtual void ui_activated () override ;
183201
184- virtual void dump (dspu::IStateDumper *v) const override ;
202+ virtual void dump (dspu::IStateDumper *v) const override ;
185203 };
186204
187205 } /* namespace plugins */
0 commit comments