annotate TestInputExtremes.cpp @ 26:eff1772ba397 vamp-plugin-tester-v1.0-erroneous

* More doc corrections to match error reporting updates in SDK * Don't return success after failing to load a plugin!
author cannam
date Tue, 22 Sep 2009 11:24:31 +0000
parents 019f6415950d
children 07144cdcbedf
rev   line source
cannam@1 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@1 2
cannam@1 3 /*
cannam@1 4 Vamp Plugin Tester
cannam@1 5 Chris Cannam, cannam@all-day-breakfast.com
cannam@1 6 Centre for Digital Music, Queen Mary, University of London.
cannam@1 7 Copyright 2009 QMUL.
cannam@1 8
cannam@1 9 This program loads a Vamp plugin and tests its susceptibility to a
cannam@1 10 number of common pitfalls, including handling of extremes of input
cannam@1 11 data. If you can think of any additional useful tests that are
cannam@1 12 easily added, please send them to me.
cannam@1 13
cannam@1 14 Permission is hereby granted, free of charge, to any person
cannam@1 15 obtaining a copy of this software and associated documentation
cannam@1 16 files (the "Software"), to deal in the Software without
cannam@1 17 restriction, including without limitation the rights to use, copy,
cannam@1 18 modify, merge, publish, distribute, sublicense, and/or sell copies
cannam@1 19 of the Software, and to permit persons to whom the Software is
cannam@1 20 furnished to do so, subject to the following conditions:
cannam@1 21
cannam@1 22 The above copyright notice and this permission notice shall be
cannam@1 23 included in all copies or substantial portions of the Software.
cannam@1 24
cannam@1 25 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cannam@1 26 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
cannam@1 27 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cannam@1 28 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
cannam@1 29 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
cannam@1 30 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
cannam@1 31 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cannam@1 32
cannam@1 33 Except as contained in this notice, the names of the Centre for
cannam@1 34 Digital Music; Queen Mary, University of London; and Chris Cannam
cannam@1 35 shall not be used in advertising or otherwise to promote the sale,
cannam@1 36 use or other dealings in this Software without prior written
cannam@1 37 authorization.
cannam@1 38 */
cannam@1 39
cannam@1 40 #include "TestInputExtremes.h"
cannam@1 41
cannam@1 42 #include <vamp-hostsdk/Plugin.h>
cannam@1 43 using namespace Vamp;
cannam@1 44
cannam@1 45 #include <memory>
cannam@1 46 using namespace std;
cannam@1 47
cannam@2 48 #include <cstdlib>
cannam@1 49 #include <cmath>
cannam@1 50
cannam@1 51 Tester::TestRegistrar<TestNormalInput>
cannam@4 52 TestNormalInput::m_registrar("C1 Normal input");
cannam@1 53
cannam@1 54 Tester::TestRegistrar<TestNoInput>
cannam@4 55 TestNoInput::m_registrar("C2 Empty input");
cannam@1 56
cannam@1 57 Tester::TestRegistrar<TestShortInput>
cannam@4 58 TestShortInput::m_registrar("C3 Short input");
cannam@1 59
cannam@1 60 Tester::TestRegistrar<TestSilentInput>
cannam@4 61 TestSilentInput::m_registrar("C4 Absolutely silent input");
cannam@1 62
cannam@1 63 Tester::TestRegistrar<TestTooLoudInput>
cannam@14 64 TestTooLoudInput::m_registrar("C5 Input beyond traditional +/-1 range");
cannam@1 65
cannam@1 66 Tester::TestRegistrar<TestRandomInput>
cannam@4 67 TestRandomInput::m_registrar("C6 Random input");
cannam@1 68
cannam@1 69 Test::Results
cannam@8 70 TestNormalInput::test(string key, Options options)
cannam@1 71 {
cannam@2 72 Plugin::FeatureSet f;
cannam@1 73 int rate = 44100;
cannam@1 74 auto_ptr<Plugin> p(load(key, rate));
cannam@1 75 Results r;
cannam@1 76 size_t channels, step, blocksize;
cannam@1 77 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 78 float **block = createBlock(channels, blocksize);
cannam@1 79 int idx = 0;
cannam@1 80 for (int i = 0; i < 200; ++i) {
cannam@1 81 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 82 for (size_t c = 0; c < channels; ++c) {
cannam@1 83 block[c][j] = sinf(float(idx) / 10.f);
cannam@1 84 }
cannam@1 85 ++idx;
cannam@1 86 }
cannam@1 87 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@2 88 Plugin::FeatureSet fs = p->process(block, timestamp);
cannam@2 89 appendFeatures(f, fs);
cannam@1 90 }
cannam@1 91 destroyBlock(block, channels);
cannam@1 92 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@2 93 appendFeatures(f, fs);
cannam@2 94 if (allFeaturesValid(f)) {
cannam@1 95 r.push_back(success());
cannam@1 96 } else {
cannam@17 97 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@8 98 if (options & Verbose) dump(f);
cannam@1 99 }
cannam@1 100 return r;
cannam@1 101 }
cannam@1 102
cannam@1 103 Test::Results
cannam@16 104 TestNoInput::test(string key, Options)
cannam@1 105 {
cannam@1 106 auto_ptr<Plugin> p(load(key));
cannam@1 107 Results r;
cannam@1 108 size_t channels, step, block;
cannam@1 109 if (!initDefaults(p.get(), channels, step, block, r)) return r;
cannam@1 110 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 111 if (allFeaturesValid(fs)) {
cannam@1 112 r.push_back(success());
cannam@1 113 } else {
cannam@17 114 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@1 115 }
cannam@1 116 return r;
cannam@1 117 }
cannam@1 118
cannam@1 119 Test::Results
cannam@8 120 TestShortInput::test(string key, Options options)
cannam@1 121 {
cannam@2 122 Plugin::FeatureSet f;
cannam@1 123 int rate = 44100;
cannam@1 124 auto_ptr<Plugin> p(load(key, rate));
cannam@1 125 Results r;
cannam@1 126 size_t channels, step, blocksize;
cannam@1 127 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 128 float **block = createBlock(channels, blocksize);
cannam@1 129 int idx = 0;
cannam@1 130 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 131 for (size_t c = 0; c < channels; ++c) {
cannam@1 132 block[c][j] = sinf(float(idx) / 10.f);
cannam@1 133 }
cannam@1 134 ++idx;
cannam@1 135 }
cannam@2 136 Plugin::FeatureSet fs = p->process(block, RealTime::zeroTime);
cannam@2 137 appendFeatures(f, fs);
cannam@1 138 destroyBlock(block, channels);
cannam@2 139 fs = p->getRemainingFeatures();
cannam@2 140 appendFeatures(f, fs);
cannam@2 141 if (allFeaturesValid(f)) {
cannam@1 142 r.push_back(success());
cannam@1 143 } else {
cannam@17 144 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@8 145 if (options & Verbose) dump(f);
cannam@1 146 }
cannam@1 147 return r;
cannam@1 148 }
cannam@1 149
cannam@1 150 Test::Results
cannam@8 151 TestSilentInput::test(string key, Options options)
cannam@1 152 {
cannam@2 153 Plugin::FeatureSet f;
cannam@1 154 int rate = 44100;
cannam@1 155 auto_ptr<Plugin> p(load(key, rate));
cannam@1 156 Results r;
cannam@1 157 size_t channels, step, blocksize;
cannam@1 158 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 159 float **block = createBlock(channels, blocksize);
cannam@1 160 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 161 for (size_t c = 0; c < channels; ++c) {
cannam@1 162 block[c][j] = 0.f;
cannam@1 163 }
cannam@1 164 }
cannam@1 165 for (int i = 0; i < 200; ++i) {
cannam@1 166 RealTime timestamp = RealTime::frame2RealTime(i * blocksize, rate);
cannam@2 167 Plugin::FeatureSet fs = p->process(block, timestamp);
cannam@2 168 appendFeatures(f, fs);
cannam@1 169 }
cannam@1 170 destroyBlock(block, channels);
cannam@1 171 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@2 172 appendFeatures(f, fs);
cannam@2 173 if (allFeaturesValid(f)) {
cannam@1 174 r.push_back(success());
cannam@1 175 } else {
cannam@17 176 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@8 177 if (options & Verbose) dump(f);
cannam@1 178 }
cannam@1 179 return r;
cannam@1 180 }
cannam@1 181
cannam@1 182 Test::Results
cannam@8 183 TestTooLoudInput::test(string key, Options options)
cannam@1 184 {
cannam@2 185 Plugin::FeatureSet f;
cannam@1 186 int rate = 44100;
cannam@1 187 auto_ptr<Plugin> p(load(key, rate));
cannam@1 188 Results r;
cannam@1 189 size_t channels, step, blocksize;
cannam@1 190 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 191 float **block = createBlock(channels, blocksize);
cannam@1 192 int idx = 0;
cannam@1 193 for (int i = 0; i < 200; ++i) {
cannam@1 194 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 195 for (size_t c = 0; c < channels; ++c) {
cannam@1 196 block[c][j] = 1000.f * sinf(float(idx) / 10.f);
cannam@1 197 }
cannam@1 198 ++idx;
cannam@1 199 }
cannam@1 200 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@2 201 Plugin::FeatureSet fs = p->process(block, timestamp);
cannam@2 202 appendFeatures(f, fs);
cannam@1 203 }
cannam@1 204 destroyBlock(block, channels);
cannam@1 205 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@2 206 appendFeatures(f, fs);
cannam@2 207 if (allFeaturesValid(f)) {
cannam@1 208 r.push_back(success());
cannam@1 209 } else {
cannam@17 210 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@8 211 if (options & Verbose) dump(f);
cannam@1 212 }
cannam@1 213 return r;
cannam@1 214 }
cannam@1 215
cannam@1 216 Test::Results
cannam@8 217 TestRandomInput::test(string key, Options options)
cannam@1 218 {
cannam@2 219 Plugin::FeatureSet f;
cannam@1 220 int rate = 44100;
cannam@1 221 auto_ptr<Plugin> p(load(key, rate));
cannam@1 222 Results r;
cannam@1 223 size_t channels, step, blocksize;
cannam@1 224 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 225 float **block = createBlock(channels, blocksize);
cannam@1 226 int idx = 0;
cannam@1 227 for (int i = 0; i < 100; ++i) {
cannam@1 228 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 229 for (size_t c = 0; c < channels; ++c) {
cannam@21 230 block[c][j] = (float(rand()) / RAND_MAX) * 2.0 - 1.0;
cannam@1 231 }
cannam@1 232 ++idx;
cannam@1 233 }
cannam@1 234 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@2 235 Plugin::FeatureSet fs = p->process(block, timestamp);
cannam@2 236 appendFeatures(f, fs);
cannam@1 237 }
cannam@1 238 destroyBlock(block, channels);
cannam@1 239 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@2 240 appendFeatures(f, fs);
cannam@2 241 if (allFeaturesValid(f)) {
cannam@1 242 r.push_back(success());
cannam@1 243 } else {
cannam@17 244 r.push_back(warning("Plugin returned one or more NaN/inf values"));
cannam@8 245 if (options & Verbose) dump(f);
cannam@1 246 }
cannam@1 247 return r;
cannam@1 248 }
cannam@1 249