annotate runner/FeatureExtractionManager.h @ 302:1e6cee321cc0

Added tag sonic-annotator-1.5 for changeset 929e37acf0d9
author Chris Cannam
date Thu, 25 May 2017 15:01:41 +0100
parents 68dc2d99a5b1
children 0e866ef12d87
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 Sonic Annotator
Chris@0 5 A utility for batch feature extraction from audio files.
Chris@0 6 Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London.
Chris@0 7 Copyright 2007-2008 QMUL.
Chris@0 8
Chris@0 9 This program is free software; you can redistribute it and/or
Chris@0 10 modify it under the terms of the GNU General Public License as
Chris@0 11 published by the Free Software Foundation; either version 2 of the
Chris@0 12 License, or (at your option) any later version. See the file
Chris@0 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #ifndef _FEATURE_EXTRACTION_MANAGER_H_
Chris@0 17 #define _FEATURE_EXTRACTION_MANAGER_H_
Chris@0 18
Chris@0 19 #include <vector>
Chris@0 20 #include <set>
Chris@0 21 #include <string>
Chris@0 22
Chris@45 23 #include <QMap>
Chris@45 24
Chris@0 25 #include <vamp-hostsdk/Plugin.h>
Chris@0 26 #include <vamp-hostsdk/PluginSummarisingAdapter.h>
Chris@0 27 #include <transform/Transform.h>
Chris@0 28
Chris@0 29 using std::vector;
Chris@0 30 using std::set;
Chris@0 31 using std::string;
Chris@0 32 using std::pair;
Chris@0 33 using std::map;
Chris@0 34
Chris@0 35 class FeatureWriter;
Chris@45 36 class AudioFileReader;
Chris@0 37
Chris@0 38 class FeatureExtractionManager
Chris@0 39 {
Chris@0 40 public:
Chris@263 41 FeatureExtractionManager(bool verbose);
Chris@0 42 virtual ~FeatureExtractionManager();
Chris@0 43
Chris@0 44 void setChannels(int channels);
Chris@0 45 void setDefaultSampleRate(int sampleRate);
Chris@116 46 void setNormalise(bool normalise);
Chris@0 47
Chris@0 48 bool setSummaryTypes(const set<string> &summaryTypes,
Chris@0 49 const Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries &boundaries);
Chris@0 50
Chris@102 51 void setSummariesOnly(bool summariesOnly);
Chris@102 52
Chris@0 53 bool addFeatureExtractor(Transform transform,
Chris@0 54 const vector<FeatureWriter*> &writers);
Chris@0 55
Chris@0 56 bool addFeatureExtractorFromFile(QString transformXmlFile,
Chris@0 57 const vector<FeatureWriter*> &writers);
Chris@0 58
Chris@0 59 bool addDefaultFeatureExtractor(TransformId transformId,
Chris@0 60 const vector<FeatureWriter*> &writers);
Chris@0 61
Chris@47 62 // Make a note of an audio or playlist file which will be passed
Chris@47 63 // to extractFeatures later. Amongst other things, this may
Chris@47 64 // initialise the default sample rate and channel count
Chris@106 65 void addSource(QString audioSource, bool willMultiplex);
Chris@47 66
Chris@47 67 // Extract features from the given audio or playlist file. If the
Chris@47 68 // file is a playlist and force is true, continue extracting even
Chris@47 69 // if a file in the playlist fails.
Chris@112 70 void extractFeatures(QString audioSource);
Chris@0 71
Chris@106 72 // Extract features from the given audio files, multiplexing into
Chris@106 73 // a single "file" whose individual channels are mixdowns of the
Chris@106 74 // supplied sources.
Chris@106 75 void extractFeaturesMultiplexed(QStringList sources);
Chris@106 76
Chris@0 77 private:
Chris@263 78 bool m_verbose;
Chris@263 79
Chris@0 80 // A plugin may have many outputs, so we can have more than one
Chris@0 81 // transform requested for a single plugin. The things we want to
Chris@0 82 // run in our process loop are plugins rather than their outputs,
Chris@0 83 // so we maintain a map from the plugins to the transforms desired
Chris@0 84 // of them and then iterate through this map
Chris@0 85
Chris@0 86 typedef map<Transform, vector<FeatureWriter *> > TransformWriterMap;
Chris@0 87 typedef map<Vamp::Plugin *, TransformWriterMap> PluginMap;
Chris@0 88 PluginMap m_plugins;
Chris@108 89
Chris@109 90 // When we run plugins, we want to run them in a known order so as
Chris@109 91 // to get the same results on each run of Sonic Annotator with the
Chris@109 92 // same transforms. But if we just iterate through our PluginMap,
Chris@109 93 // we get them in an arbitrary order based on pointer
Chris@109 94 // address. This vector provides an underlying order for us. Note
Chris@109 95 // that the TransformWriterMap is consistently ordered (because
Chris@109 96 // the key is a Transform which has a proper ordering) so using
Chris@109 97 // this gives us a consistent order across the whole PluginMap
Chris@109 98 vector<Vamp::Plugin *> m_orderedPlugins;
Chris@109 99
Chris@0 100 // And a map back from transforms to their plugins. Note that
Chris@0 101 // this is keyed by transform, not transform ID -- two differently
Chris@0 102 // configured transforms with the same ID must use different
Chris@0 103 // plugin instances.
Chris@0 104
Chris@0 105 typedef map<Transform, Vamp::Plugin *> TransformPluginMap;
Chris@0 106 TransformPluginMap m_transformPluginMap;
Chris@0 107
Chris@0 108 // Cache the plugin output descriptors, mapping from plugin to a
Chris@0 109 // map from output ID to output descriptor.
Chris@0 110 typedef map<string, Vamp::Plugin::OutputDescriptor> OutputMap;
Chris@0 111 typedef map<Vamp::Plugin *, OutputMap> PluginOutputMap;
Chris@0 112 PluginOutputMap m_pluginOutputs;
Chris@0 113
Chris@0 114 // Map from plugin output identifier to plugin output index
Chris@0 115 typedef map<string, int> OutputIndexMap;
Chris@0 116 OutputIndexMap m_pluginOutputIndices;
Chris@0 117
Chris@0 118 typedef set<std::string> SummaryNameSet;
Chris@233 119 SummaryNameSet m_summaries; // requested on command line for all transforms
Chris@233 120 bool m_summariesOnly; // command line flag
Chris@0 121 Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries m_boundaries;
Chris@0 122
Chris@106 123 AudioFileReader *prepareReader(QString audioSource);
Chris@106 124
Chris@106 125 void extractFeaturesFor(AudioFileReader *reader, QString audioSource);
Chris@106 126
Chris@0 127 void writeSummaries(QString audioSource, Vamp::Plugin *);
Chris@0 128
Chris@0 129 void writeFeatures(QString audioSource,
Chris@0 130 Vamp::Plugin *,
Chris@0 131 const Vamp::Plugin::FeatureSet &,
Chris@0 132 Transform::SummaryType summaryType =
Chris@0 133 Transform::NoSummary);
Chris@31 134
Chris@31 135 void testOutputFiles(QString audioSource);
Chris@0 136 void finish();
Chris@0 137
Chris@0 138 int m_blockSize;
Chris@0 139 int m_defaultSampleRate;
Chris@0 140 int m_sampleRate;
Chris@0 141 int m_channels;
Chris@116 142 bool m_normalise;
Chris@45 143
Chris@45 144 QMap<QString, AudioFileReader *> m_readyReaders;
Chris@0 145
Chris@0 146 void print(Transform transform) const;
Chris@0 147 };
Chris@0 148
Chris@0 149 #endif