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
|
/*
* Copyright (C) 2013-2016 Robin Gareus <robin@gareus.org>
* Copyright (C) 2006-2012 Fons Adriaensen <fons@linuxaudio.org>
* Copyright (C) 2006 Chris Cannam
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TruePeak_PLUGIN_H_
#define _TruePeak_PLUGIN_H_
#include <vamp-sdk/Plugin.h>
#include <pthread.h>
namespace TruePeakMeter {
class Resampler_mutex
{
private:
friend class Resampler_table;
Resampler_mutex (void) { pthread_mutex_init (&_mutex, 0); }
~Resampler_mutex (void) { pthread_mutex_destroy (&_mutex); }
void lock (void) { pthread_mutex_lock (&_mutex); }
void unlock (void) { pthread_mutex_unlock (&_mutex); }
pthread_mutex_t _mutex;
};
class Resampler_table
{
private:
Resampler_table (double fr, unsigned int hl, unsigned int np);
~Resampler_table (void);
friend class Resampler;
friend class VResampler;
Resampler_table *_next;
unsigned int _refc;
float *_ctab;
double _fr;
unsigned int _hl;
unsigned int _np;
static Resampler_table *create (double fr, unsigned int hl, unsigned int np);
static void destroy (Resampler_table *T);
static Resampler_table *_list;
static Resampler_mutex _mutex;
};
class Resampler
{
public:
Resampler (void);
~Resampler (void);
int setup (unsigned int fs_inp,
unsigned int fs_out,
unsigned int nchan,
unsigned int hlen);
int setup (unsigned int fs_inp,
unsigned int fs_out,
unsigned int nchan,
unsigned int hlen,
double frel);
void clear (void);
int reset (void);
int nchan (void) const { return _nchan; }
int filtlen (void) const { return inpsize (); } // Deprecated
int inpsize (void) const;
double inpdist (void) const;
int process (void);
unsigned int inp_count;
unsigned int out_count;
float const *inp_data;
float *out_data;
void *inp_list;
void *out_list;
private:
Resampler_table *_table;
unsigned int _nchan;
unsigned int _inmax;
unsigned int _index;
unsigned int _nread;
unsigned int _nzero;
unsigned int _phase;
unsigned int _pstep;
float *_buff;
void *_dummy [8];
};
class TruePeakdsp
{
public:
TruePeakdsp (void);
~TruePeakdsp (void);
void process (float const *, int n);
float read (void);
void read (float &m, float &p);
void reset (void);
bool init (float fsamp);
private:
float _m;
float _p;
bool _res;
bool _res_peak;
float *_buf;
Resampler _src;
};
}; // namespace TruePeakMeter
class VampTruePeak : public Vamp::Plugin
{
public:
VampTruePeak(float inputSampleRate);
virtual ~VampTruePeak();
size_t getMinChannelCount() const { return 1; }
size_t getMaxChannelCount() const { return 1; }
size_t getPreferredBlockSize () const { return 1024; }
bool initialise(size_t channels, size_t stepSize, size_t blockSize);
void reset();
InputDomain getInputDomain() const { return TimeDomain; }
std::string getIdentifier() const;
std::string getName() const;
std::string getDescription() const;
std::string getMaker() const;
int getPluginVersion() const;
std::string getCopyright() const;
OutputList getOutputDescriptors() const;
FeatureSet process(const float *const *inputBuffers,
Vamp::RealTime timestamp);
FeatureSet getRemainingFeatures();
protected:
size_t m_blockSize;
private:
TruePeakMeter::TruePeakdsp _meter;
Feature _above_m1;
unsigned int m_rate;
};
#endif
|