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