Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: /* Chris@0: Sonic Annotator Chris@0: A utility for batch feature extraction from audio files. Chris@0: Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London. Chris@0: Copyright 2007-2008 QMUL. Chris@0: Chris@0: This program is free software; you can redistribute it and/or Chris@0: modify it under the terms of the GNU General Public License as Chris@0: published by the Free Software Foundation; either version 2 of the Chris@0: License, or (at your option) any later version. See the file Chris@0: COPYING included with this distribution for more information. Chris@0: */ Chris@0: Chris@0: #ifndef _FEATURE_EXTRACTION_MANAGER_H_ Chris@0: #define _FEATURE_EXTRACTION_MANAGER_H_ Chris@0: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: Chris@45: #include Chris@45: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: Chris@0: using std::vector; Chris@0: using std::set; Chris@0: using std::string; Chris@0: using std::pair; Chris@0: using std::map; Chris@0: Chris@0: class FeatureWriter; Chris@45: class AudioFileReader; Chris@0: Chris@0: class FeatureExtractionManager Chris@0: { Chris@0: public: Chris@263: FeatureExtractionManager(bool verbose); Chris@0: virtual ~FeatureExtractionManager(); Chris@0: Chris@0: void setChannels(int channels); Chris@331: void setDefaultSampleRate(sv_samplerate_t sampleRate); Chris@116: void setNormalise(bool normalise); Chris@0: Chris@0: bool setSummaryTypes(const set &summaryTypes, Chris@0: const Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries &boundaries); Chris@0: Chris@102: void setSummariesOnly(bool summariesOnly); Chris@102: Chris@0: bool addFeatureExtractor(Transform transform, Chris@0: const vector &writers); Chris@0: Chris@0: bool addFeatureExtractorFromFile(QString transformXmlFile, Chris@0: const vector &writers); Chris@0: Chris@0: bool addDefaultFeatureExtractor(TransformId transformId, Chris@0: const vector &writers); Chris@0: Chris@47: // Make a note of an audio or playlist file which will be passed Chris@47: // to extractFeatures later. Amongst other things, this may Chris@47: // initialise the default sample rate and channel count Chris@106: void addSource(QString audioSource, bool willMultiplex); Chris@47: Chris@47: // Extract features from the given audio or playlist file. If the Chris@47: // file is a playlist and force is true, continue extracting even Chris@47: // if a file in the playlist fails. Chris@112: void extractFeatures(QString audioSource); Chris@0: Chris@106: // Extract features from the given audio files, multiplexing into Chris@106: // a single "file" whose individual channels are mixdowns of the Chris@106: // supplied sources. Chris@106: void extractFeaturesMultiplexed(QStringList sources); Chris@106: Chris@0: private: Chris@263: bool m_verbose; Chris@263: Chris@0: // A plugin may have many outputs, so we can have more than one Chris@0: // transform requested for a single plugin. The things we want to Chris@0: // run in our process loop are plugins rather than their outputs, Chris@0: // so we maintain a map from the plugins to the transforms desired Chris@0: // of them and then iterate through this map Chris@0: Chris@0: typedef map > TransformWriterMap; Chris@0: typedef map PluginMap; Chris@0: PluginMap m_plugins; Chris@108: Chris@109: // When we run plugins, we want to run them in a known order so as Chris@109: // to get the same results on each run of Sonic Annotator with the Chris@109: // same transforms. But if we just iterate through our PluginMap, Chris@109: // we get them in an arbitrary order based on pointer Chris@109: // address. This vector provides an underlying order for us. Note Chris@109: // that the TransformWriterMap is consistently ordered (because Chris@109: // the key is a Transform which has a proper ordering) so using Chris@109: // this gives us a consistent order across the whole PluginMap Chris@109: vector m_orderedPlugins; Chris@109: Chris@0: // And a map back from transforms to their plugins. Note that Chris@0: // this is keyed by transform, not transform ID -- two differently Chris@0: // configured transforms with the same ID must use different Chris@0: // plugin instances. Chris@0: Chris@0: typedef map TransformPluginMap; Chris@0: TransformPluginMap m_transformPluginMap; Chris@0: Chris@0: // Cache the plugin output descriptors, mapping from plugin to a Chris@0: // map from output ID to output descriptor. Chris@0: typedef map OutputMap; Chris@0: typedef map PluginOutputMap; Chris@0: PluginOutputMap m_pluginOutputs; Chris@0: Chris@0: // Map from plugin output identifier to plugin output index Chris@0: typedef map OutputIndexMap; Chris@0: OutputIndexMap m_pluginOutputIndices; Chris@0: Chris@0: typedef set SummaryNameSet; Chris@233: SummaryNameSet m_summaries; // requested on command line for all transforms Chris@233: bool m_summariesOnly; // command line flag Chris@0: Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries m_boundaries; Chris@0: Chris@106: AudioFileReader *prepareReader(QString audioSource); Chris@106: Chris@106: void extractFeaturesFor(AudioFileReader *reader, QString audioSource); Chris@106: Chris@0: void writeSummaries(QString audioSource, Vamp::Plugin *); Chris@0: Chris@0: void writeFeatures(QString audioSource, Chris@0: Vamp::Plugin *, Chris@0: const Vamp::Plugin::FeatureSet &, Chris@0: Transform::SummaryType summaryType = Chris@0: Transform::NoSummary); Chris@31: Chris@31: void testOutputFiles(QString audioSource); Chris@0: void finish(); Chris@0: Chris@0: int m_blockSize; Chris@331: sv_samplerate_t m_defaultSampleRate; Chris@331: sv_samplerate_t m_sampleRate; Chris@0: int m_channels; Chris@116: bool m_normalise; Chris@45: Chris@45: QMap m_readyReaders; Chris@0: }; Chris@0: Chris@0: #endif