annotate VamPipeAdapter.h @ 39:a9dbf9f45896 jsonrpc

Update adapter code
author Chris Cannam
date Wed, 05 Oct 2016 18:00:58 +0100
parents 0e1909abe921
children
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 VamPipe
Chris@0 5
Chris@0 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7 Copyright 2015-2016 QMUL.
Chris@0 8
Chris@0 9 Permission is hereby granted, free of charge, to any person
Chris@0 10 obtaining a copy of this software and associated documentation
Chris@0 11 files (the "Software"), to deal in the Software without
Chris@0 12 restriction, including without limitation the rights to use, copy,
Chris@0 13 modify, merge, publish, distribute, sublicense, and/or sell copies
Chris@0 14 of the Software, and to permit persons to whom the Software is
Chris@0 15 furnished to do so, subject to the following conditions:
Chris@0 16
Chris@0 17 The above copyright notice and this permission notice shall be
Chris@0 18 included in all copies or substantial portions of the Software.
Chris@0 19
Chris@0 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@0 21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@0 22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Chris@0 23 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
Chris@0 24 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@0 25 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@0 26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@0 27
Chris@0 28 Except as contained in this notice, the names of the Centre for
Chris@0 29 Digital Music; Queen Mary, University of London; and Chris Cannam
Chris@0 30 shall not be used in advertising or otherwise to promote the sale,
Chris@0 31 use or other dealings in this Software without prior written
Chris@0 32 authorization.
Chris@0 33 */
Chris@0 34
Chris@0 35 #ifndef VAMPIPE_ADAPTER_H
Chris@0 36 #define VAMPIPE_ADAPTER_H
Chris@0 37
Chris@0 38 #include <vamp-hostsdk/PluginStaticData.h>
Chris@0 39 #include <vamp-hostsdk/PluginConfiguration.h>
Chris@0 40 #include <vamp-hostsdk/RequestResponse.h>
Chris@0 41
Chris@0 42 #include <vamp-hostsdk/PluginInputDomainAdapter.h>
Chris@0 43 #include <vamp-hostsdk/PluginBufferingAdapter.h>
Chris@0 44 #include <vamp-hostsdk/PluginChannelAdapter.h>
Chris@0 45
Chris@0 46 namespace vampipe {
Chris@0 47
Chris@19 48 class VamPipeAdapterInterface
Chris@0 49 {
Chris@0 50 public:
Chris@0 51 virtual Vamp::HostExt::PluginStaticData getStaticData() const = 0;
Chris@0 52 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::LoadRequest r) const = 0;
Chris@19 53 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0;
Chris@0 54 };
Chris@0 55
Chris@0 56 template <typename P>
Chris@19 57 class VamPipeAdapterBase : public VamPipeAdapterInterface
Chris@0 58 {
Chris@0 59 const int adaptInputDomain = 0x01;
Chris@0 60 const int adaptChannelCount = 0x02;
Chris@0 61 const int adaptBufferSize = 0x04;
Chris@19 62
Chris@19 63 protected:
Chris@19 64 VamPipeAdapterBase(std::string libname) : m_soname(libname) { }
Chris@0 65
Chris@0 66 public:
Chris@19 67 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0;
Chris@0 68
Chris@0 69 virtual Vamp::HostExt::PluginStaticData getStaticData() const {
Chris@19 70 Vamp::Plugin *p = createPlugin(44100.f);
Chris@19 71 auto data = Vamp::HostExt::PluginStaticData::fromPlugin
Chris@19 72 (m_soname + ":" + p->getIdentifier(),
Chris@0 73 {}, //!!! todo: category - tricky one that
Chris@19 74 p);
Chris@19 75 delete p;
Chris@19 76 return data;
Chris@0 77 }
Chris@0 78
Chris@0 79 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::
Chris@0 80 LoadRequest r) const {
Chris@0 81
Chris@0 82 // We assume the caller has guaranteed that the request is for
Chris@0 83 // the correct plugin (so we don't have to check the plugin
Chris@0 84 // key field here)
Chris@0 85
Chris@19 86 Vamp::Plugin *p = createPlugin(r.inputSampleRate);
Chris@0 87
Chris@0 88 if (r.adapterFlags & adaptInputDomain) {
Chris@0 89 if (p->getInputDomain() == Vamp::Plugin::FrequencyDomain) {
Chris@0 90 p = new Vamp::HostExt::PluginInputDomainAdapter(p);
Chris@0 91 }
Chris@0 92 }
Chris@0 93
Chris@0 94 if (r.adapterFlags & adaptBufferSize) {
Chris@0 95 p = new Vamp::HostExt::PluginBufferingAdapter(p);
Chris@0 96 }
Chris@0 97
Chris@0 98 if (r.adapterFlags & adaptChannelCount) {
Chris@0 99 p = new Vamp::HostExt::PluginChannelAdapter(p);
Chris@0 100 }
Chris@0 101
Chris@0 102 Vamp::HostExt::LoadResponse response;
Chris@0 103 response.plugin = p;
Chris@0 104
Chris@0 105 response.staticData = Vamp::HostExt::PluginStaticData::fromPlugin
Chris@0 106 (m_soname + ":" + p->getIdentifier(),
Chris@0 107 {}, //!!! todo: category - tricky one that
Chris@0 108 p);
Chris@0 109
Chris@0 110 int defaultChannels = 0;
Chris@0 111 if (p->getMinChannelCount() == p->getMaxChannelCount()) {
Chris@0 112 defaultChannels = p->getMinChannelCount();
Chris@0 113 }
Chris@0 114
Chris@0 115 response.defaultConfiguration = Vamp::HostExt::PluginConfiguration::fromPlugin
Chris@0 116 (p,
Chris@0 117 defaultChannels,
Chris@0 118 p->getPreferredStepSize(),
Chris@0 119 p->getPreferredBlockSize());
Chris@0 120
Chris@0 121 return response;
Chris@0 122 }
Chris@0 123
Chris@0 124 private:
Chris@0 125 std::string m_soname;
Chris@0 126 };
Chris@0 127
Chris@19 128 template <typename P>
Chris@19 129 class VamPipeAdapter : public VamPipeAdapterBase<P>
Chris@19 130 {
Chris@19 131 public:
Chris@19 132 VamPipeAdapter(std::string libname) : VamPipeAdapterBase<P>(libname) { }
Chris@19 133
Chris@19 134 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const {
Chris@19 135 return new P(inputSampleRate);
Chris@19 136 }
Chris@19 137 };
Chris@19 138
Chris@0 139 }
Chris@0 140
Chris@0 141 #endif
Chris@0 142