To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / vamp-hostsdk / PluginLoader.h

History | View | Annotate | Download (10.4 KB)

1
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2

    
3
/*
4
    Vamp
5

6
    An API for audio analysis and feature extraction plugins.
7

8
    Centre for Digital Music, Queen Mary, University of London.
9
    Copyright 2006-2009 Chris Cannam and QMUL.
10
  
11
    Permission is hereby granted, free of charge, to any person
12
    obtaining a copy of this software and associated documentation
13
    files (the "Software"), to deal in the Software without
14
    restriction, including without limitation the rights to use, copy,
15
    modify, merge, publish, distribute, sublicense, and/or sell copies
16
    of the Software, and to permit persons to whom the Software is
17
    furnished to do so, subject to the following conditions:
18

19
    The above copyright notice and this permission notice shall be
20
    included in all copies or substantial portions of the Software.
21

22
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
26
    ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
27
    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29

30
    Except as contained in this notice, the names of the Centre for
31
    Digital Music; Queen Mary, University of London; and Chris Cannam
32
    shall not be used in advertising or otherwise to promote the sale,
33
    use or other dealings in this Software without prior written
34
    authorization.
35
*/
36

    
37
#ifndef _VAMP_PLUGIN_LOADER_H_
38
#define _VAMP_PLUGIN_LOADER_H_
39

    
40
#include <vector>
41
#include <string>
42
#include <map>
43

    
44
#include "hostguard.h"
45
#include "PluginWrapper.h"
46

    
47
_VAMP_SDK_HOSTSPACE_BEGIN(PluginLoader.h)
48

    
49
namespace Vamp {
50

    
51
class Plugin;
52

    
53
namespace HostExt {
54

    
55
/**
56
 * \class PluginLoader PluginLoader.h <vamp-hostsdk/PluginLoader.h>
57
 * 
58
 * Vamp::HostExt::PluginLoader is a convenience class for discovering
59
 * and loading Vamp plugins using the typical plugin-path, library
60
 * naming, and categorisation conventions described in the Vamp SDK
61
 * documentation.  This class is intended to greatly simplify the task
62
 * of becoming a Vamp plugin host for any C++ application.
63
 * 
64
 * Hosts are not required by the Vamp specification to use the same
65
 * plugin search path and naming conventions as implemented by this
66
 * class, and are certainly not required to use this actual class.
67
 * But we do strongly recommend it.
68
 *
69
 * This class is not thread-safe; use it from a single application
70
 * thread, or guard access to it with a mutex.
71
 *
72
 * \note This class was introduced in version 1.1 of the Vamp plugin SDK.
73
 */
74

    
75
class PluginLoader
76
{
77
public:
78
    /**
79
     * Obtain a pointer to the singleton instance of PluginLoader.
80
     * Use this to obtain your loader object.
81
     */
82
    static PluginLoader *getInstance();
83

    
84
    /**
85
     * PluginKey is a string type that is used to identify a plugin
86
     * uniquely within the scope of "the current system".  It consists
87
     * of the lower-cased base name of the plugin library, a colon
88
     * separator, and the identifier string for the plugin.  It is
89
     * only meaningful in the context of a given plugin path (the one
90
     * returned by PluginHostAdapter::getPluginPath()).
91
     *
92
     * Use composePluginKey() to construct a plugin key from a known
93
     * plugin library name and identifier.
94
     *
95
     * Note: the fact that the library component of the key is
96
     * lower-cased implies that library names are matched
97
     * case-insensitively by the PluginLoader class, regardless of the
98
     * case sensitivity of the underlying filesystem.  (Plugin
99
     * identifiers _are_ case sensitive, however.)  Also, it is not
100
     * possible to portably extract a working library name from a
101
     * plugin key, as the result may fail on case-sensitive
102
     * filesystems.  Use getLibraryPathForPlugin() instead.
103
     */
104
    typedef std::string PluginKey;
105

    
106
    /**
107
     * PluginKeyList is a sequence of plugin keys, such as returned by
108
     * listPlugins().
109
     */
110
    typedef std::vector<PluginKey> PluginKeyList;
111

    
112
    /**
113
     * PluginCategoryHierarchy is a sequence of general->specific
114
     * category names, as may be associated with a single plugin.
115
     * This sequence describes the location of a plugin within a
116
     * category forest, containing the human-readable names of the
117
     * plugin's category tree root, followed by each of the nodes down
118
     * to the leaf containing the plugin.
119
     *
120
     * \see getPluginCategory()
121
     */
122
    typedef std::vector<std::string> PluginCategoryHierarchy;
123

    
124
    /**
125
     * Search for all available Vamp plugins, and return a list of
126
     * them in the order in which they were found.
127
     */
128
    PluginKeyList listPlugins();
129

    
130
    /**
131
     * Search for available Vamp plugins in libraries with the given
132
     * library names, and return a list of them in the order in which
133
     * they were found. Do not attempt to load any plugin libraries
134
     * other than those named.
135
     *
136
     * The library names should be supplied without path or
137
     * suffix. For example, use "vamp-example-plugins" to find plugins
138
     * in /install/path/of/vamp-example-plugins.dll (or .so etc). This
139
     * is the same concept of "library name" as appears in the plugin
140
     * key: \see composePluginKey().
141
     */
142
    PluginKeyList listPluginsIn(std::vector<std::string> libraryNames);
143

    
144
    /**
145
     * Search for available Vamp plugins in libraries other than those
146
     * with the given library names, and return a list of them in the
147
     * order in which they were found. Do not attempt to load any of
148
     * the libraries named.
149
     *
150
     * The library names should be supplied without path or
151
     * suffix. For example, use "vamp-example-plugins" to find plugins
152
     * not appearing in /install/path/of/vamp-example-plugins.dll (or
153
     * .so etc). This is the same concept of "library name" as appears
154
     * in the plugin key: \see composePluginKey().
155
     */
156
    PluginKeyList listPluginsNotIn(std::vector<std::string> libraryNames);
157

    
158
    /**
159
     * AdapterFlags contains a set of values that may be OR'd together
160
     * to indicate in which circumstances PluginLoader should use a
161
     * plugin adapter to make a plugin easier to use for a host that
162
     * does not want to cater for complex features.
163
     *
164
     * The available flags are:
165
     * 
166
     * ADAPT_INPUT_DOMAIN - If the plugin expects frequency domain
167
     * input, wrap it in a PluginInputDomainAdapter that automatically
168
     * converts the plugin to one that expects time-domain input.
169
     * This enables a host to accommodate time- and frequency-domain
170
     * plugins without needing to do any conversion itself.
171
     *
172
     * ADAPT_CHANNEL_COUNT - Wrap the plugin in a PluginChannelAdapter
173
     * to handle any mismatch between the number of channels of audio
174
     * the plugin can handle and the number available in the host.
175
     * This enables a host to use plugins that may require the input
176
     * to be mixed down to mono, etc., without having to worry about
177
     * doing that itself.
178
     *
179
     * ADAPT_BUFFER_SIZE - Wrap the plugin in a PluginBufferingAdapter
180
     * permitting the host to provide audio input using any block
181
     * size, with no overlap, regardless of the plugin's preferred
182
     * block size (suitable for hosts that read from non-seekable
183
     * streaming media, for example).  This adapter introduces some
184
     * run-time overhead and also changes the semantics of the plugin
185
     * slightly (see the PluginBufferingAdapter header documentation
186
     * for details).
187
     *
188
     * ADAPT_ALL_SAFE - Perform all available adaptations that are
189
     * meaningful for the plugin and "safe".  Currently this means to
190
     * ADAPT_INPUT_DOMAIN if the plugin wants FrequencyDomain input;
191
     * ADAPT_CHANNEL_COUNT always; and ADAPT_BUFFER_SIZE never.
192
     * 
193
     * ADAPT_ALL - Perform all available adaptations that are
194
     * meaningful for the plugin.
195
     * 
196
     * See PluginInputDomainAdapter, PluginChannelAdapter and
197
     * PluginBufferingAdapter for more details of the classes that the
198
     * loader may use if these flags are set.
199
     */
200
    enum AdapterFlags {
201

    
202
        ADAPT_INPUT_DOMAIN  = 0x01,
203
        ADAPT_CHANNEL_COUNT = 0x02,
204
        ADAPT_BUFFER_SIZE   = 0x04,
205

    
206
        ADAPT_ALL_SAFE      = 0x03,
207

    
208
        ADAPT_ALL           = 0xff
209
    };
210

    
211
    /**
212
     * Load a Vamp plugin, given its identifying key.  If the plugin
213
     * could not be loaded, returns 0.
214
     *
215
     * The returned plugin should be deleted (using the standard C++
216
     * delete keyword) after use.
217
     *
218
     * \param adapterFlags a bitwise OR of the values in the AdapterFlags
219
     * enumeration, indicating under which circumstances an adapter should be
220
     * used to wrap the original plugin.  If adapterFlags is 0, no
221
     * optional adapters will be used.  Otherwise, the returned plugin
222
     * may be of an adapter class type which will behave identically
223
     * to the original plugin, apart from any particular features
224
     * implemented by the adapter itself.
225
     * 
226
     * \see AdapterFlags, PluginInputDomainAdapter, PluginChannelAdapter
227
     */
228
    Plugin *loadPlugin(PluginKey key,
229
                       float inputSampleRate,
230
                       int adapterFlags = 0);
231
    
232
    /**
233
     * Given a Vamp plugin library name and plugin identifier, return
234
     * the corresponding plugin key in a form suitable for passing in to
235
     * loadPlugin().
236
     *
237
     * (Note that the reverse of this is not well-defined and is not
238
     * offered in this API - consider using getLibraryPathForPlugin
239
     * instead. See documentation for the PluginKey type for details.)
240
     *
241
     * \see PluginKey, getLibraryPathForPlugin, loadPlugin
242
     */
243
    PluginKey composePluginKey(std::string libraryName,
244
                               std::string identifier);
245

    
246
    /**
247
     * Return the category hierarchy for a Vamp plugin, given its
248
     * identifying key.
249
     *
250
     * If the plugin has no category information, return an empty
251
     * hierarchy.
252
     *
253
     * \see PluginCategoryHierarchy
254
     */
255
    PluginCategoryHierarchy getPluginCategory(PluginKey plugin);
256

    
257
    /**
258
     * Return the file path of the dynamic library from which the
259
     * given plugin will be loaded (if available).
260
     */
261
    std::string getLibraryPathForPlugin(PluginKey plugin);
262

    
263
protected:
264
    PluginLoader();
265
    virtual ~PluginLoader();
266

    
267
    class Impl;
268
    Impl *m_impl;
269

    
270
    static PluginLoader *m_instance;
271
};
272

    
273
}
274

    
275
}
276

    
277
_VAMP_SDK_HOSTSPACE_END(PluginLoader.h)
278

    
279
#endif
280