File: ports.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 (207 lines) | stat: -rw-r--r-- 6,659 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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
 * Copyright (C) 2021 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2021 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-plugin-fw
 * Created on: 1 нояб. 2021 г.
 *
 * lsp-plugin-fw 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-plugin-fw 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-plugin-fw. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_PLUG_FW_WRAP_LADSPA_PORTS_H_
#define LSP_PLUG_IN_PLUG_FW_WRAP_LADSPA_PORTS_H_

#include <lsp-plug.in/plug-fw/version.h>
#include <lsp-plug.in/plug-fw/meta/types.h>
#include <lsp-plug.in/plug-fw/meta/func.h>
#include <lsp-plug.in/plug-fw/plug.h>
#include <lsp-plug.in/stdlib/math.h>
#include <lsp-plug.in/dsp/dsp.h>

#define LADSPA_MAX_BLOCK_LENGTH             8192

namespace lsp
{
    namespace ladspa
    {
        // Specify port classes
        class Port: public plug::IPort
        {
            protected:
                float      *pData;

            public:
                explicit Port(const meta::port_t *meta) : IPort(meta), pData(NULL) {};
                virtual ~Port()
                {
                    pData   = NULL;
                }

            public:
                virtual void bind(void *data)
                {
                    pData   = reinterpret_cast<float *>(data);
                }
        };

        class AudioPort: public Port
        {
            protected:
                float      *pSanitized;
                float      *pBuffer;

            public:
                explicit AudioPort(const meta::port_t *meta) : Port(meta)
                {
                    pBuffer     = NULL;
                    pSanitized  = NULL;
                    if (meta::is_in_port(meta))
                    {
                        pSanitized = reinterpret_cast<float *>(::malloc(sizeof(float) * LADSPA_MAX_BLOCK_LENGTH));
                        if (pSanitized != NULL)
                            dsp::fill_zero(pSanitized, LADSPA_MAX_BLOCK_LENGTH);
                        else
                            lsp_warn("Failed to allocate sanitize buffer for port %s", pMetadata->id);
                    }
                }

                virtual ~AudioPort()
                {
                    if (pSanitized != NULL)
                    {
                        ::free(pSanitized);
                        pSanitized = NULL;
                    }
                };

            public:
                virtual void *buffer()      { return pBuffer; };

                // Should be always called at least once after bind() and before process() call
                void sanitize_before(size_t off, size_t samples)
                {
                    pBuffer     = &pData[off];

                    // Sanitize plugin's input if possible
                    if (pSanitized != NULL)
                    {
                        dsp::sanitize2(pSanitized, pBuffer, samples);
                        pBuffer     = pSanitized;
                    }
                }

                // Should be always called at least once after bind() and after process() call
                void sanitize_after(size_t off, size_t samples)
                {
                    // Sanitize plugin's output
                    if ((pBuffer != NULL) && (meta::is_out_port(pMetadata)))
                        dsp::sanitize1(pBuffer, samples); // Sanitize output of plugin

                    // Clear the buffer pointer
                    pBuffer    = NULL;
                }
        };

        class InputPort: public Port
        {
            private:
                float   fPrev;
                float   fValue;

            public:
                explicit InputPort(const meta::port_t *meta) : Port(meta)
                {
                    fPrev       = meta->start;
                    fValue      = meta->start;
                }

                virtual ~InputPort()
                {
                    fPrev       = 0.0f;
                    fValue      = 0.0f;
                }

            public:
                virtual float value()   { return fValue; }

                virtual bool pre_process(size_t samples)
                {
                    if (pData == NULL)
                        return false;

                    fValue      = limit_value(pMetadata, *pData);
                    return fPrev != fValue;
                }

                virtual void post_process(size_t samples) { fPrev = fValue; };
        };

        class OutputPort: public Port
        {
            protected:
                float fValue;

            public:
                explicit OutputPort(const meta::port_t *meta) : Port(meta)
                {
                    fValue      = meta->start;
                }

                virtual ~OutputPort()
                {
                    fValue      = 0.0f;
                };

            public:
                virtual float value()
                {
                    return      fValue;
                }

                virtual void set_value(float value)
                {
                    value       = limit_value(pMetadata, value);
                    if (pMetadata->flags & meta::F_PEAK)
                    {
                        if (fabs(fValue) < fabs(value))
                            fValue = value;
                    }
                    else
                        fValue = value;
                };

                virtual void bind(void *data)   { pData = reinterpret_cast<float *>(data); };

                virtual bool pre_process(size_t samples)
                {
                    if (pMetadata->flags & meta::F_PEAK)
                        fValue      = 0.0f;
                    return false;
                }

                virtual void post_process(size_t samples)
                {
                    if (pData != NULL)
                        *pData      = fValue;
                    if (pMetadata->flags & meta::F_PEAK)
                        fValue      = 0.0f;
                }
        };

    } /* namespace ladspa */
} /* namespace lsp */



#endif /* LSP_PLUG_IN_PLUG_FW_WRAP_LADSPA_PORTS_H_ */