annotate TestInputExtremes.cpp @ 1:d7ef749300ed

* Add tests for extremes of input audio
author cannam
date Thu, 12 Mar 2009 17:09:53 +0000
parents
children c9a4bd247497
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@1 48 #include <cmath>
cannam@1 49
cannam@1 50 Tester::TestRegistrar<TestNormalInput>
cannam@1 51 TestNormalInput::m_registrar("Normal input");
cannam@1 52
cannam@1 53 Tester::TestRegistrar<TestNoInput>
cannam@1 54 TestNoInput::m_registrar("Empty input");
cannam@1 55
cannam@1 56 Tester::TestRegistrar<TestShortInput>
cannam@1 57 TestShortInput::m_registrar("Short input");
cannam@1 58
cannam@1 59 Tester::TestRegistrar<TestSilentInput>
cannam@1 60 TestSilentInput::m_registrar("Absolutely silent input");
cannam@1 61
cannam@1 62 Tester::TestRegistrar<TestTooLoudInput>
cannam@1 63 TestTooLoudInput::m_registrar("Input beyond expected +/-1 range");
cannam@1 64
cannam@1 65 Tester::TestRegistrar<TestRandomInput>
cannam@1 66 TestRandomInput::m_registrar("Random input");
cannam@1 67
cannam@1 68 Test::Results
cannam@1 69 TestNormalInput::test(string key)
cannam@1 70 {
cannam@1 71 int rate = 44100;
cannam@1 72 auto_ptr<Plugin> p(load(key, rate));
cannam@1 73 Results r;
cannam@1 74 size_t channels, step, blocksize;
cannam@1 75 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 76 float **block = createBlock(channels, blocksize);
cannam@1 77 int idx = 0;
cannam@1 78 for (int i = 0; i < 200; ++i) {
cannam@1 79 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 80 for (size_t c = 0; c < channels; ++c) {
cannam@1 81 block[c][j] = sinf(float(idx) / 10.f);
cannam@1 82 }
cannam@1 83 ++idx;
cannam@1 84 }
cannam@1 85 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@1 86 p->process(block, timestamp);
cannam@1 87 }
cannam@1 88 destroyBlock(block, channels);
cannam@1 89 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 90 if (allFeaturesValid(fs)) {
cannam@1 91 r.push_back(success());
cannam@1 92 } else {
cannam@1 93 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 94 }
cannam@1 95 return r;
cannam@1 96 }
cannam@1 97
cannam@1 98 Test::Results
cannam@1 99 TestNoInput::test(string key)
cannam@1 100 {
cannam@1 101 auto_ptr<Plugin> p(load(key));
cannam@1 102 Results r;
cannam@1 103 size_t channels, step, block;
cannam@1 104 if (!initDefaults(p.get(), channels, step, block, r)) return r;
cannam@1 105 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 106 if (allFeaturesValid(fs)) {
cannam@1 107 r.push_back(success());
cannam@1 108 } else {
cannam@1 109 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 110 }
cannam@1 111 return r;
cannam@1 112 }
cannam@1 113
cannam@1 114 Test::Results
cannam@1 115 TestShortInput::test(string key)
cannam@1 116 {
cannam@1 117 int rate = 44100;
cannam@1 118 auto_ptr<Plugin> p(load(key, rate));
cannam@1 119 Results r;
cannam@1 120 size_t channels, step, blocksize;
cannam@1 121 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 122 float **block = createBlock(channels, blocksize);
cannam@1 123 int idx = 0;
cannam@1 124 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 125 for (size_t c = 0; c < channels; ++c) {
cannam@1 126 block[c][j] = sinf(float(idx) / 10.f);
cannam@1 127 }
cannam@1 128 ++idx;
cannam@1 129 }
cannam@1 130 p->process(block, RealTime::zeroTime);
cannam@1 131 destroyBlock(block, channels);
cannam@1 132 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 133 if (allFeaturesValid(fs)) {
cannam@1 134 r.push_back(success());
cannam@1 135 } else {
cannam@1 136 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 137 }
cannam@1 138 return r;
cannam@1 139 }
cannam@1 140
cannam@1 141 Test::Results
cannam@1 142 TestSilentInput::test(string key)
cannam@1 143 {
cannam@1 144 int rate = 44100;
cannam@1 145 auto_ptr<Plugin> p(load(key, rate));
cannam@1 146 Results r;
cannam@1 147 size_t channels, step, blocksize;
cannam@1 148 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 149 float **block = createBlock(channels, blocksize);
cannam@1 150 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 151 for (size_t c = 0; c < channels; ++c) {
cannam@1 152 block[c][j] = 0.f;
cannam@1 153 }
cannam@1 154 }
cannam@1 155 for (int i = 0; i < 200; ++i) {
cannam@1 156 RealTime timestamp = RealTime::frame2RealTime(i * blocksize, rate);
cannam@1 157 p->process(block, timestamp);
cannam@1 158 }
cannam@1 159 destroyBlock(block, channels);
cannam@1 160 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 161 if (allFeaturesValid(fs)) {
cannam@1 162 r.push_back(success());
cannam@1 163 } else {
cannam@1 164 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 165 }
cannam@1 166 return r;
cannam@1 167 }
cannam@1 168
cannam@1 169 Test::Results
cannam@1 170 TestTooLoudInput::test(string key)
cannam@1 171 {
cannam@1 172 int rate = 44100;
cannam@1 173 auto_ptr<Plugin> p(load(key, rate));
cannam@1 174 Results r;
cannam@1 175 size_t channels, step, blocksize;
cannam@1 176 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 177 float **block = createBlock(channels, blocksize);
cannam@1 178 int idx = 0;
cannam@1 179 for (int i = 0; i < 200; ++i) {
cannam@1 180 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 181 for (size_t c = 0; c < channels; ++c) {
cannam@1 182 block[c][j] = 1000.f * sinf(float(idx) / 10.f);
cannam@1 183 }
cannam@1 184 ++idx;
cannam@1 185 }
cannam@1 186 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@1 187 p->process(block, timestamp);
cannam@1 188 }
cannam@1 189 destroyBlock(block, channels);
cannam@1 190 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 191 if (allFeaturesValid(fs)) {
cannam@1 192 r.push_back(success());
cannam@1 193 } else {
cannam@1 194 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 195 }
cannam@1 196 return r;
cannam@1 197 }
cannam@1 198
cannam@1 199 Test::Results
cannam@1 200 TestRandomInput::test(string key)
cannam@1 201 {
cannam@1 202 int rate = 44100;
cannam@1 203 auto_ptr<Plugin> p(load(key, rate));
cannam@1 204 Results r;
cannam@1 205 size_t channels, step, blocksize;
cannam@1 206 if (!initDefaults(p.get(), channels, step, blocksize, r)) return r;
cannam@1 207 float **block = createBlock(channels, blocksize);
cannam@1 208 int idx = 0;
cannam@1 209 for (int i = 0; i < 100; ++i) {
cannam@1 210 for (size_t j = 0; j < blocksize; ++j) {
cannam@1 211 for (size_t c = 0; c < channels; ++c) {
cannam@1 212 block[c][j] = float(drand48() * 2.0 - 1.0);
cannam@1 213 }
cannam@1 214 ++idx;
cannam@1 215 }
cannam@1 216 RealTime timestamp = RealTime::frame2RealTime(idx, rate);
cannam@1 217 p->process(block, timestamp);
cannam@1 218 }
cannam@1 219 destroyBlock(block, channels);
cannam@1 220 Plugin::FeatureSet fs = p->getRemainingFeatures();
cannam@1 221 if (allFeaturesValid(fs)) {
cannam@1 222 r.push_back(success());
cannam@1 223 } else {
cannam@1 224 r.push_back(warning("plugin returned one or more NaN/inf values"));
cannam@1 225 }
cannam@1 226 return r;
cannam@1 227 }
cannam@1 228