annotate rdf/RDFExporter.cpp @ 1254:cbdd534f517a piper

Avoid assigning model resolution of 0 to models coming from plugins that report weirdly high output rates (symptom: data did not show up in edit layer data dialog, as the row/frame conversion failed)
author Chris Cannam
date Sat, 05 Nov 2016 10:40:22 +0000
parents a1cd5abcb38b
children 7a23dfe65d66
rev   line source
Chris@500 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@500 2
Chris@500 3 /*
Chris@500 4 Sonic Visualiser
Chris@500 5 An audio file viewer and annotation editor.
Chris@500 6 Centre for Digital Music, Queen Mary, University of London.
Chris@500 7 This file copyright 2008 QMUL.
Chris@500 8
Chris@500 9 This program is free software; you can redistribute it and/or
Chris@500 10 modify it under the terms of the GNU General Public License as
Chris@500 11 published by the Free Software Foundation; either version 2 of the
Chris@500 12 License, or (at your option) any later version. See the file
Chris@500 13 COPYING included with this distribution for more information.
Chris@500 14 */
Chris@500 15
Chris@500 16 #include "RDFExporter.h"
Chris@500 17 #include "RDFFeatureWriter.h"
Chris@500 18
Chris@500 19 #include <vamp-hostsdk/Plugin.h>
Chris@500 20
Chris@500 21 #include "data/model/Model.h"
Chris@500 22 #include "data/model/RegionModel.h"
Chris@500 23 #include "data/model/NoteModel.h"
Chris@500 24 #include "data/model/SparseOneDimensionalModel.h"
Chris@500 25 #include "data/model/SparseTimeValueModel.h"
Chris@500 26 #include "data/model/TextModel.h"
Chris@500 27 #include "data/model/EditableDenseThreeDimensionalModel.h"
Chris@500 28
Chris@500 29 bool
Chris@500 30 RDFExporter::canExportModel(Model *m)
Chris@500 31 {
Chris@500 32 if (dynamic_cast<RegionModel *>(m)) return true;
Chris@500 33 if (dynamic_cast<NoteModel *>(m)) return true;
Chris@500 34 if (dynamic_cast<SparseTimeValueModel *>(m)) return true;
Chris@500 35 if (dynamic_cast<SparseOneDimensionalModel *>(m)) return true;
Chris@500 36 if (dynamic_cast<TextModel *>(m)) return true;
Chris@753 37 // no, looks like we never implemented this one
Chris@753 38 // if (dynamic_cast<EditableDenseThreeDimensionalModel *>(m)) return true;
Chris@500 39 return false;
Chris@500 40 }
Chris@500 41
Chris@500 42 RDFExporter::RDFExporter(QString path, Model *m) :
Chris@500 43 m_path(path),
Chris@500 44 m_model(m),
Chris@500 45 m_fw(new RDFFeatureWriter())
Chris@500 46 {
Chris@500 47 map<string, string> params;
Chris@500 48 params["one-file"] = path.toStdString();
Chris@500 49 params["force"] = "true";
Chris@500 50 m_fw->setParameters(params);
Chris@500 51 }
Chris@500 52
Chris@500 53 RDFExporter::~RDFExporter()
Chris@500 54 {
Chris@500 55 delete m_fw;
Chris@500 56 }
Chris@500 57
Chris@500 58 bool
Chris@500 59 RDFExporter::isOK() const
Chris@500 60 {
Chris@500 61 return true;
Chris@500 62 }
Chris@500 63
Chris@500 64 QString
Chris@500 65 RDFExporter::getError() const
Chris@500 66 {
Chris@500 67 return "";
Chris@500 68 }
Chris@500 69
Chris@500 70 void
Chris@500 71 RDFExporter::write()
Chris@500 72 {
Chris@500 73 QString trackId; // nil
Chris@500 74 Transform transform; // nil
Chris@500 75 Vamp::Plugin::OutputDescriptor output; // nil
Chris@500 76 std::string summaryType; // nil
Chris@500 77
Chris@500 78 Vamp::Plugin::FeatureList features;
Chris@500 79 features.push_back(Vamp::Plugin::Feature());
Chris@500 80 Vamp::Plugin::Feature &f = features[0];
Chris@1040 81 sv_samplerate_t sr = m_model->getSampleRate();
Chris@500 82
Chris@500 83 {
Chris@500 84 RegionModel *m = dynamic_cast<RegionModel *>(m_model);
Chris@500 85 if (m) {
Chris@500 86 f.hasTimestamp = true;
Chris@500 87 f.hasDuration = true;
Chris@500 88 const RegionModel::PointList &pl(m->getPoints());
Chris@500 89 for (RegionModel::PointList::const_iterator i = pl.begin();
Chris@500 90 i != pl.end(); ++i) {
Chris@1040 91 f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime();
Chris@1040 92 f.duration = RealTime::frame2RealTime(i->duration, sr).toVampRealTime();
Chris@500 93 f.values.clear();
Chris@500 94 f.values.push_back(i->value);
Chris@500 95 f.label = i->label.toStdString();
Chris@500 96 m_fw->write(trackId, transform, output, features, summaryType);
Chris@500 97 }
Chris@500 98 return;
Chris@500 99 }
Chris@500 100 }
Chris@500 101 {
Chris@500 102 NoteModel *m = dynamic_cast<NoteModel *>(m_model);
Chris@500 103 if (m) {
Chris@500 104 f.hasTimestamp = true;
Chris@500 105 f.hasDuration = true;
Chris@500 106 const NoteModel::PointList &pl(m->getPoints());
Chris@500 107 for (NoteModel::PointList::const_iterator i = pl.begin();
Chris@500 108 i != pl.end(); ++i) {
Chris@1040 109 f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime();
Chris@1040 110 f.duration = RealTime::frame2RealTime(i->duration, sr).toVampRealTime();
Chris@500 111 f.values.clear();
Chris@500 112 f.values.push_back(i->value);
Chris@500 113 f.values.push_back(i->level);
Chris@500 114 f.label = i->label.toStdString();
Chris@500 115 m_fw->write(trackId, transform, output, features, summaryType);
Chris@500 116 }
Chris@500 117 return;
Chris@500 118 }
Chris@500 119 }
Chris@500 120 {
Chris@500 121 SparseOneDimensionalModel *m = dynamic_cast<SparseOneDimensionalModel *>(m_model);
Chris@500 122 if (m) {
Chris@500 123 f.hasTimestamp = true;
Chris@500 124 f.hasDuration = false;
Chris@500 125 const SparseOneDimensionalModel::PointList &pl(m->getPoints());
Chris@500 126 for (SparseOneDimensionalModel::PointList::const_iterator i = pl.begin();
Chris@500 127 i != pl.end(); ++i) {
Chris@1040 128 f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime();
Chris@500 129 f.values.clear();
Chris@500 130 f.label = i->label.toStdString();
Chris@500 131 m_fw->write(trackId, transform, output, features, summaryType);
Chris@500 132 }
Chris@500 133 return;
Chris@500 134 }
Chris@500 135 }
Chris@500 136 {
Chris@500 137 SparseTimeValueModel *m = dynamic_cast<SparseTimeValueModel *>(m_model);
Chris@500 138 if (m) {
Chris@500 139 f.hasTimestamp = true;
Chris@500 140 f.hasDuration = false;
Chris@500 141 const SparseTimeValueModel::PointList &pl(m->getPoints());
Chris@500 142 for (SparseTimeValueModel::PointList::const_iterator i = pl.begin();
Chris@500 143 i != pl.end(); ++i) {
Chris@1040 144 f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime();
Chris@500 145 f.values.clear();
Chris@500 146 f.values.push_back(i->value);
Chris@500 147 f.label = i->label.toStdString();
Chris@500 148 m_fw->write(trackId, transform, output, features, summaryType);
Chris@500 149 }
Chris@500 150 return;
Chris@500 151 }
Chris@500 152 }
Chris@500 153 {
Chris@500 154 TextModel *m = dynamic_cast<TextModel *>(m_model);
Chris@500 155 if (m) {
Chris@500 156 f.hasTimestamp = true;
Chris@500 157 f.hasDuration = false;
Chris@500 158 const TextModel::PointList &pl(m->getPoints());
Chris@510 159 m_fw->setFixedEventTypeURI("af:Text");
Chris@500 160 for (TextModel::PointList::const_iterator i = pl.begin();
Chris@500 161 i != pl.end(); ++i) {
Chris@1040 162 f.timestamp = RealTime::frame2RealTime(i->frame, sr).toVampRealTime();
Chris@500 163 f.values.clear();
Chris@500 164 f.values.push_back(i->height);
Chris@500 165 f.label = i->label.toStdString();
Chris@500 166 m_fw->write(trackId, transform, output, features, summaryType);
Chris@500 167 }
Chris@500 168 return;
Chris@500 169 }
Chris@500 170 }
Chris@500 171 }
Chris@500 172
Chris@500 173 QString
Chris@500 174 RDFExporter::getSupportedExtensions()
Chris@500 175 {
Chris@736 176 return "*.ttl *.n3";
Chris@500 177 }
Chris@500 178