comparison src/vamp-plugin-sdk-2.5/examples/ZeroCrossing.cpp @ 23:619f715526df sv_v2.1

Update Vamp plugin SDK to 2.5
author Chris Cannam
date Thu, 09 May 2013 10:52:46 +0100
parents
children
comparison
equal deleted inserted replaced
22:b07fe9e906dc 23:619f715526df
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 Vamp
5
6 An API for audio analysis and feature extraction plugins.
7
8 Centre for Digital Music, Queen Mary, University of London.
9 Copyright 2006 Chris Cannam.
10
11 Permission is hereby granted, free of charge, to any person
12 obtaining a copy of this software and associated documentation
13 files (the "Software"), to deal in the Software without
14 restriction, including without limitation the rights to use, copy,
15 modify, merge, publish, distribute, sublicense, and/or sell copies
16 of the Software, and to permit persons to whom the Software is
17 furnished to do so, subject to the following conditions:
18
19 The above copyright notice and this permission notice shall be
20 included in all copies or substantial portions of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 Except as contained in this notice, the names of the Centre for
31 Digital Music; Queen Mary, University of London; and Chris Cannam
32 shall not be used in advertising or otherwise to promote the sale,
33 use or other dealings in this Software without prior written
34 authorization.
35 */
36
37 #include "ZeroCrossing.h"
38
39 using std::string;
40 using std::vector;
41 using std::cerr;
42 using std::endl;
43
44 #include <cmath>
45
46 ZeroCrossing::ZeroCrossing(float inputSampleRate) :
47 Plugin(inputSampleRate),
48 m_stepSize(0),
49 m_previousSample(0.0f)
50 {
51 }
52
53 ZeroCrossing::~ZeroCrossing()
54 {
55 }
56
57 string
58 ZeroCrossing::getIdentifier() const
59 {
60 return "zerocrossing";
61 }
62
63 string
64 ZeroCrossing::getName() const
65 {
66 return "Zero Crossings";
67 }
68
69 string
70 ZeroCrossing::getDescription() const
71 {
72 return "Detect and count zero crossing points";
73 }
74
75 string
76 ZeroCrossing::getMaker() const
77 {
78 return "Vamp SDK Example Plugins";
79 }
80
81 int
82 ZeroCrossing::getPluginVersion() const
83 {
84 return 2;
85 }
86
87 string
88 ZeroCrossing::getCopyright() const
89 {
90 return "Freely redistributable (BSD license)";
91 }
92
93 bool
94 ZeroCrossing::initialise(size_t channels, size_t stepSize, size_t blockSize)
95 {
96 if (channels < getMinChannelCount() ||
97 channels > getMaxChannelCount()) return false;
98
99 m_stepSize = std::min(stepSize, blockSize);
100
101 return true;
102 }
103
104 void
105 ZeroCrossing::reset()
106 {
107 m_previousSample = 0.0f;
108 }
109
110 ZeroCrossing::OutputList
111 ZeroCrossing::getOutputDescriptors() const
112 {
113 OutputList list;
114
115 OutputDescriptor zc;
116 zc.identifier = "counts";
117 zc.name = "Zero Crossing Counts";
118 zc.description = "The number of zero crossing points per processing block";
119 zc.unit = "crossings";
120 zc.hasFixedBinCount = true;
121 zc.binCount = 1;
122 zc.hasKnownExtents = false;
123 zc.isQuantized = true;
124 zc.quantizeStep = 1.0;
125 zc.sampleType = OutputDescriptor::OneSamplePerStep;
126 list.push_back(zc);
127
128 zc.identifier = "zerocrossings";
129 zc.name = "Zero Crossings";
130 zc.description = "The locations of zero crossing points";
131 zc.unit = "";
132 zc.hasFixedBinCount = true;
133 zc.binCount = 0;
134 zc.sampleType = OutputDescriptor::VariableSampleRate;
135 zc.sampleRate = m_inputSampleRate;
136 list.push_back(zc);
137
138 return list;
139 }
140
141 ZeroCrossing::FeatureSet
142 ZeroCrossing::process(const float *const *inputBuffers,
143 Vamp::RealTime timestamp)
144 {
145 if (m_stepSize == 0) {
146 cerr << "ERROR: ZeroCrossing::process: "
147 << "ZeroCrossing has not been initialised"
148 << endl;
149 return FeatureSet();
150 }
151
152 float prev = m_previousSample;
153 size_t count = 0;
154
155 FeatureSet returnFeatures;
156
157 for (size_t i = 0; i < m_stepSize; ++i) {
158
159 float sample = inputBuffers[0][i];
160 bool crossing = false;
161
162 if (sample <= 0.0) {
163 if (prev > 0.0) crossing = true;
164 } else if (sample > 0.0) {
165 if (prev <= 0.0) crossing = true;
166 }
167
168 if (crossing) {
169 ++count;
170 Feature feature;
171 feature.hasTimestamp = true;
172 feature.timestamp = timestamp +
173 Vamp::RealTime::frame2RealTime(i, (size_t)m_inputSampleRate);
174 returnFeatures[1].push_back(feature);
175 }
176
177 prev = sample;
178 }
179
180 m_previousSample = prev;
181
182 Feature feature;
183 feature.hasTimestamp = false;
184 feature.values.push_back(float(count));
185
186 returnFeatures[0].push_back(feature);
187 return returnFeatures;
188 }
189
190 ZeroCrossing::FeatureSet
191 ZeroCrossing::getRemainingFeatures()
192 {
193 return FeatureSet();
194 }
195