cannam@3: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
cannam@3: 
cannam@3: /*
cannam@3:     Vamp
cannam@3: 
cannam@3:     An API for audio analysis and feature extraction plugins.
cannam@3: 
cannam@3:     Centre for Digital Music, Queen Mary, University of London.
cannam@3:     Copyright 2006 Chris Cannam.
cannam@3:   
cannam@3:     Permission is hereby granted, free of charge, to any person
cannam@3:     obtaining a copy of this software and associated documentation
cannam@3:     files (the "Software"), to deal in the Software without
cannam@3:     restriction, including without limitation the rights to use, copy,
cannam@3:     modify, merge, publish, distribute, sublicense, and/or sell copies
cannam@3:     of the Software, and to permit persons to whom the Software is
cannam@3:     furnished to do so, subject to the following conditions:
cannam@3: 
cannam@3:     The above copyright notice and this permission notice shall be
cannam@3:     included in all copies or substantial portions of the Software.
cannam@3: 
cannam@3:     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cannam@3:     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
cannam@3:     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cannam@6:     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
cannam@3:     ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
cannam@3:     CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
cannam@3:     WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cannam@3: 
cannam@3:     Except as contained in this notice, the names of the Centre for
cannam@3:     Digital Music; Queen Mary, University of London; and Chris Cannam
cannam@3:     shall not be used in advertising or otherwise to promote the sale,
cannam@3:     use or other dealings in this Software without prior written
cannam@3:     authorization.
cannam@3: */
cannam@3: 
cannam@5: #ifndef _VAMP_PLUGIN_ADAPTER_H_
cannam@5: #define _VAMP_PLUGIN_ADAPTER_H_
cannam@3: 
cannam@230: #include <map>
cannam@10: #include <vamp/vamp.h>
cannam@10: 
cannam@3: #include "Plugin.h"
cannam@3: 
cannam@230: #include "plugguard.h"
cannam@233: _VAMP_SDK_PLUGSPACE_BEGIN(PluginAdapter.h)
cannam@3: 
cannam@3: namespace Vamp {
cannam@3: 
cannam@53: /**
cannam@76:  * \class PluginAdapterBase PluginAdapter.h <vamp-sdk/PluginAdapter.h>
cannam@76:  * 
cannam@53:  * PluginAdapter and PluginAdapterBase provide a wrapper class that a
cannam@53:  * plugin library can use to make its C++ Vamp::Plugin objects
cannam@53:  * available through the Vamp C API.
cannam@53:  * 
cannam@53:  * Almost all Vamp plugin libraries will want to make use of this.  To
cannam@53:  * do so, all they need to do is declare a PluginAdapter<T> for each
cannam@53:  * plugin class T in their library.  It's very simple, and you need to
cannam@53:  * know absolutely nothing about how it works in order to use it.
cannam@53:  * Just cut and paste from an existing plugin's discovery function.
cannam@76:  * \see vampGetPluginDescriptor
cannam@53:  */
cannam@53: 
cannam@3: class PluginAdapterBase
cannam@3: {
cannam@3: public:
cannam@3:     virtual ~PluginAdapterBase();
cannam@53: 
cannam@53:     /**
cannam@53:      * Return a VampPluginDescriptor describing the plugin that is
cannam@53:      * wrapped by this adapter.
cannam@53:      */
cannam@3:     const VampPluginDescriptor *getDescriptor();
cannam@3: 
cannam@3: protected:
cannam@3:     PluginAdapterBase();
cannam@3: 
cannam@3:     virtual Plugin *createPlugin(float inputSampleRate) = 0;
cannam@3: 
cannam@76:     class Impl;
cannam@76:     Impl *m_impl;
cannam@3: };
cannam@3: 
cannam@53: /**
cannam@76:  * \class PluginAdapter PluginAdapter.h <vamp-sdk/PluginAdapter.h>
cannam@76:  * 
cannam@53:  * PluginAdapter turns a PluginAdapterBase into a specific wrapper for
cannam@53:  * a particular plugin implementation.
cannam@53:  *
cannam@53:  * See PluginAdapterBase.
cannam@53:  */
cannam@53: 
cannam@3: template <typename P>
cannam@3: class PluginAdapter : public PluginAdapterBase
cannam@3: {
cannam@3: public:
cannam@3:     PluginAdapter() : PluginAdapterBase() { }
cannam@47:     virtual ~PluginAdapter() { }
cannam@3: 
cannam@3: protected:
cannam@3:     Plugin *createPlugin(float inputSampleRate) {
cannam@3:         P *p = new P(inputSampleRate);
cannam@3:         Plugin *plugin = dynamic_cast<Plugin *>(p);
cannam@3:         if (!plugin) {
cannam@3:             std::cerr << "ERROR: PluginAdapter::createPlugin: "
cannam@3:                       << "Template type is not a plugin!"
cannam@3:                       << std::endl;
cannam@3:             delete p;
cannam@3:             return 0;
cannam@3:         }
cannam@3:         return plugin;
cannam@3:     }
cannam@3: };
cannam@3:     
cannam@3: }
cannam@3: 
cannam@233: _VAMP_SDK_PLUGSPACE_END(PluginAdapter.h)
cannam@230: 
cannam@3: #endif
cannam@3: