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