annotate plugin/DSSIPluginInstance.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents 9b35a1731c3d
children cc27f35aa75c
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7
Chris@52 8 This program is free software; you can redistribute it and/or
Chris@52 9 modify it under the terms of the GNU General Public License as
Chris@52 10 published by the Free Software Foundation; either version 2 of the
Chris@52 11 License, or (at your option) any later version. See the file
Chris@52 12 COPYING included with this distribution for more information.
Chris@0 13 */
Chris@0 14
Chris@0 15 /*
Chris@0 16 This is a modified version of a source file from the
Chris@0 17 Rosegarden MIDI and audio sequencer and notation editor.
Chris@17 18 This file copyright 2000-2006 Chris Cannam.
Chris@0 19 */
Chris@0 20
Chris@0 21 #ifndef _DSSIPLUGININSTANCE_H_
Chris@0 22 #define _DSSIPLUGININSTANCE_H_
Chris@0 23
Chris@0 24 #define DSSI_API_LEVEL 2
Chris@0 25
Chris@0 26 #include <vector>
Chris@0 27 #include <set>
Chris@0 28 #include <map>
Chris@0 29 #include <QString>
Chris@0 30 #include <QMutex>
Chris@0 31
Chris@0 32 #include "api/dssi.h"
Chris@0 33
Chris@0 34 #include "base/RingBuffer.h"
Chris@109 35 #include "base/Thread.h"
Chris@0 36 #include "RealTimePluginInstance.h"
Chris@0 37 #include "base/Scavenger.h"
Chris@0 38
Chris@0 39 class DSSIPluginInstance : public RealTimePluginInstance
Chris@0 40 {
Chris@0 41 public:
Chris@0 42 virtual ~DSSIPluginInstance();
Chris@0 43
Chris@0 44 virtual bool isOK() const { return m_instanceHandle != 0; }
Chris@0 45
Chris@0 46 int getClientId() const { return m_client; }
Chris@237 47 virtual QString getPluginIdentifier() const { return m_identifier; }
Chris@0 48 int getPosition() const { return m_position; }
Chris@0 49
Chris@239 50 virtual std::string getIdentifier() const;
Chris@51 51 virtual std::string getName() const;
Chris@51 52 virtual std::string getDescription() const;
Chris@51 53 virtual std::string getMaker() const;
Chris@51 54 virtual int getPluginVersion() const;
Chris@51 55 virtual std::string getCopyright() const;
Chris@51 56
Chris@385 57 virtual void run(const Vamp::RealTime &, size_t count = 0);
Chris@0 58
Chris@0 59 virtual unsigned int getParameterCount() const;
Chris@0 60 virtual void setParameterValue(unsigned int parameter, float value);
Chris@0 61 virtual float getParameterValue(unsigned int parameter) const;
Chris@0 62 virtual float getParameterDefault(unsigned int parameter) const;
Chris@356 63 virtual int getParameterDisplayHint(unsigned int parameter) const;
Chris@51 64
Chris@51 65 virtual ParameterList getParameterDescriptors() const;
Chris@51 66 virtual float getParameter(std::string) const;
Chris@51 67 virtual void setParameter(std::string, float);
Chris@51 68
Chris@51 69 virtual std::string configure(std::string key, std::string value);
Chris@66 70 virtual void sendEvent(const Vamp::RealTime &eventTime,
Chris@0 71 const void *event);
Chris@10 72 virtual void clearEvents();
Chris@0 73
Chris@0 74 virtual size_t getBufferSize() const { return m_blockSize; }
Chris@0 75 virtual size_t getAudioInputCount() const { return m_audioPortsIn.size(); }
Chris@0 76 virtual size_t getAudioOutputCount() const { return m_idealChannelCount; }
Chris@0 77 virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; }
Chris@0 78 virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; }
Chris@0 79
Chris@60 80 virtual size_t getControlOutputCount() const { return m_controlPortsOut.size(); }
Chris@60 81 virtual float getControlOutputValue(size_t n) const;
Chris@60 82
Chris@51 83 virtual ProgramList getPrograms() const;
Chris@51 84 virtual std::string getCurrentProgram() const;
Chris@51 85 virtual std::string getProgram(int bank, int program) const;
Chris@51 86 virtual unsigned long getProgram(std::string name) const;
Chris@51 87 virtual void selectProgram(std::string program);
Chris@0 88
Chris@0 89 virtual bool isBypassed() const { return m_bypassed; }
Chris@0 90 virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; }
Chris@0 91
Chris@0 92 virtual size_t getLatency();
Chris@0 93
Chris@0 94 virtual void silence();
Chris@0 95 virtual void discardEvents();
Chris@0 96 virtual void setIdealChannelCount(size_t channels); // may re-instantiate
Chris@0 97
Chris@0 98 virtual bool isInGroup() const { return m_grouped; }
Chris@0 99 virtual void detachFromGroup();
Chris@0 100
Chris@57 101 virtual std::string getType() const { return "DSSI Real-Time Plugin"; }
Chris@57 102
Chris@0 103 protected:
Chris@0 104 // To be constructed only by DSSIPluginFactory
Chris@0 105 friend class DSSIPluginFactory;
Chris@0 106
Chris@0 107 // Constructor that creates the buffers internally
Chris@0 108 //
Chris@0 109 DSSIPluginInstance(RealTimePluginFactory *factory,
Chris@0 110 int client,
Chris@0 111 QString identifier,
Chris@0 112 int position,
Chris@0 113 unsigned long sampleRate,
Chris@0 114 size_t blockSize,
Chris@0 115 int idealChannelCount,
Chris@0 116 const DSSI_Descriptor* descriptor);
Chris@0 117
Chris@0 118 void init();
Chris@0 119 void instantiate(unsigned long sampleRate);
Chris@0 120 void cleanup();
Chris@0 121 void activate();
Chris@0 122 void deactivate();
Chris@0 123 void connectPorts();
Chris@0 124
Chris@0 125 bool handleController(snd_seq_event_t *ev);
Chris@0 126 void setPortValueFromController(unsigned int portNumber, int controlValue);
Chris@51 127 void selectProgramAux(std::string program, bool backupPortValues);
Chris@0 128 void checkProgramCache() const;
Chris@0 129
Chris@0 130 void initialiseGroupMembership();
Chris@66 131 void runGrouped(const Vamp::RealTime &);
Chris@0 132
Chris@0 133 // For use in DSSIPluginFactory (set in the DSSI_Host_Descriptor):
Chris@0 134 static int requestMidiSend(LADSPA_Handle instance,
Chris@0 135 unsigned char ports,
Chris@0 136 unsigned char channels);
Chris@0 137 static void midiSend(LADSPA_Handle instance,
Chris@0 138 snd_seq_event_t *events,
Chris@0 139 unsigned long eventCount);
Chris@0 140 static int requestNonRTThread(LADSPA_Handle instance,
Chris@0 141 void (*runFunction)(LADSPA_Handle));
Chris@0 142
Chris@0 143 int m_client;
Chris@0 144 int m_position;
Chris@0 145 LADSPA_Handle m_instanceHandle;
Chris@0 146 const DSSI_Descriptor *m_descriptor;
Chris@0 147
Chris@0 148 std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsIn;
Chris@0 149 std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsOut;
Chris@0 150
Chris@0 151 std::vector<LADSPA_Data> m_backupControlPortsIn;
Chris@0 152
Chris@0 153 std::map<int, int> m_controllerMap;
Chris@0 154
Chris@0 155 std::vector<int> m_audioPortsIn;
Chris@0 156 std::vector<int> m_audioPortsOut;
Chris@0 157
Chris@0 158 struct ProgramControl {
Chris@0 159 int msb;
Chris@0 160 int lsb;
Chris@0 161 int program;
Chris@0 162 };
Chris@0 163 ProgramControl m_pending;
Chris@0 164
Chris@0 165 struct ProgramDescriptor {
Chris@0 166 int bank;
Chris@0 167 int program;
Chris@51 168 std::string name;
Chris@0 169 };
Chris@0 170 mutable std::vector<ProgramDescriptor> m_cachedPrograms;
Chris@0 171 mutable bool m_programCacheValid;
Chris@0 172
Chris@0 173 RingBuffer<snd_seq_event_t> m_eventBuffer;
Chris@0 174
Chris@0 175 size_t m_blockSize;
Chris@0 176 sample_t **m_inputBuffers;
Chris@0 177 sample_t **m_outputBuffers;
Chris@0 178 bool m_ownBuffers;
Chris@0 179 size_t m_idealChannelCount;
Chris@0 180 size_t m_outputBufferCount;
Chris@0 181 size_t m_sampleRate;
Chris@0 182 float *m_latencyPort;
Chris@0 183 bool m_run;
Chris@0 184
Chris@0 185 bool m_bypassed;
Chris@51 186 std::string m_program;
Chris@0 187 bool m_grouped;
Chris@66 188 Vamp::RealTime m_lastRunTime;
Chris@0 189
Chris@66 190 Vamp::RealTime m_lastEventSendTime;
Chris@10 191 bool m_haveLastEventSendTime;
Chris@10 192
Chris@0 193 QMutex m_processLock;
Chris@0 194
Chris@0 195 typedef std::set<DSSIPluginInstance *> PluginSet;
Chris@0 196 typedef std::map<QString, PluginSet> GroupMap;
Chris@0 197 static GroupMap m_groupMap;
Chris@0 198 static snd_seq_event_t **m_groupLocalEventBuffers;
Chris@0 199 static size_t m_groupLocalEventBufferCount;
Chris@0 200
Chris@0 201 static Scavenger<ScavengerArrayWrapper<snd_seq_event_t *> > m_bufferScavenger;
Chris@0 202
Chris@109 203 class NonRTPluginThread : public Thread
Chris@0 204 {
Chris@0 205 public:
Chris@0 206 NonRTPluginThread(LADSPA_Handle handle,
Chris@0 207 void (*runFunction)(LADSPA_Handle)) :
Chris@0 208 m_handle(handle),
Chris@0 209 m_runFunction(runFunction),
Chris@0 210 m_exiting(false) { }
Chris@0 211
Chris@0 212 virtual void run();
Chris@0 213 void setExiting() { m_exiting = true; }
Chris@0 214
Chris@0 215 protected:
Chris@0 216 LADSPA_Handle m_handle;
Chris@0 217 void (*m_runFunction)(LADSPA_Handle);
Chris@0 218 bool m_exiting;
Chris@0 219 };
Chris@0 220 static std::map<LADSPA_Handle, std::set<NonRTPluginThread *> > m_threads;
Chris@0 221 };
Chris@0 222
Chris@0 223 #endif // _DSSIPLUGININSTANCE_H_
Chris@0 224