summaryrefslogtreecommitdiff
path: root/libs/vamp-plugins/TruePeak.h
blob: bebbe13763e018e7a8705b0132aaa38822fd07ba (plain)
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
/*
 * Copyright (C) 2006 Chris Cannam
 * Copyright (C) 2006-2012 Fons Adriaensen <fons@linuxaudio.org>
 * COPYRIGHT (C) 2012-2019 Robin Gareus <robin@gareus.org>
 *
 * 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 2 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, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#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