Browse Source

CV Plugin now works properly - settings restored correctly on load

master
waxfrenzy 22 years ago
parent
commit
1273045107
4 changed files with 237 additions and 87 deletions
  1. +75
    -26
      SpiralSound/Plugins/ControllerPlugin/ControllerPlugin.C
  2. +14
    -6
      SpiralSound/Plugins/ControllerPlugin/ControllerPlugin.h
  3. +133
    -46
      SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.C
  4. +15
    -9
      SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.h

+ 75
- 26
SpiralSound/Plugins/ControllerPlugin/ControllerPlugin.C View File

@@ -49,7 +49,7 @@ string GetGroupName()
ControllerPlugin::ControllerPlugin() :
m_Num(4)
{
m_Version=3;
m_Version=4;
m_PluginInfo.Name="CV Control";
m_PluginInfo.Width=240;
@@ -109,13 +109,25 @@ void ControllerPlugin::ExecuteCommands()
{
switch (m_AudioCH->GetCommand())
{
case (SETCHANNEL) :
SetChannel(m_GUIArgs.Number,m_GUIArgs.Value,m_GUIArgs.Min,m_GUIArgs.Max,m_GUIArgs.Name);
break;
case (SETNUM) :
case (SETNUM) :
SetNum(m_GUIArgs.Number);
break;
}
case (SETALL) :
SetAll(m_GUIArgs.Number, m_GUIArgs.Name, m_GUIArgs.Max, m_GUIArgs.Value, m_GUIArgs.Min);
break;
case (SETNAME) :
SetName(m_GUIArgs.Number, m_GUIArgs.Name);
break;
case (SETMAX) :
SetMax(m_GUIArgs.Number, m_GUIArgs.Max);
break;
case (SETCHANNEL) :
SetChannel(m_GUIArgs.Number, m_GUIArgs.Value);
break;
case (SETMIN) :
SetMin(m_GUIArgs.Number, m_GUIArgs.Min);
break;
}
}
}

@@ -123,7 +135,7 @@ void ControllerPlugin::SetNum(int n)
{
// once to clear the connections with the current info
UpdatePluginInfoWithHost();
if (m_Num<n)
{
char t[256];
@@ -158,29 +170,40 @@ void ControllerPlugin::Clear()
void ControllerPlugin::StreamOut(ostream &s)
{
s<<m_Version<<" ";
switch (m_Version)
{
case 4:
{
s<<m_Num<<endl;
for (int n=0; n<m_Num; n++)
{
s<<m_Names[n]<<" ";
s<<m_MinVal[n]<<" ";
s<<m_MaxVal[n]<<" ";
s<<m_ChannelVal[n]<<endl;
}
} break;
case 3:
{
s<<m_Num<<" ";
s<<m_Num<<" ";
for (int n=0; n<m_Num; n++)
{
s<<m_ChannelVal[n]<<" ";
}
s<<1<<endl;
s<<m_Num<<" ";
s<<m_Num<<" ";
for (int n=0; n<m_Num; n++)
{
{
s<<m_Names[n].size()<<" ";
s<<m_Names[n]<<" ";
s<<m_MinVal[n]<<" ";
s<<m_MaxVal[n]<<" ";
s<<m_ChannelVal[n]<<endl;
s<<m_ChannelVal[n]<<endl;
}
} break;
default :
default :
cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl;
break;
}
@@ -190,49 +213,75 @@ void ControllerPlugin::StreamIn(istream &s)
{
int version;
s>>version;
switch (version)
{
case 4:
{
Clear();

s>>m_Num;
string name;
for (int n=0; n<m_Num; n++)
{
s>>m_Names[n];
s>>m_MinVal[n];
s>>m_MaxVal[n];
s>>m_ChannelVal[n];
}

// add the channels one by one
for (int n=0; n<m_Num; n++)
{
char t[256];
sprintf(t,"CV %d",n);
m_PluginInfo.PortTips.push_back(t);
AddOutput();
}

m_PluginInfo.NumOutputs=m_Num;
UpdatePluginInfoWithHost();
} break;
case 3:
{
Clear();
s>>m_Num;
for (int n=0; n<m_Num; n++)
{
s>>m_ChannelVal[n];
}
char Buf[4096];
int size,dummy;
s>>dummy;
s>>m_Num;
s>>m_Num;
for (int n=0; n<m_Num; n++)
{
{
s>>size;
s.ignore(1);
s.get(Buf,size+1);
m_Names[n]=Buf;
s>>m_MinVal[n];
s>>m_MaxVal[n];
s>>m_ChannelVal[n];
s>>m_ChannelVal[n];
}
// add the channels one by one
for (int n=0; n<m_Num; n++)
{
{
char t[256];
sprintf(t,"CV %d",n);
m_PluginInfo.PortTips.push_back(t);
AddOutput();
}
m_PluginInfo.NumOutputs=m_Num;
UpdatePluginInfoWithHost();
UpdatePluginInfoWithHost();
} break;

default :
default :
cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl;
break;
}


+ 14
- 6
SpiralSound/Plugins/ControllerPlugin/ControllerPlugin.h View File

@@ -42,8 +42,8 @@ public:
float GetVal(int n) { return m_ChannelVal[n]; }
float GetMin(int n) { return m_MinVal[n]; }
float GetMax(int n) { return m_MaxVal[n]; }
enum GUICommands{NONE,SETCHANNEL,SETNUM};
enum GUICommands{NONE,SETNUM,SETALL,SETNAME,SETMAX,SETCHANNEL,SETMIN};
struct GUIArgs
{
int Number;
@@ -55,12 +55,20 @@ public:
private:
GUIArgs m_GUIArgs;
void SetChannel(int n, float s, float min, float max, char* name)
{ m_ChannelVal[n]=s; m_MinVal[n]=min; m_MaxVal[n]=max; m_Names[n]=name; }

void SetNum(int n);
void SetAll(int n, char *name, float max, float value, float min)
{ m_Names[n] = name;
m_MaxVal[n] = min;
m_ChannelVal[n] = value;
m_MinVal[n] = max;
};
void SetName(int n, char* name) { m_Names[n] = name; };
void SetChannel(int n, float value) { m_ChannelVal[n] = value; };
void SetMax(int n, float max) { m_MaxVal[n] = max; };
void SetMin(int n, float min) { m_MinVal[n] = min; };
void Clear();
int m_Num;
float m_ChannelVal[MAX_CHANNELS];
string m_Names[MAX_CHANNELS];


+ 133
- 46
SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.C View File

@@ -32,35 +32,40 @@ ControllerPluginGUI::CVGUI::CVGUI(int n, ControllerPluginGUI *p)
m_SliderGroup = new Fl_Group(0,0,60,153,"");
m_SliderGroup->box(FL_UP_BOX);
m_SliderGroup->user_data((void *)p);
m_Title = new Fl_Input(5,2,50,15,"");
m_Title->value("Name");
m_Title->textsize(10);
m_Title->callback((Fl_Callback*)ControllerPluginGUI::cb_Title,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Title);
m_Max = new Fl_Int_Input(5,18,50,15,"");
m_Max = new Fl_Input(5,18,50,15,"");
char t[64];
sprintf(t,"%d",1);
sprintf(t,"%.6f",1.0f);
m_Max->value(t);
m_Max->textsize(10);
m_Max->callback((Fl_Callback*)ControllerPluginGUI::cb_Max,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Max);
m_Chan = new Fl_Slider(20, 34, 20, 100, "");
m_Chan->type(4);
m_Chan->selection_color(GUI_COLOUR);
m_Chan->maximum(1);
m_Chan->step(0.01);
m_Chan->value(0.5);
m_Chan->step(0.01);
m_Chan->value(0.5);
m_Chan->callback((Fl_Callback*)ControllerPluginGUI::cb_Chan,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Chan);
m_Min = new Fl_Int_Input(5,136,50,15,"");
m_Min = new Fl_Input(5,136,50,15,"");
char t2[64];
sprintf(t2,"%d",-1);
sprintf(t2,"%.6f",-1.0f);
m_Min->value(t2);
m_Min->textsize(10);
m_Min->callback((Fl_Callback*)ControllerPluginGUI::cb_Min,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Min);
}

@@ -125,78 +130,160 @@ void ControllerPluginGUI::Clear()
}

void ControllerPluginGUI::UpdateValues(SpiralPlugin *o)
{
{
ControllerPlugin *Plugin = (ControllerPlugin *)o;

int c;
float min, max, val;
string Title,Min,Max;
char temp[64];
Clear();
c=Plugin->GetNum();
for (int n=0; n<c; n++)
{
AddCV();
AddCV();
m_GuiVec[n]->m_Title->value(Plugin->GetName(n).c_str());
sprintf(temp,"%f",Plugin->GetMin(n));
min = Plugin->GetMin(n);
max = Plugin->GetMax(n);
sprintf(temp,"%.6f",min);
m_GuiVec[n]->m_Min->value(temp);
sprintf(temp,"%f",Plugin->GetMax(n));
sprintf(temp,"%.6f",max);
m_GuiVec[n]->m_Max->value(temp);
m_GuiVec[n]->m_Chan->value(Plugin->GetVal(n));

// Scale and invert value to match slider range (0->1)
float val = 1.0f - (Plugin->GetVal(n) - min) / (max - min);
m_GuiVec[n]->m_Chan->value(val);
}
resize(x(),y(),c*60,h());
}
inline void ControllerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v)
{
inline void ControllerPluginGUI::cb_Title_i(Fl_Input* o, void* v)
{
int num=*(int*)(v);
// swap em over, cos it's the easiqest way to reverse
// the fltk slider, which is upside down imho
long max=strtol(m_GuiVec[num]->m_Max->value(),NULL,10);
long min=strtol(m_GuiVec[num]->m_Min->value(),NULL,10);
float val=(1.0f-o->value())*(max-min)+min;
m_GUICH->Set("Number",(int)num);
m_GUICH->Set("Value",(float)val);
m_GUICH->Set("Min",(float)min);
m_GUICH->Set("Max",(float)max);

char temp[256];
sprintf(temp,"%s",m_GuiVec[num]->m_Title->value());
m_GUICH->SetData("Name",(void*)temp);
m_GUICH->Set("Number",num);
m_GUICH->SetData("Name",(void*)temp);
m_GUICH->SetCommand(ControllerPlugin::SETNAME);
}
void ControllerPluginGUI::cb_Title(Fl_Input* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Title_i(o,v);}

inline void ControllerPluginGUI::cb_Max_i(Fl_Input* o, void* v)
{
int num=*(int*)(v);

float min = atof(m_GuiVec[num]->m_Min->value());
float max = atof(m_GuiVec[num]->m_Max->value());
if (min > max) {
// Swap values if arse over tit...
float temp = min;
char t[64];

min = max;
max = temp;

sprintf(t,"%.6f",min);
m_GuiVec[num]->m_Min->value(t);
sprintf(t,"%.6f",max);
m_GuiVec[num]->m_Max->value(t);
}

m_GUICH->Set("Number",num);
m_GUICH->Set("Max",max);
m_GUICH->SetCommand(ControllerPlugin::SETMAX);
}
void ControllerPluginGUI::cb_Max(Fl_Input* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Max_i(o,v);}

inline void ControllerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v)
{
int num=*(int*)(v);
// swap em over, cos it's the easiqest way to reverse
// the fltk slider, which is upside down imho
float min = atof(m_GuiVec[num]->m_Min->value());
float max = atof(m_GuiVec[num]->m_Max->value());
float val = (1.0f-o->value())*(max-min)+min;
m_GUICH->Set("Number",num);
m_GUICH->Set("Value",val);

m_GUICH->SetCommand(ControllerPlugin::SETCHANNEL);
}
void ControllerPluginGUI::cb_Chan(Fl_Slider* o, void* v)
void ControllerPluginGUI::cb_Chan(Fl_Slider* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Chan_i(o,v);}

inline void ControllerPluginGUI::cb_Add_i(Fl_Button* o, void* v)
{
inline void ControllerPluginGUI::cb_Min_i(Fl_Input* o, void* v)
{
int num=*(int*)(v);

float min = atof(m_GuiVec[num]->m_Min->value());
float max = atof(m_GuiVec[num]->m_Max->value());
if (min > max) {
// Swap values if arse over tit...
float temp = min;
char t[64];

min = max;
max = temp;

sprintf(t,"%.6f",min);
m_GuiVec[num]->m_Min->value(t);
sprintf(t,"%.6f",max);
m_GuiVec[num]->m_Max->value(t);
}
m_GUICH->Set("Number",num);
m_GUICH->Set("Min",min);
m_GUICH->SetCommand(ControllerPlugin::SETMIN);
}
void ControllerPluginGUI::cb_Min(Fl_Input* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Min_i(o,v);}

inline void ControllerPluginGUI::cb_Add_i(Fl_Button* o, void* v)
{
if (m_CVCount<MAX_CHANNELS)
{
AddCV();
resize(x(),y(),w()+60,h());
redraw();
m_GUICH->Set("Number",(int)m_GuiVec.size());
int num = (int)m_GuiVec.size();
float min = atof(m_GuiVec[num - 1]->m_Min->value());
float max = atof(m_GuiVec[num - 1]->m_Max->value());
float val = (1.0f-o->value())*(max-min)+min;
char temp[256];
sprintf(temp,"%s",m_GuiVec[num - 1]->m_Title->value());

m_GUICH->Set("Number", num);
m_GUICH->SetCommand(ControllerPlugin::SETNUM);
m_GUICH->Wait();
m_GUICH->Set("Number", num);
m_GUICH->SetData("Name",(void*)temp);
m_GUICH->Set("Max",max);
m_GUICH->Set("Value",val);
m_GUICH->Set("Min",min);
m_GUICH->SetCommand(ControllerPlugin::SETALL);
}
}
void ControllerPluginGUI::cb_Add(Fl_Button* o, void* v)
void ControllerPluginGUI::cb_Add(Fl_Button* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()))->cb_Add_i(o,v);}

inline void ControllerPluginGUI::cb_Delete_i(Fl_Button* o, void* v)
{
inline void ControllerPluginGUI::cb_Delete_i(Fl_Button* o, void* v)
{
if (m_GuiVec.size()>1)
{
DeleteCV();
resize(x(),y(),w()-60,h());
redraw();
redraw();
m_GUICH->Set("Number",(int)m_GuiVec.size());
m_GUICH->SetCommand(ControllerPlugin::SETNUM);
}
}
void ControllerPluginGUI::cb_Delete(Fl_Button* o, void* v)
void ControllerPluginGUI::cb_Delete(Fl_Button* o, void* v)
{ ((ControllerPluginGUI*)(o->parent()))->cb_Delete_i(o,v);}

// call for version <3
@@ -205,13 +292,13 @@ istream &operator>>(istream &s, ControllerPluginGUI &o)
int c;
string Title,Min,Max;
float Val;
o.Clear();
s>>c;
for (int n=0; n<c; n++)
{
s>>Title>>Min>>Max>>Val;
s>>Title>>Min>>Max>>Val;
o.AddCV();
o.m_GuiVec[n]->m_Title->value(Title.c_str());
o.m_GuiVec[n]->m_Min->value(Min.c_str());


+ 15
- 9
SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.h View File

@@ -57,27 +57,33 @@ private:
Fl_Group *m_SliderGroup;
Fl_Input *m_Title;
Fl_Int_Input *m_Min;
Fl_Int_Input *m_Max;
Fl_Input *m_Min;
Fl_Input *m_Max;
Fl_Slider *m_Chan;
};
friend class CVGUI;
Fl_Pack *m_MainPack;
Fl_Button *m_Add;
Fl_Button *m_Delete;
vector<CVGUI*> m_GuiVec;
void AddCV();
void DeleteCV();
int m_CVCount;
//// Callbacks ////
inline void cb_Title_i(Fl_Input* o, void* v);
static void cb_Title(Fl_Input* o, void* v);
inline void cb_Max_i(Fl_Input* o, void* v);
static void cb_Max(Fl_Input* o, void* v);
inline void cb_Chan_i(Fl_Slider* o, void* v);
static void cb_Chan(Fl_Slider* o, void* v);
inline void cb_Add_i(Fl_Button* o, void* v);
static void cb_Chan(Fl_Slider* o, void* v);
inline void cb_Min_i(Fl_Input* o, void* v);
static void cb_Min(Fl_Input* o, void* v);
inline void cb_Add_i(Fl_Button* o, void* v);
static void cb_Add(Fl_Button* o, void* v);
inline void cb_Delete_i(Fl_Button* o, void* v);
static void cb_Delete(Fl_Button* o, void* v);


Loading…
Cancel
Save