[haiku-commits] haiku: hrev51966 - src/add-ons/media/media-add-ons/vst_host

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 21 May 2018 17:58:08 -0400 (EDT)

hrev51966 adds 1 changeset to branch 'master'
old head: 20aff1c8ca00649235d63a8e82b83ec11f254ef3
new head: 66e852769e9688e327d77ea5bb2ec43aaec6023d
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=66e852769e96+%5E20aff1c8ca00

----------------------------------------------------------------------------

66e852769e96: VSTHost: Fix the build on GCC 7.
  
  rename round -> vstround.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev51966
Commit:      66e852769e9688e327d77ea5bb2ec43aaec6023d
URL:         https://git.haiku-os.org/haiku/commit/?id=66e852769e96
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon May 21 21:55:35 2018 UTC

----------------------------------------------------------------------------

2 files changed, 566 insertions(+), 566 deletions(-)
.../media/media-add-ons/vst_host/VSTHost.cpp     | 1118 +++++++++---------
.../media/media-add-ons/vst_host/VSTHost.h       |   14 +-

----------------------------------------------------------------------------

diff --git a/src/add-ons/media/media-add-ons/vst_host/VSTHost.cpp 
b/src/add-ons/media/media-add-ons/vst_host/VSTHost.cpp
index 2626226131..d8fe4bd0b4 100644
--- a/src/add-ons/media/media-add-ons/vst_host/VSTHost.cpp
+++ b/src/add-ons/media/media-add-ons/vst_host/VSTHost.cpp
@@ -1,559 +1,559 @@
-/*
- * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@xxxxxxxxx.
- * All rights reserved.
- * Distributed under the terms of the MIT License.
- */ 

-#include <stdio.h>
-#include <stdlib.h>
-#include <image.h>
-
-#include <Application.h>
-
-#include "VSTHost.h"
-
-static int32 VHostCallback(VSTEffect* effect, int32 opcode, int32 index,
-       int32 value, void* ptr, float opt);
-
-//Trim string
-static void
-TrimString(BString *string) {
-       char* str = string->LockBuffer(256);
-    uint32 k = 0;
-    uint32 i = 0;
-    for(i=0; str[i]!='\0';) {
-        if (isspace(str[i])) {
-            k = i;
-            for(uint32 j = i; j < strlen(str) - 1; j++)
-                str[j] = str[j + 1];
-            str[strlen(str) - 1] = '\0';
-            i = k;
-        } else
-            i++;
-    }
-    string->UnlockBuffer();
-}
-
-//VST Parameter class
-VSTParameter::VSTParameter(VSTPlugin* plugin, int index)
-{
-       fIndex = index;
-       fEffect = plugin->Effect();
-       fDropList.MakeEmpty();
-
-       char temp[256]; 
-       //get parameter name
-       temp[0] = 0;
-       fEffect->dispatcher(fEffect, VST_GET_PARAM_NAME, index, 0, temp, 0);
-       fName.SetTo(temp);
-       TrimString(&fName);
-       //get parameter label (unit)
-       temp[0] = 0;
-       fEffect->dispatcher(fEffect, VST_GET_PARAM_UNIT, index, 0, temp, 0);
-       fUnit.SetTo(temp);
-       ValidateValues(&fUnit);
-       //store current value
-       float val = fEffect->getParameter(fEffect, index);
-       //test for minimum value
-       fEffect->setParameter(fEffect, index, 0);
-       temp[0] = 0;
-       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index, 0, temp, 0);
-       fMinValue.SetTo(temp);
-       ValidateValues(&fMinValue);
-       //test for maximum value
-       temp[0] = 0;
-       fEffect->setParameter(fEffect, index, 1.0);
-       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index, 0, temp, 0);
-       fMaxValue.SetTo(temp);  
-       ValidateValues(&fMaxValue);
-       //test for discrete values
-       char test_disp[VST_PARAM_TEST_COUNT][256];
-       float test_values[VST_PARAM_TEST_COUNT];
-       float delta = 1.0 / (float)VST_PARAM_TEST_COUNT;
-       int test_cnt = 0;
-       for(int tst_val = 0; tst_val < VST_PARAM_TEST_COUNT; tst_val++) {
-               float v = (float)tst_val / (float)VST_PARAM_TEST_COUNT;
-
-               if (tst_val >= VST_PARAM_TEST_COUNT - 1)
-                       v = 1.0;
-
-               fEffect->setParameter(fEffect, index, v);
-
-               float new_value = fEffect->getParameter(fEffect, index);
-               bool valtest = false;
-               for(int i = 0; i < test_cnt; i++) {
-                       if (fabs(test_values[i] - new_value) < delta) {
-                               valtest = true;
-                               break;
-                       }
-               }
-               if (valtest == false) {
-                       test_values[test_cnt] = new_value;
-                       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index,
-                               0, test_disp[test_cnt], 0);
-                       test_cnt++;
-               }
-       }
-                                               
-       //restore value
-       fEffect->setParameter(fEffect, index, val);
-               
-       //detect param type
-       if (test_cnt == 2) {
-               fType = VST_PARAM_CHECKBOX;
-               
-               DropListValue* min_item = new DropListValue();
-               min_item->Value = 0.0;
-               min_item->Index = 0;
-               min_item->Name = fMinValue;
-               fDropList.AddItem(min_item);
-               
-               DropListValue* max_item = new DropListValue();
-               max_item->Value = 1.0;
-               max_item->Index = 1;
-               max_item->Name = fMaxValue;
-               fDropList.AddItem(max_item);            
-       } else if (test_cnt > 2 && test_cnt < VST_PARAM_TEST_COUNT / 2) {
-               fType = VST_PARAM_DROPLIST;
-               
-               for(int i = 0; i < test_cnt; i++) {
-                       DropListValue* item = new DropListValue();
-                       item->Value = test_values[i];
-                       item->Index = i;
-                       item->Name = test_disp[i];
-                       fDropList.AddItem(item);
-               }               
-       } else {
-               fType = VST_PARAM_SLIDER;
-       }
-       fChanged = 0LL;
-}
-
-VSTParameter::~VSTParameter()
-{      
-}
-
-BString*
-VSTParameter::ValidateValues(BString* string)
-{      
-       if (string->Length() == 0)
-               return string;
-               
-       bool isNum = true;
-       
-       const char *ptr = string->String();
-       for(; *ptr!=0; ptr++) {
-               char ch = *ptr;
-               if (!((ch >= '0' && ch <= '9') || ch == '.' || ch == '-')) {
-                       isNum = false;
-                       break;
-               }
-       }
-       
-       if (isNum) {
-               float val = atof(string->String());
-
-               if (val <= -pow(2, 31)) {
-                       string->SetTo("-∞");
-               } else if (val >= pow(2, 31)) {
-                       string->SetTo("∞");
-               } else {
-                       char temp[256];
-                       sprintf(temp, "%g", val);
-                       string->SetTo(temp);
-               }
-       } else {
-               TrimString(string);
-               if (*string == "oo" || *string == "inf")
-                       string->SetTo("∞");
-               if (*string == "-oo" || *string == "-inf")
-                       string->SetTo("-∞");
-               
-       }       
-       return string;
-}
-
-int
-VSTParameter::ListCount(void)
-{
-       return fDropList.CountItems();
-}
-
-DropListValue*
-VSTParameter::ListItemAt(int index)
-{
-       DropListValue* item = NULL;
-       if (index >= 0 && index < fDropList.CountItems())
-               item = (DropListValue*)fDropList.ItemAt(index);
-       return item;
-}
-
-
-float
-VSTParameter::Value()
-{      
-       float value = fEffect->getParameter(fEffect, fIndex);
-       if (fType == VST_PARAM_DROPLIST) {
-               //scan for near value
-               int     min_index = 0;
-               float min_delta = 1.0;
-               for(int i = 0; i < fDropList.CountItems(); i++) {
-                       DropListValue* item = 
(DropListValue*)fDropList.ItemAt(i);
-                       float delta     = fabs(item->Value - value);
-                       if (delta <= min_delta) {
-                               min_delta = delta;
-                               min_index = i;
-                       }
-               }
-               value = min_index;
-       }
-       fLastValue = value;
-       return value;
-}
-
-void
-VSTParameter::SetValue(float value)
-{
-       if (value == fLastValue)
-               return;
-       
-       if (fType == VST_PARAM_DROPLIST) {
-               //take value by index
-               int index = (int)round(value);
-               if (index >= 0 && index < fDropList.CountItems()) {
-                       DropListValue *item = 
(DropListValue*)fDropList.ItemAt(index);
-                       value = item->Value;
-                       fLastValue = index;
-               } else {
-                       return;
-               }
-       } else {
-               fLastValue = value;
-       }
-       fChanged = system_time();
-       fEffect->setParameter(fEffect, fIndex, value);
-}
-
-bigtime_t
-VSTParameter::LastChangeTime(void)
-{
-       return fChanged;
-}
-
-const char*
-VSTParameter::MinimumValue(void)
-{
-       return fMinValue.String();
-}
-
-const char*
-VSTParameter::MaximumValue(void)
-{
-       return fMaxValue.String();
-}
-
-const char*
-VSTParameter::Unit(void)
-{
-       return fUnit.String();
-}
-
-int
-VSTParameter::Index(void)
-{
-       return fIndex;
-}
-
-int
-VSTParameter::Type(void)
-{
-       return fType;
-}
-
-const char*
-VSTParameter::Name(void)
-{
-       return fName.String();
-}
-
-//VST Plugin class
-VSTPlugin::VSTPlugin()
-{
-       fActive = false;
-       fEffect = NULL;
-       VSTMainProc = NULL;
-       fInputChannels = 0;
-       fOutputChannels = 0;
-       fSampleRate = 44100.f;
-       fBlockSize = 0;
-       inputs = NULL;
-       outputs = NULL;
-       fParameters.MakeEmpty();
-}
-
-VSTPlugin::~VSTPlugin()
-{
-       fParameters.MakeEmpty();
-       UnLoadModule();
-}
-
-int
-VSTPlugin::LoadModule(const char *path)
-{
-       char effectName[256] = {0};
-       char vendorString[256] = {0};
-       char productString[256] = {0};
-
-       if (fActive)
-               return VST_ERR_ALREADY_LOADED;
-
-       fPath = BPath(path);
-       
-       fModule = load_add_on(path);
-       if (fModule <= 0)
-               return VST_ERR_NOT_LOADED;
-
-       if (get_image_symbol(fModule, "main_plugin", B_SYMBOL_TYPE_TEXT,
-                       (void**)&VSTMainProc) != B_OK) {
-               unload_add_on(fModule);
-               return VST_ERR_NO_MAINPROC;
-       }               
-       
-       fEffect = VSTMainProc(VHostCallback);
-       if (fEffect==NULL) {
-               unload_add_on(fModule);
-               return VST_ERR_NOT_LOADED;
-       }
-       
-       fEffect->dispatcher(fEffect, VST_OPEN, 0, 0, 0, 0);
-               
-       fEffect->dispatcher(fEffect, VST_GET_EFFECT_NAME, 0, 0, effectName, 0);
-       fEffectName.SetTo(effectName);
-       TrimString(&fEffectName);
-       
-       fModuleName.SetTo("VST:");
-       fModuleName.Append(fPath.Leaf());
-       
-       fEffect->dispatcher(fEffect, VST_GET_VENDOR_STR, 0, 0, vendorString, 0);
-       fVendorString.SetTo(vendorString);
-       TrimString(&fVendorString);
-       
-       fEffect->dispatcher(fEffect, VST_GET_PRODUCT_STR, 0, 0, productString, 
0);
-       fProductString.SetTo(productString);    
-       TrimString(&fProductString);
-       
-       fInputChannels = fEffect->numInputs;
-       fOutputChannels = fEffect->numOutputs;
-       
-       for(int i=0; i < fEffect->numParams; i++) {
-               VSTParameter *param = new VSTParameter(this, i);
-               fParameters.AddItem(param);
-       }
-       
-       fEffect->dispatcher(fEffect, VST_STATE_CHANGED, 0, 1, 0, 0);
-       
-       ReAllocBuffers();
-       
-       fActive = true;
-       return B_OK;
-}
-
-int
-VSTPlugin::UnLoadModule(void)
-{
-       if (!fActive || fModule <= 0)
-               return VST_ERR_NOT_LOADED;
-
-       fEffect->dispatcher(fEffect, VST_STATE_CHANGED, 0, 0, 0, 0);
-       fEffect->dispatcher(fEffect, VST_CLOSE, 0, 0, 0, 0);
-       
-       unload_add_on(fModule);
-       
-       return B_OK;
-}
-
-int
-VSTPlugin::Channels(int mode)
-{
-       switch(mode) {
-               case VST_INPUT_CHANNELS:
-                       return fInputChannels;
-               case VST_OUTPUT_CHANNELS:
-                       return fOutputChannels;
-               default:
-                       return 0;
-       }       
-}
-
-int
-VSTPlugin::SetSampleRate(float rate)
-{
-       fSampleRate = rate;
-       fEffect->dispatcher(fEffect, VST_SET_SAMPLE_RATE, 0, 0, 0, rate);
-       return B_OK;
-}
-
-float
-VSTPlugin::SampleRate(void)
-{
-       return fSampleRate;
-}
-
-int
-VSTPlugin::SetBlockSize(size_t size)
-{
-       fBlockSize = size;
-       fEffect->dispatcher(fEffect, VST_SET_BLOCK_SIZE, 0, size, 0, 0);
-       ReAllocBuffers();
-       return B_OK;
-}
-
-const char*
-VSTPlugin::Path(void)
-{
-       return fPath.Path();
-}
-
-int
-VSTPlugin::ReAllocBuffers(void)
-{
-       if (inputs != NULL) {
-               for(int32 i = 0; i < fInputChannels; i++)
-                       delete inputs[i];
-       }
-       
-       if (outputs != NULL) {
-               for(int32 i = 0; i < fOutputChannels; i++)
-                       delete outputs[i];
-       }
-       
-       if (fInputChannels > 0) {
-               inputs = new float*[fInputChannels];
-               for(int32 i = 0; i < fInputChannels; i++)       {
-                       inputs[i] = new float[fBlockSize]; 
-                       memset(inputs[i], 0, fBlockSize * sizeof(float)); 
-               }
-       } 

-       if (fOutputChannels > 0) { 
-               outputs = new float*[fOutputChannels];
-               for(int32_t i = 0; i < fOutputChannels; i++) {
-                       outputs[i] = new float[fBlockSize];
-                       memset (outputs[i], 0, fBlockSize * sizeof(float));
-               }
-       }
-       return B_OK;
-}
-
-size_t
-VSTPlugin::BlockSize(void)
-{
-       return fBlockSize;
-}
-
-int
-VSTPlugin::ParametersCount(void)
-{
-       return fParameters.CountItems();
-}
-
-VSTParameter*
-VSTPlugin::Parameter(int index)
-{
-       VSTParameter* param = NULL;
-       
-       if (index >= 0 && index < fParameters.CountItems())
-               param = (VSTParameter*)fParameters.ItemAt(index);
-       
-       return param;
-}
-
-VSTEffect*
-VSTPlugin::Effect(void)
-{
-       return fEffect;
-}
-
-const char*
-VSTPlugin::EffectName(void)
-{
-       return fEffectName.String();
-}
-
-const char*
-VSTPlugin::ModuleName(void)
-{
-       return fModuleName.String();
-}
-
-const char*
-VSTPlugin::Vendor(void)
-{
-       return fVendorString.String();
-}
-
-const char*
-VSTPlugin::Product(void)
-{
-       return fProductString.String();
-}
-
-
-void
-VSTPlugin::Process(float *buffer, int samples, int channels)
-{      
-       //todo: full channels remapping needed
-       float* src = buffer;
-       
-       if (channels == fInputChannels) { //channel to channel
-               for(int j = 0; j < samples; j++) {
-                       for(int c = 0; c < fInputChannels; c++)
-                               inputs[c][j] = *src++;
-               }
-       } else if ( channels == 1) {    //from mone to multichannel
-               for(int j = 0; j < samples; j++, src++) {
-                       for(int c = 0; c < fInputChannels; c++)
-                               inputs[c][j] = *src;
-               }
-       }
-               
-       fEffect->processReplacing(fEffect, inputs, outputs, fBlockSize);
-       
-       float* dst = buffer;
-       
-       if (channels == fOutputChannels) { //channel to channel
-               for(int j = 0; j < samples; j++) {
-                       for(int c = 0; c < fOutputChannels; c++)
-                               *dst++ = outputs[c][j];
-               }
-       } else if (channels == 1) {  //from multichannel to mono
-               for(int j = 0; j < samples; j++, dst++) {
-                       float mix = 0;
-                       for(int c = 0; c < fOutputChannels; c++)
-                               mix += outputs[c][j];
-                       *dst = mix / (float)fOutputChannels;
-               }               
-       }
-}
-
-static int32 
-VHostCallback(VSTEffect* effect, int32 opcode, int32 index, int32 value,
-       void* ptr, float opt)
-{
-       intptr_t result = 0;

-       switch(opcode)
-       {
-               case VST_MASTER_PRODUCT:
-                       if (ptr) {
-                               strcpy((char*)ptr, "VSTHost Media AddOn");
-                               result = 1;
-                       }
-                       break;           
-               case VST_MASTER_VERSION :
-                       result = 2300;
-                       break;
-       }
-
-       return result;
-}
+/*
+ * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@xxxxxxxxx.
+ * All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <image.h>
+
+#include <Application.h>
+
+#include "VSTHost.h"
+
+static int32 VHostCallback(VSTEffect* effect, int32 opcode, int32 index,
+       int32 value, void* ptr, float opt);
+
+//Trim string
+static void
+TrimString(BString *string) {
+       char* str = string->LockBuffer(256);
+    uint32 k = 0;
+    uint32 i = 0;
+    for(i=0; str[i]!='\0';) {
+        if (isspace(str[i])) {
+            k = i;
+            for(uint32 j = i; j < strlen(str) - 1; j++)
+                str[j] = str[j + 1];
+            str[strlen(str) - 1] = '\0';
+            i = k;
+        } else
+            i++;
+    }
+    string->UnlockBuffer();
+}
+
+//VST Parameter class
+VSTParameter::VSTParameter(VSTPlugin* plugin, int index)
+{
+       fIndex = index;
+       fEffect = plugin->Effect();
+       fDropList.MakeEmpty();
+
+       char temp[256];
+       //get parameter name
+       temp[0] = 0;
+       fEffect->dispatcher(fEffect, VST_GET_PARAM_NAME, index, 0, temp, 0);
+       fName.SetTo(temp);
+       TrimString(&fName);
+       //get parameter label (unit)
+       temp[0] = 0;
+       fEffect->dispatcher(fEffect, VST_GET_PARAM_UNIT, index, 0, temp, 0);
+       fUnit.SetTo(temp);
+       ValidateValues(&fUnit);
+       //store current value
+       float val = fEffect->getParameter(fEffect, index);
+       //test for minimum value
+       fEffect->setParameter(fEffect, index, 0);
+       temp[0] = 0;
+       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index, 0, temp, 0);
+       fMinValue.SetTo(temp);
+       ValidateValues(&fMinValue);
+       //test for maximum value
+       temp[0] = 0;
+       fEffect->setParameter(fEffect, index, 1.0);
+       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index, 0, temp, 0);
+       fMaxValue.SetTo(temp);
+       ValidateValues(&fMaxValue);
+       //test for discrete values
+       char test_disp[VST_PARAM_TEST_COUNT][256];
+       float test_values[VST_PARAM_TEST_COUNT];
+       float delta = 1.0 / (float)VST_PARAM_TEST_COUNT;
+       int test_cnt = 0;
+       for(int tst_val = 0; tst_val < VST_PARAM_TEST_COUNT; tst_val++) {
+               float v = (float)tst_val / (float)VST_PARAM_TEST_COUNT;
+
+               if (tst_val >= VST_PARAM_TEST_COUNT - 1)
+                       v = 1.0;
+
+               fEffect->setParameter(fEffect, index, v);
+
+               float new_value = fEffect->getParameter(fEffect, index);
+               bool valtest = false;
+               for(int i = 0; i < test_cnt; i++) {
+                       if (fabs(test_values[i] - new_value) < delta) {
+                               valtest = true;
+                               break;
+                       }
+               }
+               if (valtest == false) {
+                       test_values[test_cnt] = new_value;
+                       fEffect->dispatcher(fEffect, VST_GET_PARAM_STR, index,
+                               0, test_disp[test_cnt], 0);
+                       test_cnt++;
+               }
+       }
+
+       //restore value
+       fEffect->setParameter(fEffect, index, val);
+
+       //detect param type
+       if (test_cnt == 2) {
+               fType = VST_PARAM_CHECKBOX;
+
+               DropListValue* min_item = new DropListValue();
+               min_item->Value = 0.0;
+               min_item->Index = 0;
+               min_item->Name = fMinValue;
+               fDropList.AddItem(min_item);
+
+               DropListValue* max_item = new DropListValue();
+               max_item->Value = 1.0;
+               max_item->Index = 1;
+               max_item->Name = fMaxValue;
+               fDropList.AddItem(max_item);
+       } else if (test_cnt > 2 && test_cnt < VST_PARAM_TEST_COUNT / 2) {
+               fType = VST_PARAM_DROPLIST;
+
+               for(int i = 0; i < test_cnt; i++) {
+                       DropListValue* item = new DropListValue();
+                       item->Value = test_values[i];
+                       item->Index = i;
+                       item->Name = test_disp[i];
+                       fDropList.AddItem(item);
+               }
+       } else {
+               fType = VST_PARAM_SLIDER;
+       }
+       fChanged = 0LL;
+}
+
+VSTParameter::~VSTParameter()
+{
+}
+
+BString*
+VSTParameter::ValidateValues(BString* string)
+{
+       if (string->Length() == 0)
+               return string;
+
+       bool isNum = true;
+
+       const char *ptr = string->String();
+       for(; *ptr!=0; ptr++) {
+               char ch = *ptr;
+               if (!((ch >= '0' && ch <= '9') || ch == '.' || ch == '-')) {
+                       isNum = false;
+                       break;
+               }
+       }
+
+       if (isNum) {
+               float val = atof(string->String());
+
+               if (val <= -pow(2, 31)) {
+                       string->SetTo("-∞");
+               } else if (val >= pow(2, 31)) {
+                       string->SetTo("∞");
+               } else {
+                       char temp[256];
+                       sprintf(temp, "%g", val);
+                       string->SetTo(temp);
+               }
+       } else {
+               TrimString(string);
+               if (*string == "oo" || *string == "inf")
+                       string->SetTo("∞");
+               if (*string == "-oo" || *string == "-inf")
+                       string->SetTo("-∞");
+
+       }
+       return string;
+}
+
+int
+VSTParameter::ListCount(void)
+{
+       return fDropList.CountItems();
+}
+
+DropListValue*
+VSTParameter::ListItemAt(int index)
+{
+       DropListValue* item = NULL;
+       if (index >= 0 && index < fDropList.CountItems())
+               item = (DropListValue*)fDropList.ItemAt(index);
+       return item;
+}
+
+
+float
+VSTParameter::Value()
+{
+       float value = fEffect->getParameter(fEffect, fIndex);
+       if (fType == VST_PARAM_DROPLIST) {
+               //scan for near value
+               int     min_index = 0;
+               float min_delta = 1.0;
+               for(int i = 0; i < fDropList.CountItems(); i++) {
+                       DropListValue* item = 
(DropListValue*)fDropList.ItemAt(i);
+                       float delta     = fabs(item->Value - value);
+                       if (delta <= min_delta) {
+                               min_delta = delta;
+                               min_index = i;
+                       }
+               }
+               value = min_index;
+       }
+       fLastValue = value;
+       return value;
+}
+
+void
+VSTParameter::SetValue(float value)
+{
+       if (value == fLastValue)
+               return;
+
+       if (fType == VST_PARAM_DROPLIST) {
+               //take value by index
+               int index = (int)vstround(value);
+               if (index >= 0 && index < fDropList.CountItems()) {
+                       DropListValue *item = 
(DropListValue*)fDropList.ItemAt(index);
+                       value = item->Value;
+                       fLastValue = index;
+               } else {
+                       return;
+               }
+       } else {
+               fLastValue = value;
+       }
+       fChanged = system_time();
+       fEffect->setParameter(fEffect, fIndex, value);
+}
+
+bigtime_t
+VSTParameter::LastChangeTime(void)
+{
+       return fChanged;
+}
+
+const char*
+VSTParameter::MinimumValue(void)
+{
+       return fMinValue.String();
+}
+
+const char*
+VSTParameter::MaximumValue(void)
+{
+       return fMaxValue.String();
+}
+
+const char*
+VSTParameter::Unit(void)
+{
+       return fUnit.String();
+}
+
+int
+VSTParameter::Index(void)
+{
+       return fIndex;
+}
+
+int
+VSTParameter::Type(void)
+{
+       return fType;
+}
+
+const char*
+VSTParameter::Name(void)
+{
+       return fName.String();
+}
+
+//VST Plugin class
+VSTPlugin::VSTPlugin()
+{
+       fActive = false;
+       fEffect = NULL;
+       VSTMainProc = NULL;
+       fInputChannels = 0;
+       fOutputChannels = 0;
+       fSampleRate = 44100.f;
+       fBlockSize = 0;
+       inputs = NULL;
+       outputs = NULL;
+       fParameters.MakeEmpty();
+}
+
+VSTPlugin::~VSTPlugin()
+{
+       fParameters.MakeEmpty();
+       UnLoadModule();
+}
+
+int
+VSTPlugin::LoadModule(const char *path)
+{
+       char effectName[256] = {0};
+       char vendorString[256] = {0};
+       char productString[256] = {0};
+
+       if (fActive)
+               return VST_ERR_ALREADY_LOADED;
+
+       fPath = BPath(path);
+
+       fModule = load_add_on(path);
+       if (fModule <= 0)
+               return VST_ERR_NOT_LOADED;
+
+       if (get_image_symbol(fModule, "main_plugin", B_SYMBOL_TYPE_TEXT,
+                       (void**)&VSTMainProc) != B_OK) {
+               unload_add_on(fModule);
+               return VST_ERR_NO_MAINPROC;
+       }
+
+       fEffect = VSTMainProc(VHostCallback);
+       if (fEffect==NULL) {
+               unload_add_on(fModule);
+               return VST_ERR_NOT_LOADED;
+       }
+
+       fEffect->dispatcher(fEffect, VST_OPEN, 0, 0, 0, 0);
+
+       fEffect->dispatcher(fEffect, VST_GET_EFFECT_NAME, 0, 0, effectName, 0);
+       fEffectName.SetTo(effectName);
+       TrimString(&fEffectName);
+
+       fModuleName.SetTo("VST:");
+       fModuleName.Append(fPath.Leaf());
+
+       fEffect->dispatcher(fEffect, VST_GET_VENDOR_STR, 0, 0, vendorString, 0);
+       fVendorString.SetTo(vendorString);
+       TrimString(&fVendorString);
+
+       fEffect->dispatcher(fEffect, VST_GET_PRODUCT_STR, 0, 0, productString, 
0);
+       fProductString.SetTo(productString);
+       TrimString(&fProductString);
+
+       fInputChannels = fEffect->numInputs;
+       fOutputChannels = fEffect->numOutputs;
+
+       for(int i=0; i < fEffect->numParams; i++) {
+               VSTParameter *param = new VSTParameter(this, i);
+               fParameters.AddItem(param);
+       }
+
+       fEffect->dispatcher(fEffect, VST_STATE_CHANGED, 0, 1, 0, 0);
+
+       ReAllocBuffers();
+
+       fActive = true;
+       return B_OK;
+}
+
+int
+VSTPlugin::UnLoadModule(void)
+{
+       if (!fActive || fModule <= 0)
+               return VST_ERR_NOT_LOADED;
+
+       fEffect->dispatcher(fEffect, VST_STATE_CHANGED, 0, 0, 0, 0);
+       fEffect->dispatcher(fEffect, VST_CLOSE, 0, 0, 0, 0);
+
+       unload_add_on(fModule);
+
+       return B_OK;
+}
+
+int
+VSTPlugin::Channels(int mode)
+{
+       switch(mode) {
+               case VST_INPUT_CHANNELS:
+                       return fInputChannels;
+               case VST_OUTPUT_CHANNELS:
+                       return fOutputChannels;
+               default:
+                       return 0;
+       }
+}
+
+int
+VSTPlugin::SetSampleRate(float rate)
+{
+       fSampleRate = rate;
+       fEffect->dispatcher(fEffect, VST_SET_SAMPLE_RATE, 0, 0, 0, rate);
+       return B_OK;
+}
+
+float
+VSTPlugin::SampleRate(void)
+{
+       return fSampleRate;
+}
+
+int
+VSTPlugin::SetBlockSize(size_t size)
+{
+       fBlockSize = size;
+       fEffect->dispatcher(fEffect, VST_SET_BLOCK_SIZE, 0, size, 0, 0);
+       ReAllocBuffers();
+       return B_OK;
+}
+
+const char*
+VSTPlugin::Path(void)
+{
+       return fPath.Path();
+}
+
+int
+VSTPlugin::ReAllocBuffers(void)
+{
+       if (inputs != NULL) {
+               for(int32 i = 0; i < fInputChannels; i++)
+                       delete inputs[i];
+       }
+
+       if (outputs != NULL) {
+               for(int32 i = 0; i < fOutputChannels; i++)
+                       delete outputs[i];
+       }
+
+       if (fInputChannels > 0) {
+               inputs = new float*[fInputChannels];
+               for(int32 i = 0; i < fInputChannels; i++)       {
+                       inputs[i] = new float[fBlockSize];
+                       memset(inputs[i], 0, fBlockSize * sizeof(float));
+               }
+       }
+
+       if (fOutputChannels > 0) {
+               outputs = new float*[fOutputChannels];
+               for(int32_t i = 0; i < fOutputChannels; i++) {
+                       outputs[i] = new float[fBlockSize];
+                       memset (outputs[i], 0, fBlockSize * sizeof(float));
+               }
+       }
+       return B_OK;
+}
+
+size_t
+VSTPlugin::BlockSize(void)
+{
+       return fBlockSize;
+}
+
+int
+VSTPlugin::ParametersCount(void)
+{
+       return fParameters.CountItems();
+}
+
+VSTParameter*
+VSTPlugin::Parameter(int index)
+{
+       VSTParameter* param = NULL;
+
+       if (index >= 0 && index < fParameters.CountItems())
+               param = (VSTParameter*)fParameters.ItemAt(index);
+
+       return param;
+}
+
+VSTEffect*
+VSTPlugin::Effect(void)
+{
+       return fEffect;
+}
+
+const char*
+VSTPlugin::EffectName(void)
+{
+       return fEffectName.String();
+}
+
+const char*
+VSTPlugin::ModuleName(void)
+{
+       return fModuleName.String();
+}
+
+const char*
+VSTPlugin::Vendor(void)
+{
+       return fVendorString.String();
+}
+
+const char*
+VSTPlugin::Product(void)
+{
+       return fProductString.String();
+}
+
+
+void
+VSTPlugin::Process(float *buffer, int samples, int channels)
+{
+       //todo: full channels remapping needed
+       float* src = buffer;
+
+       if (channels == fInputChannels) { //channel to channel
+               for(int j = 0; j < samples; j++) {
+                       for(int c = 0; c < fInputChannels; c++)
+                               inputs[c][j] = *src++;
+               }
+       } else if ( channels == 1) {    //from mone to multichannel
+               for(int j = 0; j < samples; j++, src++) {
+                       for(int c = 0; c < fInputChannels; c++)
+                               inputs[c][j] = *src;
+               }
+       }
+
+       fEffect->processReplacing(fEffect, inputs, outputs, fBlockSize);
+
+       float* dst = buffer;
+
+       if (channels == fOutputChannels) { //channel to channel
+               for(int j = 0; j < samples; j++) {
+                       for(int c = 0; c < fOutputChannels; c++)
+                               *dst++ = outputs[c][j];
+               }
+       } else if (channels == 1) {  //from multichannel to mono
+               for(int j = 0; j < samples; j++, dst++) {
+                       float mix = 0;
+                       for(int c = 0; c < fOutputChannels; c++)
+                               mix += outputs[c][j];
+                       *dst = mix / (float)fOutputChannels;
+               }
+       }
+}
+
+static int32
+VHostCallback(VSTEffect* effect, int32 opcode, int32 index, int32 value,
+       void* ptr, float opt)
+{
+       intptr_t result = 0;
+
+       switch(opcode)
+       {
+               case VST_MASTER_PRODUCT:
+                       if (ptr) {
+                               strcpy((char*)ptr, "VSTHost Media AddOn");
+                               result = 1;
+                       }
+                       break;
+               case VST_MASTER_VERSION :
+                       result = 2300;
+                       break;
+       }
+
+       return result;
+}
diff --git a/src/add-ons/media/media-add-ons/vst_host/VSTHost.h 
b/src/add-ons/media/media-add-ons/vst_host/VSTHost.h
index 914e37efae..1689fac829 100644
--- a/src/add-ons/media/media-add-ons/vst_host/VSTHost.h
+++ b/src/add-ons/media/media-add-ons/vst_host/VSTHost.h
@@ -2,8 +2,8 @@
  * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@xxxxxxxxx.
  * All rights reserved.
  * Distributed under the terms of the MIT License.
- */ 

+ */
+
 #ifndef __VST_HOST_H__
 #define __VST_HOST_H__
 
@@ -61,7 +61,7 @@
 struct VSTEffect
 {
                int                     cookie;
-               int32                   (*dispatcher)(struct VSTEffect*, int32, 
+               int32                   (*dispatcher)(struct VSTEffect*, int32,
                                                                int32, int32, 
void*, float);
                void                    (*process)(struct VSTEffect*, float**,
                                                                float**, int32);
@@ -87,7 +87,7 @@ struct VSTEffect
 //typedefs
 typedef int32                  (*audioMasterCallback)(VSTEffect*, int32, 
int32, int32, void*, float);
 typedef VSTEffect*             (*VSTEntryProc)(audioMasterCallback 
audioMaster);
-inline         float                   round(float x) {return ceil(x-0.5);}
+inline         float                   vstround(float x) {return ceil(x-0.5);}
 
 //structure for droplist parameters
 struct  DropListValue {
@@ -130,7 +130,7 @@ private:
 
 //vst plugin interface
 class VSTPlugin {
-public:        
+public:
                                                VSTPlugin();
                                                ~VSTPlugin();
                int                             LoadModule(const char *path);
@@ -150,11 +150,11 @@ public:
                int                             Channels(int mode);
                int                             ReAllocBuffers(void);
                void                    Process(float *buffer, int samples, int 
channels);
-private:               
+private:
                VSTEntryProc    GetMainEntry();
                VSTEffect*              fEffect;
                VSTEntryProc    VSTMainProc;
-               bool                    fActive;                
+               bool                    fActive;
                image_id                fModule;
                BPath                   fPath;
                size_t                  fBlockSize;


Other related posts:

  • » [haiku-commits] haiku: hrev51966 - src/add-ons/media/media-add-ons/vst_host - waddlesplash