annotate plugin/DSSIPluginInstance.h @ 184:5a916fee6d2d

* Handle generator transforms (plugins whose channel count isn't dependent on number of audio inputs, as they have none) * Be less keen to suspend writing FFT data in spectrogram repaint -- only do it if we find we actually need to query the FFT data (i.e. we aren't repainting an area that hasn't been generated at all yet)
author Chris Cannam
date Tue, 10 Oct 2006 19:04:57 +0000
parents 61a2ac1241b3
children 3a6af0e5e2d1
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@0 47 virtual QString getIdentifier() const { return m_identifier; }
Chris@0 48 int getPosition() const { return m_position; }
Chris@0 49
Chris@51 50 virtual std::string getName() const;
Chris@51 51 virtual std::string getDescription() const;
Chris@51 52 virtual std::string getMaker() const;
Chris@51 53 virtual int getPluginVersion() const;
Chris@51 54 virtual std::string getCopyright() const;
Chris@51 55
Chris@66 56 virtual void run(const Vamp::RealTime &);
Chris@0 57
Chris@0 58 virtual unsigned int getParameterCount() const;
Chris@0 59 virtual void setParameterValue(unsigned int parameter, float value);
Chris@0 60 virtual float getParameterValue(unsigned int parameter) const;
Chris@0 61 virtual float getParameterDefault(unsigned int parameter) const;
Chris@51 62
Chris@51 63 virtual ParameterList getParameterDescriptors() const;
Chris@51 64 virtual float getParameter(std::string) const;
Chris@51 65 virtual void setParameter(std::string, float);
Chris@51 66
Chris@51 67 virtual std::string configure(std::string key, std::string value);
Chris@66 68 virtual void sendEvent(const Vamp::RealTime &eventTime,
Chris@0 69 const void *event);
Chris@10 70 virtual void clearEvents();
Chris@0 71
Chris@0 72 virtual size_t getBufferSize() const { return m_blockSize; }
Chris@0 73 virtual size_t getAudioInputCount() const { return m_audioPortsIn.size(); }
Chris@0 74 virtual size_t getAudioOutputCount() const { return m_idealChannelCount; }
Chris@0 75 virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; }
Chris@0 76 virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; }
Chris@0 77
Chris@60 78 virtual size_t getControlOutputCount() const { return m_controlPortsOut.size(); }
Chris@60 79 virtual float getControlOutputValue(size_t n) const;
Chris@60 80
Chris@51 81 virtual ProgramList getPrograms() const;
Chris@51 82 virtual std::string getCurrentProgram() const;
Chris@51 83 virtual std::string getProgram(int bank, int program) const;
Chris@51 84 virtual unsigned long getProgram(std::string name) const;
Chris@51 85 virtual void selectProgram(std::string program);
Chris@0 86
Chris@0 87 virtual bool isBypassed() const { return m_bypassed; }
Chris@0 88 virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; }
Chris@0 89
Chris@0 90 virtual size_t getLatency();
Chris@0 91
Chris@0 92 virtual void silence();
Chris@0 93 virtual void discardEvents();
Chris@0 94 virtual void setIdealChannelCount(size_t channels); // may re-instantiate
Chris@0 95
Chris@0 96 virtual bool isInGroup() const { return m_grouped; }
Chris@0 97 virtual void detachFromGroup();
Chris@0 98
Chris@57 99 virtual std::string getType() const { return "DSSI Real-Time Plugin"; }
Chris@57 100
Chris@0 101 protected:
Chris@0 102 // To be constructed only by DSSIPluginFactory
Chris@0 103 friend class DSSIPluginFactory;
Chris@0 104
Chris@0 105 // Constructor that creates the buffers internally
Chris@0 106 //
Chris@0 107 DSSIPluginInstance(RealTimePluginFactory *factory,
Chris@0 108 int client,
Chris@0 109 QString identifier,
Chris@0 110 int position,
Chris@0 111 unsigned long sampleRate,
Chris@0 112 size_t blockSize,
Chris@0 113 int idealChannelCount,
Chris@0 114 const DSSI_Descriptor* descriptor);
Chris@0 115
Chris@0 116 void init();
Chris@0 117 void instantiate(unsigned long sampleRate);
Chris@0 118 void cleanup();
Chris@0 119 void activate();
Chris@0 120 void deactivate();
Chris@0 121 void connectPorts();
Chris@0 122
Chris@0 123 bool handleController(snd_seq_event_t *ev);
Chris@0 124 void setPortValueFromController(unsigned int portNumber, int controlValue);
Chris@51 125 void selectProgramAux(std::string program, bool backupPortValues);
Chris@0 126 void checkProgramCache() const;
Chris@0 127
Chris@0 128 void initialiseGroupMembership();
Chris@66 129 void runGrouped(const Vamp::RealTime &);
Chris@0 130
Chris@0 131 // For use in DSSIPluginFactory (set in the DSSI_Host_Descriptor):
Chris@0 132 static int requestMidiSend(LADSPA_Handle instance,
Chris@0 133 unsigned char ports,
Chris@0 134 unsigned char channels);
Chris@0 135 static void midiSend(LADSPA_Handle instance,
Chris@0 136 snd_seq_event_t *events,
Chris@0 137 unsigned long eventCount);
Chris@0 138 static int requestNonRTThread(LADSPA_Handle instance,
Chris@0 139 void (*runFunction)(LADSPA_Handle));
Chris@0 140
Chris@0 141 int m_client;
Chris@0 142 int m_position;
Chris@0 143 LADSPA_Handle m_instanceHandle;
Chris@0 144 const DSSI_Descriptor *m_descriptor;
Chris@0 145
Chris@0 146 std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsIn;
Chris@0 147 std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsOut;
Chris@0 148
Chris@0 149 std::vector<LADSPA_Data> m_backupControlPortsIn;
Chris@0 150
Chris@0 151 std::map<int, int> m_controllerMap;
Chris@0 152
Chris@0 153 std::vector<int> m_audioPortsIn;
Chris@0 154 std::vector<int> m_audioPortsOut;
Chris@0 155
Chris@0 156 struct ProgramControl {
Chris@0 157 int msb;
Chris@0 158 int lsb;
Chris@0 159 int program;
Chris@0 160 };
Chris@0 161 ProgramControl m_pending;
Chris@0 162
Chris@0 163 struct ProgramDescriptor {
Chris@0 164 int bank;
Chris@0 165 int program;
Chris@51 166 std::string name;
Chris@0 167 };
Chris@0 168 mutable std::vector<ProgramDescriptor> m_cachedPrograms;
Chris@0 169 mutable bool m_programCacheValid;
Chris@0 170
Chris@0 171 RingBuffer<snd_seq_event_t> m_eventBuffer;
Chris@0 172
Chris@0 173 size_t m_blockSize;
Chris@0 174 sample_t **m_inputBuffers;
Chris@0 175 sample_t **m_outputBuffers;
Chris@0 176 bool m_ownBuffers;
Chris@0 177 size_t m_idealChannelCount;
Chris@0 178 size_t m_outputBufferCount;
Chris@0 179 size_t m_sampleRate;
Chris@0 180 float *m_latencyPort;
Chris@0 181 bool m_run;
Chris@0 182
Chris@0 183 bool m_bypassed;
Chris@51 184 std::string m_program;
Chris@0 185 bool m_grouped;
Chris@66 186 Vamp::RealTime m_lastRunTime;
Chris@0 187
Chris@66 188 Vamp::RealTime m_lastEventSendTime;
Chris@10 189 bool m_haveLastEventSendTime;
Chris@10 190
Chris@0 191 QMutex m_processLock;
Chris@0 192
Chris@0 193 typedef std::set<DSSIPluginInstance *> PluginSet;
Chris@0 194 typedef std::map<QString, PluginSet> GroupMap;
Chris@0 195 static GroupMap m_groupMap;
Chris@0 196 static snd_seq_event_t **m_groupLocalEventBuffers;
Chris@0 197 static size_t m_groupLocalEventBufferCount;
Chris@0 198
Chris@0 199 static Scavenger<ScavengerArrayWrapper<snd_seq_event_t *> > m_bufferScavenger;
Chris@0 200
Chris@109 201 class NonRTPluginThread : public Thread
Chris@0 202 {
Chris@0 203 public:
Chris@0 204 NonRTPluginThread(LADSPA_Handle handle,
Chris@0 205 void (*runFunction)(LADSPA_Handle)) :
Chris@0 206 m_handle(handle),
Chris@0 207 m_runFunction(runFunction),
Chris@0 208 m_exiting(false) { }
Chris@0 209
Chris@0 210 virtual void run();
Chris@0 211 void setExiting() { m_exiting = true; }
Chris@0 212
Chris@0 213 protected:
Chris@0 214 LADSPA_Handle m_handle;
Chris@0 215 void (*m_runFunction)(LADSPA_Handle);
Chris@0 216 bool m_exiting;
Chris@0 217 };
Chris@0 218 static std::map<LADSPA_Handle, std::set<NonRTPluginThread *> > m_threads;
Chris@0 219 };
Chris@0 220
Chris@0 221 #endif // _DSSIPLUGININSTANCE_H_
Chris@0 222