diff --git a/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.C b/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.C index a3ffe3d..8bb35bd 100644 --- a/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.C +++ b/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.C @@ -44,58 +44,177 @@ string SpiralPlugin_GetGroupName() { /////////////////////////////////////////////////////// -DistributorPlugin::DistributorPlugin() : +DistributorPlugin::DistributorPlugin(): m_Triggered (false), m_ChannelSelect (0), m_TrigDelay (0) { + m_PluginInfo.Name = "Distributor"; - m_PluginInfo.Width = 220; - m_PluginInfo.Height = 250; - m_PluginInfo.NumInputs = 2; - m_PluginInfo.NumOutputs = 8; + m_PluginInfo.Width=80; + m_PluginInfo.Height=40; + + m_Version = 2; + m_GUIArgs.ChannelCount = 2; + CreatePorts (); + + m_AudioCH->Register("ChannelCount", &m_GUIArgs.ChannelCount); +} + +DistributorPlugin::~DistributorPlugin() +{ +} + +void DistributorPlugin::CreatePorts (int n, bool AddPorts) +{ + int c; + char t[256]; + + m_PluginInfo.NumInputs = 3; m_PluginInfo.PortTips.push_back ("Stream"); m_PluginInfo.PortTips.push_back ("Switcher"); - m_PluginInfo.PortTips.push_back ("Stream 1"); - m_PluginInfo.PortTips.push_back ("Switcher 1"); - m_PluginInfo.PortTips.push_back ("Stream 2"); - m_PluginInfo.PortTips.push_back ("Switcher 2"); - m_PluginInfo.PortTips.push_back ("Stream 3"); - m_PluginInfo.PortTips.push_back ("Switcher 3"); - m_PluginInfo.PortTips.push_back ("Stream 4"); - m_PluginInfo.PortTips.push_back ("Switcher 4"); + m_PluginInfo.PortTips.push_back ("Reset CV"); + + m_PluginInfo.NumOutputs = n*2; + for (c=1; c<=n; c++) { + sprintf (t, "Stream %d", c); + m_PluginInfo.PortTips.push_back (t); + + sprintf (t, "Switcher %d", c); + m_PluginInfo.PortTips.push_back (t); + } + + if (AddPorts) { + for (int c=0; cBUFSIZE; n++) { - float InpStream = InputExists (Stream) ? GetInput (Stream, n) : 0.0; - float InpSwitch = InputExists (Switch) ? GetInput (Switch, n) : 0.0; - if (InpSwitch <= 0.0) m_Triggered = false; - if (! m_Triggered && (InpSwitch > 0.0)) { - m_Triggered = true; - SetOutput (m_ChannelSelect+Switch, n, 0); - m_ChannelSelect = m_ChannelSelect + 2; - if (m_ChannelSelect > 6) m_ChannelSelect = 0; - m_TrigDelay = 0; - } - SetOutput (m_ChannelSelect+Stream, n, InpStream); - if (m_TrigDelay < 10) { - m_TrigDelay++; - SetOutput (m_ChannelSelect+Switch, n, InpSwitch); - } - else SetOutput (m_ChannelSelect+Switch, n, 0); - } + const int Stream = 0; + const int Switch = 1; + const int Reset = 2; + + for (int n=0; nBUFSIZE; n++) { + float InpStream = InputExists (Stream) ? GetInput (Stream, n) : 0.0; + float InpSwitch = InputExists (Switch) ? GetInput (Switch, n) : 0.0; + float InpReset = InputExists (Reset) ? GetInput (Reset, n) : 0; + + if (InpReset) + { + m_Triggered = false; + m_ChannelSelect = false; + m_TrigDelay = 0; + } + + if (InpSwitch <= 0.0) + m_Triggered = false; + + + if (! m_Triggered && (InpSwitch > 0.0)) + { + m_Triggered = true; + SetOutput (m_ChannelSelect+Switch, n, 0); + m_ChannelSelect = m_ChannelSelect + 2; + if (m_ChannelSelect >= (GetChannelCount()*2)) + m_ChannelSelect = 0; + + m_TrigDelay = 0; + } + + SetOutput (m_ChannelSelect+Stream, n, InpStream); + + if (m_TrigDelay < 10) + { + m_TrigDelay++; + SetOutput (m_ChannelSelect+Switch, n, InpSwitch); + } + else + { + SetOutput (m_ChannelSelect+Switch, n, 0); + } + } +} + +void DistributorPlugin::ExecuteCommands () +{ + if (m_AudioCH->IsCommandWaiting ()) + { + switch (m_AudioCH->GetCommand()) { + case SETCHANNELCOUNT : + { + SetChannelCount(GetChannelCount()); + } + break; + } + } +} + +void DistributorPlugin::StreamOut (ostream &s) +{ + s << m_Version << " " << GetChannelCount() << " "; +} + +void DistributorPlugin::StreamIn (istream &s) +{ + char Test; + int Version, Channels; + + s.seekg (2, ios_base::cur );//skip to next line + Test = s.peek();//peek first char + s.seekg (-2, ios_base::cur );//jump back to prior line + + if ( (Test >= '0') && (Test <= '9') ) + { + s >> Version; + } + else + { + //No Version, so use Version 1 + Version = 1; + } + + switch (Version) + { + case 2: + { + s >> Channels; + SetChannelCount (Channels); + } + break; + + case 1: + { + //use original fixed defaults + SetChannelCount (4); + } + break; + } } diff --git a/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.h b/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.h index 72167c4..8c50b21 100644 --- a/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.h +++ b/SpiralSound/Plugins/DistributorPlugin/DistributorPlugin.h @@ -23,17 +23,35 @@ #include class DistributorPlugin : public SpiralPlugin { - public: - DistributorPlugin(); - virtual ~DistributorPlugin(); - virtual PluginInfo& Initialise (const HostInfo *Host); - virtual SpiralGUIType* CreateGUI(); - virtual void Execute(); - virtual void StreamOut (std::ostream &s) { } - virtual void StreamIn (std::istream &s) { } - private: - bool m_Triggered; - int m_ChannelSelect, m_TrigDelay; +public: + DistributorPlugin(); + virtual ~DistributorPlugin(); + + virtual PluginInfo& Initialise(const HostInfo *Host); + virtual SpiralGUIType* CreateGUI (); + + virtual void Execute(); + virtual void ExecuteCommands(); + + virtual void StreamOut(std::ostream &s); + virtual void StreamIn(std::istream &s); + + int GetChannelCount (void) { return m_GUIArgs.ChannelCount; } + void SetChannelCount (int count); + + enum GUICommands { NONE, SETCHANNELCOUNT }; + struct GUIArgs { + int ChannelCount; + }; +private: + GUIArgs m_GUIArgs; + + int m_Version; + + bool m_Triggered; + int m_ChannelSelect, m_TrigDelay; + + void CreatePorts (int n = 2, bool AddPorts = false); }; #endif diff --git a/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.C b/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.C index 90d21e0..6c47ad1 100644 --- a/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.C +++ b/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.C @@ -27,13 +27,48 @@ using namespace std; DistributorPluginGUI::DistributorPluginGUI(int w, int h,DistributorPlugin *o,ChannelHandler *ch,const HostInfo *Info) : SpiralPluginGUI(w,h,o,ch) { + m_Chans = new Fl_Counter (15, 20, 50, 15, "Channels"); + m_Chans->labelsize (8); + m_Chans->textsize (8); + m_Chans->type (FL_SIMPLE_COUNTER); + m_Chans->box (FL_PLASTIC_UP_BOX); + m_Chans->color (Info->GUI_COLOUR); + m_Chans->selection_color (Info->GUI_COLOUR); + m_Chans->step (1); + m_Chans->value (2); + m_Chans->callback ((Fl_Callback*) cb_Chans, this); + add (m_Chans); + end(); } +void DistributorPluginGUI::Update() +{ +} void DistributorPluginGUI::UpdateValues(SpiralPlugin *o) { + DistributorPlugin* Plugin = (DistributorPlugin*)o; + m_Chans->value (Plugin->GetChannelCount()); } +inline void DistributorPluginGUI::cb_Chans_i (Fl_Counter* o) +{ + if (o->value() < 2) + { + o->value(2); + } + else { + m_GUICH->Set ("ChannelCount", int (o->value ())); + m_GUICH->SetCommand (DistributorPlugin::SETCHANNELCOUNT); + m_GUICH->Wait (); + Resize (w(), h()); + } +} +const string DistributorPluginGUI::GetHelpText(const string &loc) +{ + return string("") + + "The Distributor plugin is for polyphony. NEED MORE INFO HERE.\n"; +} diff --git a/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.h b/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.h index ccb9624..01fb5ee 100644 --- a/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.h +++ b/SpiralSound/Plugins/DistributorPlugin/DistributorPluginGUI.h @@ -17,6 +17,7 @@ */ #include +#include #include "DistributorPlugin.h" #include "../SpiralPluginGUI.h" @@ -27,11 +28,18 @@ class DistributorPluginGUI : public SpiralPluginGUI { public: DistributorPluginGUI(int w, int h, DistributorPlugin *o,ChannelHandler *ch,const HostInfo *Info); + virtual void UpdateValues(SpiralPlugin *o); + virtual void Update (); + +protected: + const std::string GetHelpText(const std::string &loc); private: + Fl_Counter *m_Chans; - //// Callbacks //// + inline void cb_Chans_i (Fl_Counter* o); + static void cb_Chans(Fl_Counter* o, DistributorPluginGUI* v) {v->cb_Chans_i(o);} }; #endif