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() : ControllerPlugin::ControllerPlugin() :
m_Num(4) m_Num(4)
{ {
m_Version=3;
m_Version=4;
m_PluginInfo.Name="CV Control"; m_PluginInfo.Name="CV Control";
m_PluginInfo.Width=240; m_PluginInfo.Width=240;
@@ -109,13 +109,25 @@ void ControllerPlugin::ExecuteCommands()
{ {
switch (m_AudioCH->GetCommand()) 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); SetNum(m_GUIArgs.Number);
break; 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 // once to clear the connections with the current info
UpdatePluginInfoWithHost(); UpdatePluginInfoWithHost();
if (m_Num<n) if (m_Num<n)
{ {
char t[256]; char t[256];
@@ -158,29 +170,40 @@ void ControllerPlugin::Clear()
void ControllerPlugin::StreamOut(ostream &s) void ControllerPlugin::StreamOut(ostream &s)
{ {
s<<m_Version<<" "; s<<m_Version<<" ";
switch (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: case 3:
{ {
s<<m_Num<<" ";
s<<m_Num<<" ";
for (int n=0; n<m_Num; n++) for (int n=0; n<m_Num; n++)
{ {
s<<m_ChannelVal[n]<<" "; s<<m_ChannelVal[n]<<" ";
} }
s<<1<<endl; s<<1<<endl;
s<<m_Num<<" ";
s<<m_Num<<" ";
for (int n=0; n<m_Num; n++) for (int n=0; n<m_Num; n++)
{
{
s<<m_Names[n].size()<<" "; s<<m_Names[n].size()<<" ";
s<<m_Names[n]<<" "; s<<m_Names[n]<<" ";
s<<m_MinVal[n]<<" "; s<<m_MinVal[n]<<" ";
s<<m_MaxVal[n]<<" "; s<<m_MaxVal[n]<<" ";
s<<m_ChannelVal[n]<<endl;
s<<m_ChannelVal[n]<<endl;
} }
} break; } break;
default :
default :
cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl; cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl;
break; break;
} }
@@ -190,49 +213,75 @@ void ControllerPlugin::StreamIn(istream &s)
{ {
int version; int version;
s>>version; s>>version;
switch (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: case 3:
{ {
Clear(); Clear();
s>>m_Num; s>>m_Num;
for (int n=0; n<m_Num; n++) for (int n=0; n<m_Num; n++)
{ {
s>>m_ChannelVal[n]; s>>m_ChannelVal[n];
} }
char Buf[4096]; char Buf[4096];
int size,dummy; int size,dummy;
s>>dummy; s>>dummy;
s>>m_Num;
s>>m_Num;
for (int n=0; n<m_Num; n++) for (int n=0; n<m_Num; n++)
{
{
s>>size; s>>size;
s.ignore(1); s.ignore(1);
s.get(Buf,size+1); s.get(Buf,size+1);
m_Names[n]=Buf; m_Names[n]=Buf;
s>>m_MinVal[n]; s>>m_MinVal[n];
s>>m_MaxVal[n]; s>>m_MaxVal[n];
s>>m_ChannelVal[n];
s>>m_ChannelVal[n];
} }
// add the channels one by one // add the channels one by one
for (int n=0; n<m_Num; n++) for (int n=0; n<m_Num; n++)
{
{
char t[256]; char t[256];
sprintf(t,"CV %d",n); sprintf(t,"CV %d",n);
m_PluginInfo.PortTips.push_back(t); m_PluginInfo.PortTips.push_back(t);
AddOutput(); AddOutput();
} }
m_PluginInfo.NumOutputs=m_Num; m_PluginInfo.NumOutputs=m_Num;
UpdatePluginInfoWithHost();
UpdatePluginInfoWithHost();
} break; } break;


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


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

@@ -42,8 +42,8 @@ public:
float GetVal(int n) { return m_ChannelVal[n]; } float GetVal(int n) { return m_ChannelVal[n]; }
float GetMin(int n) { return m_MinVal[n]; } float GetMin(int n) { return m_MinVal[n]; }
float GetMax(int n) { return m_MaxVal[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 struct GUIArgs
{ {
int Number; int Number;
@@ -55,12 +55,20 @@ public:
private: private:
GUIArgs m_GUIArgs; 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 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(); void Clear();
int m_Num; int m_Num;
float m_ChannelVal[MAX_CHANNELS]; float m_ChannelVal[MAX_CHANNELS];
string m_Names[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 = new Fl_Group(0,0,60,153,"");
m_SliderGroup->box(FL_UP_BOX); m_SliderGroup->box(FL_UP_BOX);
m_SliderGroup->user_data((void *)p); m_SliderGroup->user_data((void *)p);
m_Title = new Fl_Input(5,2,50,15,""); m_Title = new Fl_Input(5,2,50,15,"");
m_Title->value("Name"); m_Title->value("Name");
m_Title->textsize(10); m_Title->textsize(10);
m_Title->callback((Fl_Callback*)ControllerPluginGUI::cb_Title,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Title); 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]; char t[64];
sprintf(t,"%d",1);
sprintf(t,"%.6f",1.0f);
m_Max->value(t); m_Max->value(t);
m_Max->textsize(10); m_Max->textsize(10);
m_Max->callback((Fl_Callback*)ControllerPluginGUI::cb_Max,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Max); m_SliderGroup->add(m_Max);
m_Chan = new Fl_Slider(20, 34, 20, 100, ""); m_Chan = new Fl_Slider(20, 34, 20, 100, "");
m_Chan->type(4); m_Chan->type(4);
m_Chan->selection_color(GUI_COLOUR); m_Chan->selection_color(GUI_COLOUR);
m_Chan->maximum(1); 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, m_Chan->callback((Fl_Callback*)ControllerPluginGUI::cb_Chan,
(void*)&Numbers[n]); (void*)&Numbers[n]);
m_SliderGroup->add(m_Chan); 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]; char t2[64];
sprintf(t2,"%d",-1);
sprintf(t2,"%.6f",-1.0f);
m_Min->value(t2); m_Min->value(t2);
m_Min->textsize(10); m_Min->textsize(10);
m_Min->callback((Fl_Callback*)ControllerPluginGUI::cb_Min,
(void*)&Numbers[n]);
m_SliderGroup->add(m_Min); m_SliderGroup->add(m_Min);
} }


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


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


int c; int c;
float min, max, val;
string Title,Min,Max; string Title,Min,Max;
char temp[64]; char temp[64];
Clear(); Clear();
c=Plugin->GetNum(); c=Plugin->GetNum();
for (int n=0; n<c; n++) for (int n=0; n<c; n++)
{ {
AddCV();
AddCV();
m_GuiVec[n]->m_Title->value(Plugin->GetName(n).c_str()); 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); 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_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()); 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); 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]; char temp[256];
sprintf(temp,"%s",m_GuiVec[num]->m_Title->value()); 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); 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);} { ((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) if (m_CVCount<MAX_CHANNELS)
{ {
AddCV(); AddCV();
resize(x(),y(),w()+60,h()); resize(x(),y(),w()+60,h());
redraw(); 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->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);} { ((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) if (m_GuiVec.size()>1)
{ {
DeleteCV(); DeleteCV();
resize(x(),y(),w()-60,h()); resize(x(),y(),w()-60,h());
redraw();
redraw();
m_GUICH->Set("Number",(int)m_GuiVec.size()); m_GUICH->Set("Number",(int)m_GuiVec.size());
m_GUICH->SetCommand(ControllerPlugin::SETNUM); 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);} { ((ControllerPluginGUI*)(o->parent()))->cb_Delete_i(o,v);}


// call for version <3 // call for version <3
@@ -205,13 +292,13 @@ istream &operator>>(istream &s, ControllerPluginGUI &o)
int c; int c;
string Title,Min,Max; string Title,Min,Max;
float Val; float Val;
o.Clear(); o.Clear();
s>>c; s>>c;
for (int n=0; n<c; n++) for (int n=0; n<c; n++)
{ {
s>>Title>>Min>>Max>>Val;
s>>Title>>Min>>Max>>Val;
o.AddCV(); o.AddCV();
o.m_GuiVec[n]->m_Title->value(Title.c_str()); o.m_GuiVec[n]->m_Title->value(Title.c_str());
o.m_GuiVec[n]->m_Min->value(Min.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_Group *m_SliderGroup;
Fl_Input *m_Title; 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; Fl_Slider *m_Chan;
}; };
friend class CVGUI; friend class CVGUI;
Fl_Pack *m_MainPack; Fl_Pack *m_MainPack;
Fl_Button *m_Add; Fl_Button *m_Add;
Fl_Button *m_Delete; Fl_Button *m_Delete;
vector<CVGUI*> m_GuiVec; vector<CVGUI*> m_GuiVec;
void AddCV(); void AddCV();
void DeleteCV(); void DeleteCV();
int m_CVCount; int m_CVCount;
//// Callbacks //// //// 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); 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); static void cb_Add(Fl_Button* o, void* v);
inline void cb_Delete_i(Fl_Button* o, void* v); inline void cb_Delete_i(Fl_Button* o, void* v);
static void cb_Delete(Fl_Button* o, void* v); static void cb_Delete(Fl_Button* o, void* v);


Loading…
Cancel
Save