File: SpectralProcessor.h

package info (click to toggle)
lsp-plugins 1.2.5-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 91,856 kB
  • sloc: cpp: 427,831; xml: 57,779; makefile: 9,961; php: 1,005; sh: 18
file content (160 lines) | stat: -rw-r--r-- 6,165 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-dsp-units
 * Created on: 1 июл. 2020 г.
 *
 * lsp-dsp-units is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * lsp-dsp-units is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with lsp-dsp-units. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_DSP_UNITS_UTIL_SPECTRALPROCESSOR_H_
#define LSP_PLUG_IN_DSP_UNITS_UTIL_SPECTRALPROCESSOR_H_

#include <lsp-plug.in/dsp-units/version.h>
#include <lsp-plug.in/dsp-units/iface/IStateDumper.h>

namespace lsp
{
    namespace dspu
    {
        /**
         * Spectral processor callback function
         * @param object the object that handles callback
         * @param subject the subject that is used to handle callback
         * @param spectrum spectral data for processing (packed complex numbers)
         * @param rank the overall rank of the FFT transform (log2(size))
         */
        typedef void (* spectral_processor_func_t)(void *object, void *subject, float *spectrum, size_t rank);

        /**
         * Spectral processor class, performs spectral transform of the input signal
         * and launches callback function to process the signal spectrum
         */
        class LSP_DSP_UNITS_PUBLIC SpectralProcessor
        {
            private:
                SpectralProcessor & operator = (const SpectralProcessor &);
                SpectralProcessor(const SpectralProcessor &);

            protected:
                size_t                      nRank;      // Current FFT rank
                size_t                      nMaxRank;   // Maximum FFT rank
                float                       fPhase;     // Phase
                float                      *pWnd;       // Window function
                float                      *pOutBuf;    // Output buffer
                float                      *pInBuf;     // Input buffer
                float                      *pFftBuf;    // FFT buffer
                size_t                      nOffset;    // Read/Write offset
                uint8_t                    *pData;      // Data buffer
                bool                        bUpdate;    // Update flag

                // Bindings
                spectral_processor_func_t   pFunc;      // Function
                void                       *pObject;    // Object to operate
                void                       *pSubject;   // Subject to operate

            public:
                explicit SpectralProcessor();
                ~SpectralProcessor();

                /**
                 * Construct object
                 */
                void            construct();

                /**
                 * Initialize spectral processor
                 * @param max_rank maximum FFT rank
                 * @return status of operation
                 */
                bool            init(size_t max_rank);

                /**
                 * Destroy spectral processor
                 */
                void            destroy();

            public:
                /**
                 * Bind spectral processor to the handler
                 * @param func function to call
                 * @param object the target object to pass to the function
                 * @param subject the target subject to pass to the function
                 */
                void            bind(spectral_processor_func_t func, void *object, void *subject);

                /**
                 * Unbind spectral processor
                 */
                void            unbind();

                /**
                 * Check that spectral processor needs update
                 * @return true if spectral processor needs update
                 */
                inline bool     needs_update() const        { return bUpdate;           }

                /**
                 * Update settings of the spectral processor
                 */
                void            update_settings();

                /**
                 * Get the FFT rank
                 * @return FFT rank
                 */
                inline size_t   get_rank() const            { return nRank;             }

                /**
                 * Get processing phase
                 * @return processing phase
                 */
                inline float    phase() const               { return fPhase;            }

                /**
                 * Set processing phase
                 * @param phase the phase value between 0 and 1
                 */
                void            set_phase(float phase);

                /**
                 * Set the FFT rank
                 */
                void            set_rank(size_t rank);

                /**
                 * Get latency of the spectral processor
                 * @return latency of the spectral processor
                 */
                inline size_t   latency() const             { return 1 << nRank;        }

                /**
                 * Perform audio processing
                 * @param dst destination buffer
                 * @param src source buffer
                 * @param count number of samples to process
                 */
                void            process(float *dst, const float *src, size_t count);
    
                /**
                 * Dump the state
                 * @param dumper dumper
                 */
                void            dump(IStateDumper *v) const;
        };
    }
} /* namespace lsp */

#endif /* LSP_PLUG_IN_DSP_UNITS_UTIL_SPECTRALPROCESSOR_H_ */