1/*
2 * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com.
3 * All rights reserved.
4 * Distributed under the terms of the MIT License.
5 */
6
7#ifndef __VST_HOST_H__
8#define __VST_HOST_H__
9
10#include <String.h>
11#include <Entry.h>
12#include <Directory.h>
13#include <Path.h>
14#include <List.h>
15
16#include <stdio.h>
17#include <stdlib.h>
18#include <stdint.h>
19#include <image.h>
20#include <string.h>
21#include <ctype.h>
22
23#define VST_PARAM_TEST_COUNT 	100
24
25//error codes
26#define VST_ERR_ALREADY_LOADED 	-1
27#define VST_ERR_NOT_LOADED 		-2
28#define VST_ERR_NO_MAINPROC 	-3
29
30//param types
31#define VST_PARAM_SLIDER	1
32#define VST_PARAM_CHECKBOX  2
33#define VST_PARAM_DROPLIST  3
34
35//channels
36#define VST_INPUT_CHANNELS	1
37#define VST_OUTPUT_CHANNELS	2
38
39//vst callback opcodes
40#define VST_MASTER_AUTOMATE 0x00
41#define VST_MASTER_VERSION 	0x01
42#define VST_MASTER_IDLE 	0x03
43#define VST_MASTER_VENDOR 	0x20
44#define VST_MASTER_PRODUCT	0x21
45
46//vst actions
47#define VST_OPEN			0x00
48#define VST_CLOSE			0x01
49#define	VST_GET_PARAM_UNIT	0x06
50#define VST_GET_PARAM_STR 	0x07
51#define VST_GET_PARAM_NAME	0x08
52#define VST_SET_SAMPLE_RATE	0x0A
53#define VST_SET_BLOCK_SIZE	0x0B
54#define VST_STATE_CHANGED 	0x0C
55#define VST_GET_EFFECT_NAME	0x2D
56#define VST_GET_VENDOR_STR	0x2F
57#define VST_GET_PRODUCT_STR 0x30
58#define VST_GET_VENDOR_VER	0x31
59
60//vst plugin structure
61struct VSTEffect
62{
63		int 			cookie;
64		int32 			(*dispatcher)(struct VSTEffect*, int32,
65								int32, int32, void*, float);
66		void 			(*process)(struct VSTEffect*, float**,
67								float**, int32);
68		void 			(*setParameter)(struct VSTEffect*, int32, float);
69		float 			(*getParameter)(struct VSTEffect*, int32);
70		int32 			numPrograms;
71		int32 			numParams;
72		int32 			numInputs;
73		int32 			numOutputs;
74		int32 			flags;
75		void*			_notused_pointer1;
76		void*			_notused_pointer2;
77		char 			_notused_block1[12];
78		float 			_notused_float;
79		void*			_notused_pointer3;
80		void*			_notused_pointer4;
81		int32 			ID;
82		char 			_notused_block2[4];
83		void 			(*processReplacing)(struct VSTEffect*,
84								float**, float**, int);
85};
86
87//typedefs
88typedef int32			(*audioMasterCallback)(VSTEffect*, int32, int32, int32, void*, float);
89typedef VSTEffect* 		(*VSTEntryProc)(audioMasterCallback audioMaster);
90inline 	float 			vstround(float x) {return ceil(x-0.5);}
91
92//structure for droplist parameters
93struct  DropListValue {
94		int				Index;
95		float 			Value;
96		BString 		Name;
97};
98
99class VSTPlugin;
100//vst parameter class adapter
101class VSTParameter {
102public:
103						VSTParameter(VSTPlugin* plugin, int index);
104						~VSTParameter();
105		float			Value(void);
106		void			SetValue(float value);
107		const char*		MinimumValue(void);
108		const char*		MaximumValue(void);
109		const char*		Unit(void);
110		int				Index(void);
111		int				Type(void);
112		const char*		Name(void);
113		int				ListCount(void);
114		DropListValue*	ListItemAt(int index);
115		bigtime_t		LastChangeTime(void);
116private:
117		BString*		ValidateValues(BString *string);
118		VSTPlugin* 		fPlugin;
119		VSTEffect*		fEffect;
120		int				fIndex;
121		int				fType;
122		BString			fName;
123		BString			fUnit;
124		BString			fMinValue;
125		BString			fMaxValue;
126		BList			fDropList;
127		bigtime_t		fChanged;
128		float			fLastValue;
129};
130
131//vst plugin interface
132class VSTPlugin {
133public:
134						VSTPlugin();
135						~VSTPlugin();
136		int				LoadModule(const char *path);
137		int 			UnLoadModule(void);
138		int				SetSampleRate(float rate);
139		float			SampleRate(void);
140		int 			SetBlockSize(size_t size);
141		const char*		Path(void);
142		size_t			BlockSize(void);
143		VSTEffect*		Effect(void);
144		const char*		EffectName(void);
145		const char*		ModuleName(void);
146		const char*		Vendor(void);
147		const char*		Product(void);
148		int				ParametersCount(void);
149		VSTParameter*	Parameter(int index);
150		int				Channels(int mode);
151		int				ReAllocBuffers(void);
152		void			Process(float *buffer, int samples, int channels);
153private:
154		VSTEntryProc 	GetMainEntry();
155		VSTEffect*		fEffect;
156		VSTEntryProc	VSTMainProc;
157		bool			fActive;
158		image_id 		fModule;
159		BPath			fPath;
160		size_t			fBlockSize;
161		float			fSampleRate;
162		int				fInputChannels;
163		int				fOutputChannels;
164		BString			fModuleName;
165		BString			fEffectName;
166		BString			fVendorString;
167		BString			fProductString;
168		BList			fParameters;
169		float**			inputs;
170		float**			outputs;
171};
172
173#endif //__VST_HOST_H__
174