| cannam@64 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| cannam@64 | 2 | 
| cannam@64 | 3 /* | 
| cannam@64 | 4     Vamp | 
| cannam@64 | 5 | 
| cannam@64 | 6     An API for audio analysis and feature extraction plugins. | 
| cannam@64 | 7 | 
| cannam@64 | 8     Centre for Digital Music, Queen Mary, University of London. | 
| cannam@71 | 9     Copyright 2006-2007 Chris Cannam and QMUL. | 
| cannam@64 | 10 | 
| cannam@64 | 11     Permission is hereby granted, free of charge, to any person | 
| cannam@64 | 12     obtaining a copy of this software and associated documentation | 
| cannam@64 | 13     files (the "Software"), to deal in the Software without | 
| cannam@64 | 14     restriction, including without limitation the rights to use, copy, | 
| cannam@64 | 15     modify, merge, publish, distribute, sublicense, and/or sell copies | 
| cannam@64 | 16     of the Software, and to permit persons to whom the Software is | 
| cannam@64 | 17     furnished to do so, subject to the following conditions: | 
| cannam@64 | 18 | 
| cannam@64 | 19     The above copyright notice and this permission notice shall be | 
| cannam@64 | 20     included in all copies or substantial portions of the Software. | 
| cannam@64 | 21 | 
| cannam@64 | 22     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
| cannam@64 | 23     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
| cannam@64 | 24     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
| cannam@64 | 25     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR | 
| cannam@64 | 26     ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | 
| cannam@64 | 27     CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 
| cannam@64 | 28     WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 
| cannam@64 | 29 | 
| cannam@64 | 30     Except as contained in this notice, the names of the Centre for | 
| cannam@64 | 31     Digital Music; Queen Mary, University of London; and Chris Cannam | 
| cannam@64 | 32     shall not be used in advertising or otherwise to promote the sale, | 
| cannam@64 | 33     use or other dealings in this Software without prior written | 
| cannam@64 | 34     authorization. | 
| cannam@64 | 35 */ | 
| cannam@64 | 36 | 
| cannam@64 | 37 #ifndef _VAMP_PLUGIN_WRAPPER_H_ | 
| cannam@64 | 38 #define _VAMP_PLUGIN_WRAPPER_H_ | 
| cannam@64 | 39 | 
| cannam@132 | 40 #include "vamp-sdk/Plugin.h" | 
| cannam@64 | 41 | 
| cannam@64 | 42 namespace Vamp { | 
| cannam@64 | 43 | 
| cannam@64 | 44 namespace HostExt { | 
| cannam@64 | 45 | 
| cannam@64 | 46 /** | 
| cannam@76 | 47  * \class PluginWrapper PluginWrapper.h <vamp-sdk/hostext/PluginWrapper.h> | 
| cannam@76 | 48  * | 
| cannam@64 | 49  * PluginWrapper is a simple base class for adapter plugins.  It takes | 
| cannam@64 | 50  * a pointer to a "to be wrapped" Vamp plugin on construction, and | 
| cannam@64 | 51  * provides implementations of all the Vamp plugin methods that simply | 
| cannam@64 | 52  * delegate through to the wrapped plugin.  A subclass can therefore | 
| cannam@64 | 53  * override only the methods that are meaningful for the particular | 
| cannam@64 | 54  * adapter. | 
| cannam@75 | 55  * | 
| cannam@76 | 56  * \note This class was introduced in version 1.1 of the Vamp plugin SDK. | 
| cannam@64 | 57  */ | 
| cannam@64 | 58 | 
| cannam@64 | 59 class PluginWrapper : public Plugin | 
| cannam@64 | 60 { | 
| cannam@64 | 61 public: | 
| cannam@64 | 62     virtual ~PluginWrapper(); | 
| cannam@64 | 63 | 
| cannam@64 | 64     bool initialise(size_t channels, size_t stepSize, size_t blockSize); | 
| cannam@64 | 65     void reset(); | 
| cannam@64 | 66 | 
| cannam@64 | 67     InputDomain getInputDomain() const; | 
| cannam@64 | 68 | 
| cannam@64 | 69     unsigned int getVampApiVersion() const; | 
| cannam@64 | 70     std::string getIdentifier() const; | 
| cannam@64 | 71     std::string getName() const; | 
| cannam@64 | 72     std::string getDescription() const; | 
| cannam@64 | 73     std::string getMaker() const; | 
| cannam@64 | 74     int getPluginVersion() const; | 
| cannam@64 | 75     std::string getCopyright() const; | 
| cannam@64 | 76 | 
| cannam@64 | 77     ParameterList getParameterDescriptors() const; | 
| cannam@64 | 78     float getParameter(std::string) const; | 
| cannam@64 | 79     void setParameter(std::string, float); | 
| cannam@64 | 80 | 
| cannam@64 | 81     ProgramList getPrograms() const; | 
| cannam@64 | 82     std::string getCurrentProgram() const; | 
| cannam@64 | 83     void selectProgram(std::string); | 
| cannam@64 | 84 | 
| cannam@64 | 85     size_t getPreferredStepSize() const; | 
| cannam@64 | 86     size_t getPreferredBlockSize() const; | 
| cannam@64 | 87 | 
| cannam@64 | 88     size_t getMinChannelCount() const; | 
| cannam@64 | 89     size_t getMaxChannelCount() const; | 
| cannam@64 | 90 | 
| cannam@64 | 91     OutputList getOutputDescriptors() const; | 
| cannam@64 | 92 | 
| cannam@64 | 93     FeatureSet process(const float *const *inputBuffers, RealTime timestamp); | 
| cannam@64 | 94 | 
| cannam@64 | 95     FeatureSet getRemainingFeatures(); | 
| cannam@64 | 96 | 
| cannam@190 | 97     /** | 
| cannam@190 | 98      * Return a pointer to the plugin wrapper of type WrapperType | 
| cannam@190 | 99      * surrounding this wrapper's plugin, if present. | 
| cannam@190 | 100      * | 
| cannam@190 | 101      * This is useful in situations where a plugin is wrapped by | 
| cannam@190 | 102      * multiple different wrappers (one inside another) and the host | 
| cannam@190 | 103      * wants to call some wrapper-specific function on one of the | 
| cannam@190 | 104      * layers without having to care about the order in which they are | 
| cannam@190 | 105      * wrapped.  For example, the plugin returned by | 
| cannam@190 | 106      * PluginLoader::loadPlugin may have more than one wrapper; if the | 
| cannam@190 | 107      * host wanted to query or fine-tune some property of one of them, | 
| cannam@190 | 108      * it would be hard to do so without knowing the order of the | 
| cannam@190 | 109      * wrappers.  This function therefore gives direct access to the | 
| cannam@190 | 110      * wrapper of a particular type. | 
| cannam@190 | 111      */ | 
| cannam@190 | 112     template <typename WrapperType> | 
| cannam@190 | 113     WrapperType *getWrapper() { | 
| cannam@190 | 114         WrapperType *w = dynamic_cast<WrapperType *>(this); | 
| cannam@190 | 115         if (w) return w; | 
| cannam@190 | 116         PluginWrapper *pw = dynamic_cast<PluginWrapper *>(m_plugin); | 
| cannam@190 | 117         if (pw) return pw->getWrapper<WrapperType>(); | 
| cannam@190 | 118         return 0; | 
| cannam@190 | 119     } | 
| cannam@190 | 120 | 
| cannam@64 | 121 protected: | 
| cannam@64 | 122     PluginWrapper(Plugin *plugin); // I take ownership of plugin | 
| cannam@64 | 123     Plugin *m_plugin; | 
| cannam@64 | 124 }; | 
| cannam@64 | 125 | 
| cannam@64 | 126 } | 
| cannam@64 | 127 | 
| cannam@64 | 128 } | 
| cannam@64 | 129 | 
| cannam@64 | 130 #endif |