annotate plugin/DSSIPluginInstance.h @ 1288:5ef9b4d4bbdb 3.0-integration

Filter out Xing/LAME info frames, rather than letting them go to the mp3 decoder as if they were audio frames. Fixes the 1152-sample zero pad at start of some decoded mp3 files (distinct from decoder delay). The logic here is based on the madplay code.
author Chris Cannam
date Thu, 24 Nov 2016 13:32:04 +0000
parents a1cd5abcb38b
children 48e9f538e6e9
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@1040 57 virtual void run(const RealTime &, int count = 0);
Chris@0 58
Chris@1038 59 virtual int getParameterCount() const;
Chris@1038 60 virtual void setParameterValue(int parameter, float value);
Chris@1038 61 virtual float getParameterValue(int parameter) const;
Chris@1038 62 virtual float getParameterDefault(int parameter) const;
Chris@1038 63 virtual int getParameterDisplayHint(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@1040 70 virtual void sendEvent(const RealTime &eventTime,
Chris@0 71 const void *event);
Chris@10 72 virtual void clearEvents();
Chris@0 73
Chris@1040 74 virtual int getBufferSize() const { return m_blockSize; }
Chris@1040 75 virtual int getAudioInputCount() const { return (int)m_audioPortsIn.size(); }
Chris@1040 76 virtual int 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@1040 80 virtual int getControlOutputCount() const { return (int)m_controlPortsOut.size(); }
Chris@1040 81 virtual float getControlOutputValue(int 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@1038 86 virtual int 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@1040 92 virtual sv_frame_t getLatency();
Chris@0 93
Chris@0 94 virtual void silence();
Chris@0 95 virtual void discardEvents();
Chris@1040 96 virtual void setIdealChannelCount(int 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@1040 113 sv_samplerate_t sampleRate,
Chris@1040 114 int blockSize,
Chris@0 115 int idealChannelCount,
Chris@0 116 const DSSI_Descriptor* descriptor);
Chris@0 117
Chris@0 118 void init();
Chris@1040 119 void instantiate(sv_samplerate_t 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@1038 126 void setPortValueFromController(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@1040 131 void runGrouped(const 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@1038 148 std::vector<std::pair<int, LADSPA_Data*> > m_controlPortsIn;
Chris@1038 149 std::vector<std::pair<int, 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@1040 175 int m_blockSize;
Chris@0 176 sample_t **m_inputBuffers;
Chris@0 177 sample_t **m_outputBuffers;
Chris@0 178 bool m_ownBuffers;
Chris@1040 179 int m_idealChannelCount;
Chris@1040 180 int m_outputBufferCount;
Chris@1040 181 sv_samplerate_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@1040 188 RealTime m_lastRunTime;
Chris@0 189
Chris@1040 190 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