annotate vamp-hostsdk/PluginBufferingAdapter.h @ 263:4454843ff384

* OK, we're going to have to place the host stuff in its own namespace too. Otherwise our new SV build on OSX fails to load old plugins because they pull in the host namespace PluginBase and thus report the wrong Vamp version... *sigh*
author cannam
date Thu, 20 Nov 2008 15:01:30 +0000
parents c88a3cdb0215
children 93c81a6c917a
rev   line source
cannam@233 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@233 2
cannam@233 3 /*
cannam@233 4 Vamp
cannam@233 5
cannam@233 6 An API for audio analysis and feature extraction plugins.
cannam@233 7
cannam@233 8 Centre for Digital Music, Queen Mary, University of London.
cannam@233 9 Copyright 2006-2007 Chris Cannam and QMUL.
cannam@233 10 This file by Mark Levy and Chris Cannam, Copyright 2007-2008 QMUL.
cannam@233 11
cannam@233 12 Permission is hereby granted, free of charge, to any person
cannam@233 13 obtaining a copy of this software and associated documentation
cannam@233 14 files (the "Software"), to deal in the Software without
cannam@233 15 restriction, including without limitation the rights to use, copy,
cannam@233 16 modify, merge, publish, distribute, sublicense, and/or sell copies
cannam@233 17 of the Software, and to permit persons to whom the Software is
cannam@233 18 furnished to do so, subject to the following conditions:
cannam@233 19
cannam@233 20 The above copyright notice and this permission notice shall be
cannam@233 21 included in all copies or substantial portions of the Software.
cannam@233 22
cannam@233 23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cannam@233 24 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
cannam@233 25 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cannam@233 26 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
cannam@233 27 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
cannam@233 28 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
cannam@233 29 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cannam@233 30
cannam@233 31 Except as contained in this notice, the names of the Centre for
cannam@233 32 Digital Music; Queen Mary, University of London; and Chris Cannam
cannam@233 33 shall not be used in advertising or otherwise to promote the sale,
cannam@233 34 use or other dealings in this Software without prior written
cannam@233 35 authorization.
cannam@233 36 */
cannam@233 37
cannam@233 38 #ifndef _VAMP_PLUGIN_BUFFERING_ADAPTER_H_
cannam@233 39 #define _VAMP_PLUGIN_BUFFERING_ADAPTER_H_
cannam@233 40
cannam@243 41 #include "hostguard.h"
cannam@233 42 #include "PluginWrapper.h"
cannam@233 43
cannam@263 44 _VAMP_SDK_HOSTSPACE_BEGIN(PluginBufferingAdapter.h)
cannam@263 45
cannam@233 46 namespace Vamp {
cannam@233 47
cannam@233 48 namespace HostExt {
cannam@233 49
cannam@233 50 /**
cannam@233 51 * \class PluginBufferingAdapter PluginBufferingAdapter.h <vamp-hostsdk/PluginBufferingAdapter.h>
cannam@233 52 *
cannam@233 53 * PluginBufferingAdapter is a Vamp plugin adapter that allows plugins
cannam@233 54 * to be used by a host supplying an audio stream in non-overlapping
cannam@233 55 * buffers of arbitrary size.
cannam@233 56 *
cannam@233 57 * A host using PluginBufferingAdapter may ignore the preferred step
cannam@233 58 * and block size reported by the plugin, and still expect the plugin
cannam@233 59 * to run. The value of blockSize and stepSize passed to initialise
cannam@233 60 * should be the size of the buffer which the host will supply; the
cannam@233 61 * stepSize should be equal to the blockSize.
cannam@233 62 *
cannam@233 63 * If the internal step size used for the plugin differs from that
cannam@233 64 * supplied by the host, the adapter will modify the sample type and
cannam@233 65 * rate specifications for the plugin outputs appropriately, and set
cannam@233 66 * timestamps on the output features for outputs that formerly used a
cannam@233 67 * different sample rate specification. This is necessary in order to
cannam@233 68 * obtain correct time stamping.
cannam@233 69 *
cannam@233 70 * In other respects, the PluginBufferingAdapter behaves identically
cannam@233 71 * to the plugin that it wraps. The wrapped plugin will be deleted
cannam@233 72 * when the wrapper is deleted.
cannam@233 73 */
cannam@233 74
cannam@233 75 class PluginBufferingAdapter : public PluginWrapper
cannam@233 76 {
cannam@233 77 public:
cannam@248 78 /**
cannam@248 79 * Construct a PluginBufferingAdapter wrapping the given plugin.
cannam@248 80 * The adapter takes ownership of the plugin, which will be
cannam@248 81 * deleted when the adapter is deleted.
cannam@248 82 */
cannam@248 83 PluginBufferingAdapter(Plugin *plugin);
cannam@233 84 virtual ~PluginBufferingAdapter();
cannam@233 85
cannam@233 86 /**
cannam@233 87 * Return the preferred step size for this adapter.
cannam@233 88 *
cannam@233 89 * Because of the way this adapter works, its preferred step size
cannam@233 90 * will always be the same as its preferred block size. This may
cannam@233 91 * or may not be the same as the preferred step size of the
cannam@233 92 * underlying plugin, which may be obtained by calling
cannam@233 93 * getPluginPreferredStepSize().
cannam@233 94 */
cannam@233 95 size_t getPreferredStepSize() const;
cannam@233 96
cannam@233 97 /**
cannam@233 98 * Return the preferred block size for this adapter.
cannam@233 99 *
cannam@233 100 * This may or may not be the same as the preferred block size of
cannam@233 101 * the underlying plugin, which may be obtained by calling
cannam@233 102 * getPluginPreferredBlockSize().
cannam@233 103 *
cannam@233 104 * Note that this adapter may be initialised with any block size,
cannam@233 105 * not just its supposedly preferred one.
cannam@233 106 */
cannam@233 107 size_t getPreferredBlockSize() const;
cannam@233 108
cannam@233 109 /**
cannam@233 110 * Initialise the adapter (and therefore the plugin) for the given
cannam@233 111 * number of channels. Initialise the adapter for the given step
cannam@233 112 * and block size, which must be equal.
cannam@233 113 *
cannam@233 114 * The step and block size used for the underlying plugin will
cannam@233 115 * depend on its preferences, or any values previously passed to
cannam@233 116 * setPluginStepSize and setPluginBlockSize.
cannam@233 117 */
cannam@233 118 bool initialise(size_t channels, size_t stepSize, size_t blockSize);
cannam@233 119
cannam@233 120 /**
cannam@233 121 * Return the preferred step size of the plugin wrapped by this
cannam@233 122 * adapter.
cannam@233 123 *
cannam@233 124 * This is included mainly for informational purposes. This value
cannam@233 125 * is not likely to be a valid step size for the adapter itself,
cannam@233 126 * and it is not usually of any use in interpreting the results
cannam@233 127 * (because the adapter re-writes OneSamplePerStep outputs to
cannam@233 128 * FixedSampleRate so that the hop size no longer needs to be
cannam@233 129 * known beforehand in order to interpret them).
cannam@233 130 */
cannam@233 131 size_t getPluginPreferredStepSize() const;
cannam@233 132
cannam@233 133 /**
cannam@233 134 * Return the preferred block size of the plugin wrapped by this
cannam@233 135 * adapter.
cannam@233 136 *
cannam@233 137 * This is included mainly for informational purposes.
cannam@233 138 */
cannam@233 139 size_t getPluginPreferredBlockSize() const;
cannam@233 140
cannam@233 141 /**
cannam@233 142 * Set the step size that will be used for the underlying plugin
cannam@233 143 * when initialise() is called. If this is not set, the plugin's
cannam@233 144 * own preferred step size will be used. You will not usually
cannam@233 145 * need to call this function. If you do call it, it must be
cannam@233 146 * before the first call to initialise().
cannam@233 147 */
cannam@233 148 void setPluginStepSize(size_t stepSize);
cannam@233 149
cannam@233 150 /**
cannam@233 151 * Set the block size that will be used for the underlying plugin
cannam@233 152 * when initialise() is called. If this is not set, the plugin's
cannam@233 153 * own preferred block size will be used. You will not usually
cannam@233 154 * need to call this function. If you do call it, it must be
cannam@233 155 * before the first call to initialise().
cannam@233 156 */
cannam@233 157 void setPluginBlockSize(size_t blockSize);
cannam@233 158
cannam@233 159 /**
cannam@233 160 * Return the step and block sizes that were actually used when
cannam@233 161 * initialising the underlying plugin.
cannam@233 162 *
cannam@233 163 * This is included mainly for informational purposes. You will
cannam@233 164 * not usually need to call this function. If this is called
cannam@233 165 * before initialise(), it will return 0 for both values. If it
cannam@233 166 * is called after a failed call to initialise(), it will return
cannam@233 167 * the values that were used in the failed call to the plugin's
cannam@233 168 * initialise() function.
cannam@233 169 */
cannam@233 170 void getActualStepAndBlockSizes(size_t &stepSize, size_t &blockSize);
cannam@233 171
cannam@233 172 OutputList getOutputDescriptors() const;
cannam@233 173
cannam@233 174 void reset();
cannam@233 175
cannam@233 176 FeatureSet process(const float *const *inputBuffers, RealTime timestamp);
cannam@233 177
cannam@233 178 FeatureSet getRemainingFeatures();
cannam@233 179
cannam@233 180 protected:
cannam@233 181 class Impl;
cannam@233 182 Impl *m_impl;
cannam@233 183 };
cannam@233 184
cannam@233 185 }
cannam@233 186
cannam@233 187 }
cannam@233 188
cannam@263 189 _VAMP_SDK_HOSTSPACE_END(PluginBufferingAdapter.h)
cannam@263 190
cannam@233 191 #endif