Skip to content

Commit f15868f

Browse files
committed
Release 1.0.32
* Added frequency inspection mode. * Added support of linear frequency scale. * Updated build scripts and dependencies.
2 parents ab4276d + 1ed84ab commit f15868f

27 files changed

Lines changed: 1635 additions & 620 deletions

.github/workflows/build.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,17 @@ jobs:
221221
shell: msys2 {0}
222222
run: make VERBOSE=1
223223

224+
macos_stable:
225+
runs-on: macos-latest
226+
steps:
227+
- name: Update repositories
228+
run: brew update
229+
- name: Install dependencies
230+
run: brew install make pkgconf cairo freetype
231+
- uses: actions/checkout@v3
232+
- name: Configure project
233+
run: gmake config STRICT=1 VERBOSE=1 FEATURES='lv2 ui'
234+
- name: Fetch project dependencies
235+
run: gmake fetch
236+
- name: Build project
237+
run: gmake VERBOSE=1

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
* RECENT CHANGES
33
*******************************************************************************
44

5+
=== 1.0.32 ===
6+
* Added frequency inspection mode.
7+
* Added support of linear frequency scale.
8+
* Updated build scripts and dependencies.
9+
510
=== 1.0.31 ===
611
* Updated build scripts and dependencies.
712

dependencies.mk

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,13 @@ endif
117117
# MacOS dependencies
118118
MACOS_DEPENDENCIES = \
119119
LIBAUDIOTOOLBOX \
120+
LIBCAIRO \
121+
LIBCOCOA \
120122
LIBCOREFOUNDATION \
123+
LIBFONTCONFIG \
124+
LIBFREETYPE \
121125
LIBICONV \
122-
LIBJACK
126+
LIBJACK
123127

124128
MACOS_TEST_DEPENDENCIES =
125129

include/private/meta/spectrum_analyzer.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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 г.
@@ -82,6 +82,16 @@ namespace lsp
8282
static constexpr float ZOOM_DFL = GAIN_AMP_0_DB;
8383
static constexpr float ZOOM_STEP = 0.025f;
8484

85+
static constexpr float INSPECT_MIN = 0.0f;
86+
static constexpr float INSPECT_MAX = 5.0f;
87+
static constexpr float INSPECT_DFL = 1.0f;
88+
static constexpr float INSPECT_STEP = 0.005f;
89+
90+
static constexpr float WIDTH_MIN = 0.0f;
91+
static constexpr float WIDTH_MAX = 12.0f;
92+
static constexpr float WIDTH_DFL = 4.0f;
93+
static constexpr float WIDTH_STEP = 0.002f;
94+
8595
static constexpr float PREAMP_DFL = 1.0;
8696

8797
static constexpr size_t REFRESH_RATE = 20;

include/private/plugins/spectrum_analyzer.h

Lines changed: 121 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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 г.
@@ -23,6 +23,7 @@
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

Comments
 (0)