| 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_CHANNEL_ADAPTER_H_ | 
| cannam@64 | 38 #define _VAMP_PLUGIN_CHANNEL_ADAPTER_H_ | 
| cannam@64 | 39 | 
| cannam@64 | 40 #include "PluginWrapper.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 PluginChannelAdapter PluginChannelAdapter.h <vamp-sdk/hostext/PluginChannelAdapter.h> | 
| cannam@76 | 48  * | 
| cannam@64 | 49  * PluginChannelAdapter is a Vamp plugin adapter that implements a | 
| cannam@64 | 50  * policy for management of plugins that expect a different number of | 
| cannam@64 | 51  * input channels from the number actually available in the source | 
| cannam@64 | 52  * audio data. | 
| cannam@64 | 53  * | 
| cannam@64 | 54  * A host using PluginChannelAdapter may ignore the getMinChannelCount | 
| cannam@64 | 55  * and getMaxChannelCount reported by the plugin, and still expect the | 
| cannam@64 | 56  * plugin to run. | 
| cannam@64 | 57  * | 
| cannam@64 | 58  * PluginChannelAdapter implements the following policy: | 
| cannam@64 | 59  * | 
| cannam@75 | 60  *  - If the plugin supports the provided number of channels directly, | 
| cannam@75 | 61  *  PluginChannelAdapter will just run the plugin as normal. | 
| cannam@64 | 62  * | 
| cannam@75 | 63  *  - If the plugin only supports exactly one channel but more than | 
| cannam@75 | 64  *  one channel is provided, PluginChannelAdapter will use the mean of | 
| cannam@75 | 65  *  the channels.  This ensures that the resulting values remain | 
| cannam@75 | 66  *  within the same magnitude range as expected for mono data. | 
| cannam@64 | 67  * | 
| cannam@75 | 68  *  - If the plugin requires more than one channel but exactly one is | 
| cannam@75 | 69  *  provided, the provided channel will be duplicated across all the | 
| cannam@75 | 70  *  plugin input channels. | 
| cannam@64 | 71  * | 
| cannam@64 | 72  * If none of the above apply: | 
| cannam@64 | 73  * | 
| cannam@75 | 74  *  - If the plugin requires more channels than are provided, the | 
| cannam@75 | 75  *  minimum acceptable number of channels will be produced by adding | 
| cannam@75 | 76  *  empty (zero valued) channels to those provided. | 
| cannam@64 | 77  * | 
| cannam@75 | 78  *  - If the plugin requires fewer channels than are provided, the | 
| cannam@75 | 79  *  maximum acceptable number of channels will be produced by | 
| cannam@75 | 80  *  discarding the excess channels. | 
| cannam@64 | 81  * | 
| cannam@64 | 82  * Hosts requiring a different channel policy from the above will need | 
| cannam@64 | 83  * to implement it themselves, instead of using PluginChannelAdapter. | 
| cannam@64 | 84  * | 
| cannam@64 | 85  * Note that PluginChannelAdapter does not override the minimum and | 
| cannam@64 | 86  * maximum channel counts returned by the wrapped plugin.  The host | 
| cannam@64 | 87  * will need to be aware that it is using a PluginChannelAdapter, and | 
| cannam@64 | 88  * be prepared to ignore these counts as necessary.  (This contrasts | 
| cannam@64 | 89  * with the approach used in PluginInputDomainAdapter, which aims to | 
| cannam@64 | 90  * make the host completely unaware of which underlying input domain | 
| cannam@64 | 91  * is in fact in use.) | 
| cannam@64 | 92  * | 
| cannam@64 | 93  * (The rationale for this is that a host may wish to use the | 
| cannam@64 | 94  * PluginChannelAdapter but still discriminate in some way on the | 
| cannam@64 | 95  * basis of the number of channels actually supported.  For example, a | 
| cannam@64 | 96  * simple stereo audio host may prefer to reject plugins that require | 
| cannam@64 | 97  * more than two channels on the grounds that doesn't actually | 
| cannam@64 | 98  * understand what they are for, rather than allow the channel adapter | 
| cannam@64 | 99  * to make a potentially meaningless channel conversion for them.) | 
| cannam@64 | 100  * | 
| cannam@64 | 101  * In every respect other than its management of channels, the | 
| cannam@64 | 102  * PluginChannelAdapter behaves identically to the plugin that it | 
| cannam@64 | 103  * wraps.  The wrapped plugin will be deleted when the wrapper is | 
| cannam@64 | 104  * deleted. | 
| cannam@75 | 105  * | 
| cannam@76 | 106  * \note This class was introduced in version 1.1 of the Vamp plugin SDK. | 
| cannam@64 | 107  */ | 
| cannam@64 | 108 | 
| cannam@64 | 109 class PluginChannelAdapter : public PluginWrapper | 
| cannam@64 | 110 { | 
| cannam@64 | 111 public: | 
| cannam@64 | 112     PluginChannelAdapter(Plugin *plugin); // I take ownership of plugin | 
| cannam@64 | 113     virtual ~PluginChannelAdapter(); | 
| cannam@64 | 114 | 
| cannam@64 | 115     bool initialise(size_t channels, size_t stepSize, size_t blockSize); | 
| cannam@64 | 116 | 
| cannam@64 | 117     FeatureSet process(const float *const *inputBuffers, RealTime timestamp); | 
| cannam@64 | 118 | 
| cannam@197 | 119     /** | 
| cannam@197 | 120      * Call process(), providing interleaved audio data with the | 
| cannam@197 | 121      * number of channels passed to initialise().  The adapter will | 
| cannam@197 | 122      * de-interleave into temporary buffers as appropriate before | 
| cannam@197 | 123      * calling process(). | 
| cannam@197 | 124      * | 
| cannam@197 | 125      * \note This function was introduced in version 1.4 of the Vamp | 
| cannam@197 | 126      * plugin SDK. | 
| cannam@197 | 127      */ | 
| cannam@197 | 128     FeatureSet processInterleaved(const float *inputBuffer, RealTime timestamp); | 
| cannam@197 | 129 | 
| cannam@64 | 130 protected: | 
| cannam@70 | 131     class Impl; | 
| cannam@70 | 132     Impl *m_impl; | 
| cannam@64 | 133 }; | 
| cannam@64 | 134 | 
| cannam@64 | 135 } | 
| cannam@64 | 136 | 
| cannam@64 | 137 } | 
| cannam@64 | 138 | 
| cannam@64 | 139 #endif |