aboutsummaryrefslogtreecommitdiff
path: root/Vst/AudioEffect.hpp
blob: 08eb6d11773f988e519354265d4b64c04b3c465e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef __AudioEffect__
#define __AudioEffect__

#include "AEffect.h"	// "c" interface
#include <string.h>

class AEffEditor;
class AudioEffect;

// Needs to be defined by the audio effect and is
// called to create the audio effect object instance.
AudioEffect* createEffectInstance (audioMasterCallback audioMaster);

long dispatchEffectClass(AEffect *e,
	long opCode, long index, long value, void *ptr, float opt);
float getParameterClass(long index);
void setParameterClass(long index, float value);
void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames);
void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames);

class AudioEffect
{
friend class AEffEditor;
friend long dispatchEffectClass(AEffect *e, long opCode, long index, long value, void *ptr, float opt);
friend float getParameterClass(AEffect *e, long index);
friend void setParameterClass(AEffect *e, long index, float value);
friend void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames);
friend void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames);

public:
	AudioEffect(audioMasterCallback audioMaster, long numPrograms, long numParams);
	virtual ~AudioEffect();

	virtual void setParameter(long index, float value) {index = index; value = value;}
	virtual float getParameter(long index) {index = index; return 0;}
	virtual void setParameterAutomated(long index, float value);

	AEffect *getAeffect() {return &cEffect;}
	void setEditor(AEffEditor *editor)
	{	this->editor = editor;
		if(editor) cEffect.flags |= effFlagsHasEditor;
		else cEffect.flags &= ~effFlagsHasEditor;}

	// called from audio master
	virtual void process(float **inputs, float **outputs, long sampleFrames) = 0;
	virtual void processReplacing(float **inputs, float **outputs, long sampleFrames)
		{inputs = inputs; outputs = outputs; sampleFrames = sampleFrames;}
	virtual long dispatcher(long opCode, long index, long value, void *ptr, float opt);
	virtual void open() {}
	virtual void close() {}
	virtual long getProgram() {return curProgram;}
	virtual void setProgram(long program) {curProgram = program;}	// don't forget to set curProgram
	virtual void setProgramName(char *name) {*name = 0;}			// all following refer to curProgram
	virtual void getProgramName(char *name) {*name = 0;}
	virtual void getParameterLabel(long index, char *label) {index = index; *label = 0;}
	virtual void getParameterDisplay(long index, char *text) {index = index; *text = 0;}
	virtual void getParameterName(long index, char *text) {index = index; *text = 0;}
	virtual float getVu() {return 0;}
	virtual long getChunk(void** data, bool isPreset = false) {return 0;}	// returns byteSize
	virtual long setChunk(void* data, long byteSize, bool isPreset = false) {return 0;}
	virtual void setSampleRate(float sampleRate) {this->sampleRate = sampleRate;}
	virtual void setBlockSize(long blockSize) {this->blockSize = blockSize;}
	virtual void suspend() {}
	virtual void resume() {}

	// setup
	virtual void setUniqueID(long iD) {cEffect.uniqueID = iD;}		// must call this!
	virtual void setNumInputs(long inputs) {cEffect.numInputs = inputs;}
	virtual void setNumOutputs(long outputs) {cEffect.numOutputs = outputs;}
	virtual void hasVu(bool state = true);
	virtual void hasClip(bool state = true);
	virtual void canMono(bool state = true);
	virtual void canProcessReplacing(bool state = true);
	virtual void programsAreChunks(bool state = true);
	virtual void setRealtimeQualities(long qualities);
	virtual void setOfflineQualities(long qualities);
	virtual void setInitialDelay(long delay);

	// inquiry
	virtual float getSampleRate() {return sampleRate;}
	virtual long getBlockSize() {return blockSize;}

	// host communication
	virtual long getMasterVersion();
	virtual long getCurrentUniqueId();
	virtual void masterIdle();
	virtual bool isInputConnected(long input);
	virtual bool isOutputConnected(long output);

	// tools
	virtual void dB2string(float value, char *text);
	virtual void Hz2string(float samples, char *text);
	virtual void ms2string(float samples, char *text);
	virtual void float2string(float value, char *string);
	virtual void long2string(long value, char *text);

protected:	
	// members
	float sampleRate;
	AEffEditor *editor;
	audioMasterCallback audioMaster;
	long numPrograms;
	long numParams;
	long curProgram;
	long blockSize;
	AEffect cEffect;
};

#endif