annotate data/model/test/MockWaveModel.cpp @ 1784:4eac4bf35b45

More graceful handling of failure to construct FFT models in the case where the source model has already been deleted before this occurs
author Chris Cannam
date Tue, 17 Sep 2019 11:21:33 +0100
parents a12fd0456f0c
children
rev   line source
Chris@1086 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1086 2
Chris@1086 3 /*
Chris@1086 4 Sonic Visualiser
Chris@1086 5 An audio file viewer and annotation editor.
Chris@1086 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1086 7 This file copyright 2006 Chris Cannam.
Chris@1086 8
Chris@1086 9 This program is free software; you can redistribute it and/or
Chris@1086 10 modify it under the terms of the GNU General Public License as
Chris@1086 11 published by the Free Software Foundation; either version 2 of the
Chris@1086 12 License, or (at your option) any later version. See the file
Chris@1086 13 COPYING included with this distribution for more information.
Chris@1086 14 */
Chris@1086 15
Chris@1086 16 #include "MockWaveModel.h"
Chris@1086 17
Chris@1137 18 #include <cmath>
Chris@1137 19
Chris@1086 20 using namespace std;
Chris@1086 21
Chris@1088 22 MockWaveModel::MockWaveModel(vector<Sort> sorts, int length, int pad)
Chris@1086 23 {
Chris@1086 24 for (auto sort: sorts) {
Chris@1429 25 m_data.push_back(generate(sort, length, pad));
Chris@1086 26 }
Chris@1086 27 }
Chris@1086 28
Chris@1326 29 floatvec_t
Chris@1096 30 MockWaveModel::getData(int channel, sv_frame_t start, sv_frame_t count) const
Chris@1086 31 {
Chris@1086 32 sv_frame_t i = 0;
Chris@1086 33
Chris@1091 34 // cerr << "MockWaveModel::getData(" << channel << "," << start << "," << count << "): ";
Chris@1086 35
Chris@1326 36 floatvec_t data;
Chris@1096 37
Chris@1086 38 while (i < count) {
Chris@1429 39 sv_frame_t idx = start + i;
Chris@1429 40 if (!in_range_for(m_data[channel], idx)) break;
Chris@1429 41 data.push_back(m_data[channel][idx]);
Chris@1429 42 // cerr << data[i] << " ";
Chris@1429 43 ++i;
Chris@1086 44 }
Chris@1086 45
Chris@1091 46 // cerr << endl;
Chris@1086 47
Chris@1096 48 return data;
Chris@1086 49 }
Chris@1086 50
Chris@1326 51 vector<floatvec_t>
Chris@1086 52 MockWaveModel::getMultiChannelData(int fromchannel, int tochannel,
Chris@1429 53 sv_frame_t start, sv_frame_t count) const
Chris@1086 54 {
Chris@1326 55 vector<floatvec_t> data(tochannel - fromchannel + 1);
Chris@1096 56
Chris@1086 57 for (int c = fromchannel; c <= tochannel; ++c) {
dev@1433 58 data[c] = getData(c, start, count);
Chris@1086 59 }
Chris@1086 60
Chris@1096 61 return data;
Chris@1086 62 }
Chris@1086 63
Chris@1086 64 vector<float>
Chris@1088 65 MockWaveModel::generate(Sort sort, int length, int pad) const
Chris@1086 66 {
Chris@1086 67 vector<float> data;
Chris@1086 68
Chris@1088 69 for (int i = 0; i < pad; ++i) {
Chris@1088 70 data.push_back(0.f);
Chris@1088 71 }
Chris@1088 72
Chris@1086 73 for (int i = 0; i < length; ++i) {
Chris@1086 74
Chris@1429 75 double v = 0.0;
Chris@1429 76
Chris@1429 77 switch (sort) {
Chris@1429 78 case DC: v = 1.0; break;
Chris@1429 79 case Sine: v = sin((2.0 * M_PI / 8.0) * i); break;
Chris@1429 80 case Cosine: v = cos((2.0 * M_PI / 8.0) * i); break;
Chris@1429 81 case Nyquist: v = (i % 2) * 2 - 1; break;
Chris@1429 82 case Dirac: v = (i == 0) ? 1.0 : 0.0; break;
Chris@1429 83 }
Chris@1086 84
Chris@1429 85 data.push_back(float(v));
Chris@1086 86 }
Chris@1086 87
Chris@1088 88 for (int i = 0; i < pad; ++i) {
Chris@1088 89 data.push_back(0.f);
Chris@1088 90 }
Chris@1088 91
Chris@1086 92 return data;
Chris@1086 93 }
Chris@1086 94