1 /* 2 LVZ - An ugly C++ interface for writing LV2 plugins. 3 Copyright 2008-2012 David Robillard <http://drobilla.net> 4 5 This is free software: you can redistribute it and/or modify it 6 under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 3 of the License, 8 or (at your option) any later version. 9 10 This software is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13 See the GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this software. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef LVZ_AUDIOEFFECTX_H 20 #define LVZ_AUDIOEFFECTX_H 21 22 #include "lv2/atom/atom.h" 23 #include "lv2/core/lv2.h" 24 #include "lv2/urid/urid.h" 25 26 #include <cstdint> 27 #include <cstring> 28 29 class AudioEffect; 30 31 typedef int (*audioMasterCallback)(int, int ver, int, int, int, int); 32 33 AudioEffect* createEffectInstance(audioMasterCallback audioMaster); 34 35 enum LvzPinFlags { 36 kLvzPinIsActive = 1<<0, 37 kLvzPinIsStereo = 1<<1 38 }; 39 40 struct LvzPinProperties { LvzPinPropertiesLvzPinProperties41 LvzPinProperties() : label(NULL), flags(0) {} 42 char* label; 43 int flags; 44 }; 45 46 enum LvzEventTypes { 47 kLvzMidiType = 0 48 }; 49 50 struct LvzEvent { 51 int type; 52 }; 53 54 struct LvzMidiEvent : public LvzEvent { 55 char* midiData; 56 int32_t deltaFrames; 57 }; 58 59 struct LvzEvents { 60 int32_t numEvents; 61 LvzEvent** events; 62 }; 63 64 #define DECLARE_LVZ_DEPRECATED(x) x 65 66 class AudioEffect { 67 public: AudioEffect()68 AudioEffect() {} ~AudioEffect()69 virtual ~AudioEffect() {} 70 71 virtual void setParameter(int32_t index, float value) = 0; setParameterAutomated(int32_t index,float value)72 virtual void setParameterAutomated(int32_t index, float value) {} 73 virtual float getParameter(int32_t index) = 0; 74 masterIdle()75 virtual void masterIdle() {} 76 }; 77 78 class AudioEffectX : public AudioEffect { 79 public: AudioEffectX(audioMasterCallback audioMaster,int32_t progs,int32_t params)80 AudioEffectX(audioMasterCallback audioMaster, int32_t progs, int32_t params) 81 : URI("NIL") 82 , uniqueID("NIL") 83 , eventInput(NULL) 84 , sampleRate(44100) 85 , curProgram(0) 86 , numInputs(0) 87 , numOutputs(0) 88 , numParams(params) 89 , numPrograms(progs) 90 { 91 } 92 process(float ** inputs,float ** outputs,int32_t nframes)93 virtual void process (float **inputs, float **outputs, int32_t nframes) {} 94 virtual void processReplacing(float **inputs, float **outputs, int32_t nframes) = 0; 95 setMidiEventType(LV2_URID urid)96 void setMidiEventType(LV2_URID urid) { midiEventType = urid; } setEventInput(const LV2_Atom_Sequence * seq)97 void setEventInput(const LV2_Atom_Sequence* seq) { eventInput = seq; } 98 processEvents(LvzEvents * ev)99 virtual int32_t processEvents(LvzEvents* ev) { return 0; } 100 getURI()101 virtual const char* getURI() { return URI; } getUniqueID()102 virtual const char* getUniqueID() { return uniqueID; } getSampleRate()103 virtual float getSampleRate() { return sampleRate; } getNumInputs()104 virtual int32_t getNumInputs() { return numInputs; } getNumOutputs()105 virtual int32_t getNumOutputs() { return numOutputs; } getNumParameters()106 virtual int32_t getNumParameters() { return numParams; } getNumPrograms()107 virtual int32_t getNumPrograms() { return numPrograms; } 108 109 virtual void getParameterName(int32_t index, char *label) = 0; 110 virtual bool getProductString(char* text) = 0; getProgramName(char * name)111 virtual void getProgramName(char *name) { name[0] = '\0'; } 112 canDo(const char * text)113 virtual int32_t canDo(const char* text) { return false; } canHostDo(const char * act)114 virtual bool canHostDo(const char* act) { return false; } canMono()115 virtual void canMono() {} canProcessReplacing()116 virtual void canProcessReplacing() {} isSynth()117 virtual void isSynth() {} wantEvents()118 virtual void wantEvents() {} 119 setBlockSize(int32_t size)120 virtual void setBlockSize(int32_t size) {} setNumInputs(int32_t num)121 virtual void setNumInputs(int32_t num) { numInputs = num; } setNumOutputs(int32_t num)122 virtual void setNumOutputs(int32_t num) { numOutputs = num; } setSampleRate(float rate)123 virtual void setSampleRate(float rate) { sampleRate = rate; } setProgram(int32_t prog)124 virtual void setProgram(int32_t prog) { curProgram = prog; } setURI(const char * uri)125 virtual void setURI(const char* uri) { URI = uri; } setUniqueID(const char * id)126 virtual void setUniqueID(const char* id) { uniqueID = id; } suspend()127 virtual void suspend() {} beginEdit(int32_t index)128 virtual void beginEdit(int32_t index) {} endEdit(int32_t index)129 virtual void endEdit(int32_t index) {} 130 dispatcher(long opCode,long index,long value,void * ptr,float opt)131 virtual long dispatcher(long opCode, long index, long value, void *ptr, float opt) { 132 return 0; 133 } 134 135 protected: 136 const char* URI; 137 const char* uniqueID; 138 const LV2_Atom_Sequence* eventInput; 139 LV2_URID midiEventType; 140 float sampleRate; 141 int32_t curProgram; 142 int32_t numInputs; 143 int32_t numOutputs; 144 int32_t numParams; 145 int32_t numPrograms; 146 }; 147 148 extern "C" { 149 LV2_SYMBOL_EXPORT AudioEffectX* lvz_new_audioeffectx(); 150 } 151 152 #endif // LVZ_AUDIOEFFECTX_H 153