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