| @@ -0,0 +1,312 @@ | |||
| /* SpiralSound | |||
| * Copyleft (C) 2002 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include "ChannelHandler.h" | |||
| #include <unistd.h> | |||
| ChannelHandler::ChannelHandler() : | |||
| m_UpdateIndicator(false) | |||
| { | |||
| m_Mutex = new pthread_mutex_t; | |||
| m_Command[0]=0; | |||
| m_Command[1]=0; | |||
| m_BulkSrc=NULL; | |||
| m_BulkSize=0; | |||
| m_BulkPos=-1; | |||
| pthread_mutex_init(m_Mutex,NULL); | |||
| } | |||
| ChannelHandler::~ChannelHandler() | |||
| { | |||
| for(map<string,Channel*>::iterator i=m_ChannelMap.begin(); | |||
| i!=m_ChannelMap.end(); i++) | |||
| { | |||
| free(i->second->data_buf); | |||
| delete i->second; | |||
| } | |||
| pthread_mutex_destroy(m_Mutex); | |||
| delete m_Mutex; | |||
| } | |||
| /////////////////////////////////////////////////////////////// | |||
| void ChannelHandler::UpdateDataNow() | |||
| { | |||
| // make sure the command is cleared even if | |||
| // we can't get a lock on the data | |||
| m_Command[0]=0; | |||
| if (pthread_mutex_trylock(m_Mutex)) | |||
| { | |||
| m_UpdateIndicator=!m_UpdateIndicator; | |||
| for(map<string, Channel*>::iterator i=m_ChannelMap.begin(); | |||
| i!=m_ChannelMap.end(); i++) | |||
| { | |||
| Channel *ch = i->second; | |||
| switch (ch->type) | |||
| { | |||
| case INPUT : | |||
| { | |||
| memcpy(ch->data,ch->data_buf,ch->size); | |||
| } break; | |||
| case OUTPUT : | |||
| { | |||
| memcpy(ch->data_buf,ch->data,ch->size); | |||
| } break; | |||
| // one off request type | |||
| case OUTPUT_REQUEST : | |||
| { | |||
| if (m_BulkPos!=-1 && m_BulkID==i->first) | |||
| { | |||
| // doing a bulk transfer | |||
| if (m_BulkPos+ch->size>m_BulkSize) | |||
| { | |||
| // last transfer | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos); | |||
| m_BulkPos=-1; | |||
| } | |||
| else | |||
| { | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size); | |||
| m_BulkPos+=ch->size; | |||
| } | |||
| ch->updated=true; | |||
| } | |||
| else | |||
| { | |||
| // normal request transfer | |||
| if (ch->requested) | |||
| { | |||
| memcpy(ch->data_buf,ch->data,ch->size); | |||
| ch->updated=true; | |||
| } | |||
| } | |||
| } break; | |||
| } | |||
| } | |||
| m_Command[0]=m_Command[1]; | |||
| // make sure the command only lasts one update | |||
| m_Command[1]=0; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| //cerr<<"audio out mutex"<<endl; | |||
| //cerr<<"Update succeeded"<<endl; | |||
| } | |||
| else | |||
| { | |||
| //cerr<<"Couldn't get lock"<<endl; | |||
| } | |||
| } | |||
| void ChannelHandler::RegisterData(const string &ID, Type t,void* pData, int size) | |||
| { | |||
| // probably don't need to lock here, as if get/set are called before | |||
| // the channels have been set up they won't work anyway, but... | |||
| //pthread_mutex_lock(m_Mutex); | |||
| cerr<<"Registering ["<<ID<<"] "<<hex<<pData<<dec<<" as "<<size<<" bytes big"<<endl; | |||
| map<string,Channel*>::iterator i=m_ChannelMap.find(ID); | |||
| if (i!=m_ChannelMap.end()) | |||
| { | |||
| cerr<<"Channel with ID ["<<ID<<"] already exists"<<endl; | |||
| } | |||
| Channel *NewCh=new Channel(t); | |||
| NewCh->data_buf = malloc(size); | |||
| NewCh->size = size; | |||
| NewCh->data = pData; | |||
| NewCh->requested = false; | |||
| NewCh->updated = false; | |||
| memcpy(NewCh->data_buf,NewCh->data,size); | |||
| m_ChannelMap[ID]=NewCh; | |||
| //pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| ///////////////////////////////////////////////////////////////////////// | |||
| void ChannelHandler::GetData(const string &ID, void *data) | |||
| { | |||
| map<string,Channel*>::iterator i=m_ChannelMap.find(ID); | |||
| if (i==m_ChannelMap.end()) | |||
| { | |||
| cerr<<"ChannelHandler: Channel ["<<ID<<"] does not exist"<<endl; | |||
| return; | |||
| } | |||
| if (!data) | |||
| { | |||
| cerr<<"ChannelHandler: Can't copy data to uninitialised mem"<<endl; | |||
| return; | |||
| } | |||
| pthread_mutex_lock(m_Mutex); | |||
| if (i->second->type==OUTPUT || i->second->type==OUTPUT_REQUEST) | |||
| { | |||
| memcpy(data,i->second->data_buf,i->second->size); | |||
| } | |||
| else | |||
| { | |||
| cerr<<"ChannelHandler: Tried to Get() data registered as input"<<endl; | |||
| }//cerr<<"unlock 1"<<endl; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| void ChannelHandler::SetData(const string &ID, void *s) | |||
| { | |||
| map<string,Channel*>::iterator i=m_ChannelMap.find(ID); | |||
| if (i==m_ChannelMap.end()) | |||
| { | |||
| cerr<<"ChannelHandler: Channel ["<<ID<<"] does not exist"<<endl; | |||
| return; | |||
| } | |||
| //cerr<<"lock 2"<<endl; | |||
| pthread_mutex_lock(m_Mutex); | |||
| //cerr<<"lock 2 ok"<<endl; | |||
| if (i->second->type==INPUT) | |||
| { | |||
| memcpy(i->second->data_buf,s,i->second->size); | |||
| } | |||
| else | |||
| { | |||
| cerr<<"ChannelHandler: Tried to Set() data registered as output"<<endl; | |||
| }//cerr<<"unlock 2"<<endl; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| void ChannelHandler::SetCommand(char command) | |||
| { | |||
| pthread_mutex_lock(m_Mutex); | |||
| m_Command[1]=command; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| void ChannelHandler::FlushChannels() | |||
| { | |||
| pthread_mutex_lock(m_Mutex); | |||
| for(map<string, Channel*>::iterator i=m_ChannelMap.begin(); | |||
| i!=m_ChannelMap.end(); i++) | |||
| { | |||
| memcpy(i->second->data_buf,i->second->data,i->second->size); | |||
| } | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| void ChannelHandler::RequestChannelAndWait(const string &ID) | |||
| { | |||
| map<string,Channel*>::iterator i=m_ChannelMap.find(ID); | |||
| if (i==m_ChannelMap.end()) | |||
| { | |||
| cerr<<"ChannelHandler: Channel ["<<ID<<"] does not exist"<<endl; | |||
| return; | |||
| } | |||
| if (i->second->type!=OUTPUT_REQUEST) | |||
| { | |||
| cerr<<"ChannelHandler: Trying to request ["<<ID<<"] which is not a requestable channel"<<endl; | |||
| return; | |||
| } | |||
| pthread_mutex_lock(m_Mutex); | |||
| i->second->requested=true; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| bool ready=false; | |||
| while (!ready) | |||
| { | |||
| usleep(10); // random amount of time :) | |||
| pthread_mutex_lock(m_Mutex); | |||
| ready=i->second->updated; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| pthread_mutex_lock(m_Mutex); | |||
| i->second->requested=false; | |||
| i->second->updated=false; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| void ChannelHandler::BulkTransfer(const string &ID, void *dest, int size) | |||
| { | |||
| map<string,Channel*>::iterator i=m_ChannelMap.find(ID); | |||
| if (i==m_ChannelMap.end()) | |||
| { | |||
| cerr<<"ChannelHandler: Channel ["<<ID<<"] does not exist"<<endl; | |||
| return; | |||
| } | |||
| if (i->second->type!=OUTPUT_REQUEST) | |||
| { | |||
| cerr<<"ChannelHandler: Trying to bulk transfer on ["<<ID<<"] which is not a OUTPUT_REQUEST channel"<<endl; | |||
| return; | |||
| } | |||
| m_BulkPos=0; | |||
| m_BulkSize = size; | |||
| m_BulkID = ID; | |||
| int pos=0; | |||
| int buffersize=i->second->size; | |||
| // fill up the destination buffer | |||
| while (m_BulkPos!=-1) | |||
| { | |||
| RequestChannelAndWait(ID); | |||
| if (pos+buffersize>size) | |||
| { | |||
| // last copy | |||
| char *tempbuf = (char*)malloc(buffersize); | |||
| GetData(ID,(void*)tempbuf); | |||
| memcpy(((char*)dest)+pos,(void*)tempbuf,size-pos); | |||
| free(tempbuf); | |||
| } | |||
| else | |||
| { | |||
| GetData(ID,((char*)dest)+pos); | |||
| } | |||
| pos+=buffersize; | |||
| } | |||
| } | |||
| void ChannelHandler::Wait() | |||
| { | |||
| pthread_mutex_lock(m_Mutex); | |||
| bool current=m_UpdateIndicator; | |||
| bool last=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| while (current==last) | |||
| { | |||
| usleep(10); | |||
| pthread_mutex_lock(m_Mutex); | |||
| current=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| } | |||
| @@ -0,0 +1,136 @@ | |||
| /* SpiralSound | |||
| * Copyleft (C) 2002 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #ifndef CHANNEL_HANDLER | |||
| #define CHANNEL_HANDLER | |||
| #include <pthread.h> | |||
| #include <string> | |||
| #include <map> | |||
| #include <iostream.h> | |||
| class ChannelHandler | |||
| { | |||
| public: | |||
| enum Type{INPUT,OUTPUT,OUTPUT_REQUEST}; | |||
| ChannelHandler(); | |||
| ~ChannelHandler(); | |||
| // only call these from the audio thread | |||
| // don't call Register*() when the audio thread is running | |||
| void RegisterData(const string &ID, Type t, void *pData, int size); | |||
| void Register(const string &ID, bool* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(bool*)pData,sizeof(bool)); } | |||
| void Register(const string &ID, char* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(char*)pData,sizeof(char)); } | |||
| void Register(const string &ID, int* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(int*)pData,sizeof(int)); } | |||
| void Register(const string &ID, long* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(long*)pData,sizeof(long)); } | |||
| void Register(const string &ID, short* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(short*)pData,sizeof(short)); } | |||
| void Register(const string &ID, float* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(float*)pData,sizeof(float)); } | |||
| void Register(const string &ID, double* pData, Type t=ChannelHandler::INPUT) | |||
| { RegisterData(ID, t,(double*)pData,sizeof(double)); } | |||
| void UpdateDataNow(); | |||
| bool IsCommandWaiting() { return m_Command[0]; } | |||
| char GetCommand() { return m_Command[0]; } | |||
| // use bulk transfers to copy variable and large sized data to the gui | |||
| void SetupBulkTransfer(void *source) { m_BulkSrc=source; } | |||
| // only call these from the gui thread | |||
| // the ID comes from the order the channel is registered in | |||
| void GetData(const string &ID, void *data); | |||
| const bool GetBool(const string &ID) { bool t; GetData(ID,&t); return t; } | |||
| const char GetChar(const string &ID) { char t; GetData(ID,&t); return t; } | |||
| const int GetInt(const string &ID) { int t; GetData(ID,&t); return t; } | |||
| const long GetLong(const string &ID) { long t; GetData(ID,&t); return t; } | |||
| const short GetShort(const string &ID) { short t; GetData(ID,&t); return t; } | |||
| const float GetFloat(const string &ID) { float t; GetData(ID,&t); return t; } | |||
| const double GetDouble(const string &ID) { double t; GetData(ID,&t); return t; } | |||
| void SetData(const string &ID, void *s); | |||
| void Set(const string &ID, const bool& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const char& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const int& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const long& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const short& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const float& s) { SetData(ID,(void*)&s); } | |||
| void Set(const string &ID, const double& s) { SetData(ID,(void*)&s); } | |||
| void SetCommand(char command); | |||
| // initialises the data from the audio side to the internal buffers | |||
| void FlushChannels(); | |||
| //////////////////////////////////////////// | |||
| // This is useful for getting data from the audio side immediately, | |||
| // as it will block until complete, and for larger amounts of data, as | |||
| // it won't be doing the copy every update. | |||
| void RequestChannelAndWait(const string &ID); | |||
| /////////////////////////////////////////// | |||
| // Use for copying large variable sized data very infrequently. | |||
| // uses an OUTPUT_REQUEST channel as a transfer buffer. | |||
| // Send the size needed to the gui down another channel. | |||
| // This can be a slowww function, as it can take many audio updates | |||
| // to complete, depending on the size of the buffer channel and the | |||
| // total size of the transfer. | |||
| void BulkTransfer(const string &ID, void *dest, int size); | |||
| // delays for one or more updates. use for syncing commands | |||
| void Wait(); | |||
| private: | |||
| class Channel | |||
| { | |||
| public: | |||
| Channel(Type t) { type=t; } | |||
| Type type; | |||
| void *data_buf; | |||
| int size; | |||
| void *data; | |||
| bool requested; | |||
| bool updated; | |||
| }; | |||
| map<string,Channel*> m_ChannelMap; | |||
| char m_Command[2]; | |||
| bool m_UpdateIndicator; | |||
| void *m_BulkSrc; | |||
| int m_BulkSize; | |||
| int m_BulkPos; | |||
| string m_BulkID; | |||
| pthread_mutex_t* m_Mutex; | |||
| }; | |||
| #endif | |||
| @@ -30,7 +30,7 @@ | |||
| using namespace std; | |||
| #define KEYBOARD_SUPPORT | |||
| //#define KEYBOARD_SUPPORT | |||
| class MidiEvent | |||
| @@ -54,7 +54,10 @@ m_DC(0.0f) | |||
| m_PluginInfo.PortTips.push_back("Input"); | |||
| m_PluginInfo.PortTips.push_back("Amp CV"); | |||
| m_PluginInfo.PortTips.push_back("DC Offset CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Amp",&m_Amp); | |||
| m_AudioCH->Register("DC",&m_DC); | |||
| } | |||
| AmpPlugin::~AmpPlugin() | |||
| @@ -68,11 +71,9 @@ PluginInfo &AmpPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *AmpPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new AmpPluginGUI(m_PluginInfo.Width, | |||
| return new AmpPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void AmpPlugin::Execute() | |||
| @@ -37,9 +37,7 @@ public: | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetAmp(float s) { m_Amp=s; } | |||
| void SetDC(float s) { m_DC=s; } | |||
| float GetAmp() { return m_Amp; } | |||
| float GetAmp() { return m_Amp; } | |||
| float GetDC() { return m_DC; } | |||
| void Randomise(); | |||
| @@ -26,8 +26,8 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| AmpPluginGUI::AmpPluginGUI(int w, int h,AmpPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| AmpPluginGUI::AmpPluginGUI(int w, int h,AmpPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| @@ -79,14 +79,16 @@ SpiralPluginGUI(w,h,o) | |||
| extern "C" int sprintf(char *,const char *,...); | |||
| void AmpPluginGUI::UpdateValues() | |||
| void AmpPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_Amp->value(2.0f-m_Plugin->GetAmp()); | |||
| m_DC->value(2.0f-m_Plugin->GetDC()); | |||
| AmpPlugin* Plugin = (AmpPlugin*)o; | |||
| m_Amp->value(2.0f-Plugin->GetAmp()); | |||
| m_DC->value(2.0f-Plugin->GetDC()); | |||
| char str[10]; | |||
| sprintf(str,"%4.2f",m_Plugin->GetAmp()); | |||
| sprintf(str,"%4.2f",Plugin->GetAmp()); | |||
| m_out_gain->value(str); | |||
| sprintf(str,"%4.2f",m_Plugin->GetDC()); | |||
| sprintf(str,"%4.2f",Plugin->GetDC()); | |||
| m_out_DC->value(str); | |||
| } | |||
| @@ -95,7 +97,7 @@ inline void AmpPluginGUI::cb_Amp_i(Fl_Slider* o, void* v) | |||
| char str[10]; | |||
| float value=2.0f-o->value(); | |||
| m_Plugin->SetAmp(value); | |||
| m_GUICH->Set("Amp",value); | |||
| sprintf(str,"%4.2f",value); | |||
| m_out_gain->value(str); | |||
| } | |||
| @@ -106,7 +108,7 @@ inline void AmpPluginGUI::cb_DC_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| float value=2.0f-o->value(); | |||
| m_Plugin->SetDC(value); | |||
| m_GUICH->Set("DC",value); | |||
| sprintf(str,"%4.2f",value); | |||
| m_out_DC->value(str); | |||
| } | |||
| @@ -33,9 +33,9 @@ | |||
| class AmpPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| AmpPluginGUI(int w, int h, AmpPlugin *o,const HostInfo *Info); | |||
| AmpPluginGUI(int w, int h, AmpPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| AmpPlugin *m_Plugin; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| AmpPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| AmpPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -162,3 +165,5 @@ AmpPluginGUI.o: AmpPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| ComplexEnvelopePluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| ComplexEnvelopePluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -170,3 +173,5 @@ ComplexEnvelopePluginGUI.o: ComplexEnvelopePluginGUI.C \ | |||
| Bezier.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -60,6 +60,12 @@ m_Num(4) | |||
| { | |||
| m_ChannelVal[n]=0.0f; | |||
| } | |||
| m_AudioCH->Register("Number",&m_GUIArgs.Number); | |||
| m_AudioCH->Register("Value",&m_GUIArgs.Value); | |||
| m_AudioCH->Register("Min",&m_GUIArgs.Min); | |||
| m_AudioCH->Register("Max",&m_GUIArgs.Max); | |||
| m_AudioCH->RegisterData("Name",ChannelHandler::INPUT,m_GUIArgs.Name,sizeof(m_GUIArgs.Name)); | |||
| } | |||
| ControllerPlugin::~ControllerPlugin() | |||
| @@ -73,11 +79,9 @@ PluginInfo &ControllerPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *ControllerPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new ControllerPluginGUI(m_PluginInfo.Width, | |||
| return new ControllerPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void ControllerPlugin::Execute() | |||
| @@ -91,6 +95,22 @@ void ControllerPlugin::Execute() | |||
| } | |||
| } | |||
| void ControllerPlugin::ExecuteCommands() | |||
| { | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| 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) : | |||
| SetNum(m_GUIArgs.Number); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| void ControllerPlugin::SetNum(int n) | |||
| { | |||
| // once to clear the connections with the current info | |||
| @@ -114,7 +134,7 @@ void ControllerPlugin::SetNum(int n) | |||
| m_Num=n; | |||
| m_PluginInfo.NumOutputs=n; | |||
| // do the actual update | |||
| UpdatePluginInfoWithHost(); | |||
| } | |||
| @@ -133,34 +153,28 @@ void ControllerPlugin::StreamOut(ostream &s) | |||
| switch (m_Version) | |||
| { | |||
| case 1: | |||
| { | |||
| for (int n=0; n<4; n++) | |||
| { | |||
| s<<m_ChannelVal[n]<<" "; | |||
| } | |||
| } break; | |||
| case 2: | |||
| case 3: | |||
| { | |||
| s<<m_Num<<" "; | |||
| for (int n=0; n<m_Num; n++) | |||
| { | |||
| s<<m_ChannelVal[n]<<" "; | |||
| } | |||
| //s<<*(ControllerPluginGUI*)m_GUI<<" "; | |||
| ((ControllerPluginGUI*)m_GUI)->StreamOut(s); | |||
| } break; | |||
| case 3: | |||
| { | |||
| s<<m_Num<<" "; | |||
| for (int n=0; n<m_Num; n++) | |||
| { | |||
| s<<m_ChannelVal[n]<<" "; | |||
| { | |||
| s<<m_Names[n].size()<<endl; | |||
| s<<m_Names[n]<<" "; | |||
| s<<m_MinVal[n]<<" "; | |||
| s<<m_MaxVal[n]<<" "; | |||
| s<<m_ChannelVal[n]<<endl; | |||
| } | |||
| ((ControllerPluginGUI*)m_GUI)->StreamOut(s); | |||
| } break; | |||
| default : | |||
| cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl; | |||
| break; | |||
| } | |||
| } | |||
| @@ -171,15 +185,7 @@ void ControllerPlugin::StreamIn(istream &s) | |||
| switch (version) | |||
| { | |||
| case 1: | |||
| { | |||
| for (int n=0; n<4; n++) | |||
| { | |||
| s>>m_ChannelVal[n]; | |||
| } | |||
| } break; | |||
| case 2: | |||
| case 3: | |||
| { | |||
| Clear(); | |||
| @@ -190,35 +196,21 @@ void ControllerPlugin::StreamIn(istream &s) | |||
| s>>m_ChannelVal[n]; | |||
| } | |||
| s>>*(ControllerPluginGUI*)m_GUI; | |||
| // add the channels one by one | |||
| char Buf[4096]; | |||
| int size; | |||
| s>>m_Num; | |||
| for (int n=0; n<m_Num; n++) | |||
| { | |||
| char t[256]; | |||
| sprintf(t,"CV %d",n); | |||
| m_PluginInfo.PortTips.push_back(t); | |||
| AddOutput(); | |||
| { | |||
| 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]; | |||
| } | |||
| 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]; | |||
| } | |||
| ((ControllerPluginGUI*)m_GUI)->StreamIn(s); | |||
| // add the channels one by one | |||
| for (int n=0; n<m_Num; n++) | |||
| { | |||
| @@ -230,7 +222,10 @@ void ControllerPlugin::StreamIn(istream &s) | |||
| m_PluginInfo.NumOutputs=m_Num; | |||
| UpdatePluginInfoWithHost(); | |||
| } break; | |||
| default : | |||
| cerr<<"ControllerPlugin - I dont support this streaming version any more"<<endl; | |||
| break; | |||
| } | |||
| } | |||
| @@ -33,21 +33,39 @@ public: | |||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType *CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetChannel(int n, float s) { m_ChannelVal[n]=s; } | |||
| void SetNum(int n); | |||
| string GetName(int n) { return m_Names[n]; } | |||
| int GetNum() { return m_Num; } | |||
| 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}; | |||
| struct GUIArgs | |||
| { | |||
| int Number; | |||
| float Value; | |||
| float Min; | |||
| float Max; | |||
| char Name[256]; | |||
| }; | |||
| 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 Clear(); | |||
| int m_Num; | |||
| float m_ChannelVal[MAX_CHANNELS]; | |||
| float m_ChannelVal[MAX_CHANNELS]; | |||
| string m_Names[MAX_CHANNELS]; | |||
| float m_MinVal[MAX_CHANNELS]; | |||
| float m_MaxVal[MAX_CHANNELS]; | |||
| }; | |||
| #endif | |||
| @@ -66,12 +66,10 @@ ControllerPluginGUI::CVGUI::CVGUI(int n, ControllerPluginGUI *p) | |||
| //////////////////////////////////////////// | |||
| ControllerPluginGUI::ControllerPluginGUI(int w, int h,ControllerPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o), | |||
| ControllerPluginGUI::ControllerPluginGUI(int w, int h,ControllerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch), | |||
| m_CVCount(0) | |||
| { | |||
| m_Plugin=o; | |||
| for (int n=0; n<MAX_CHANNELS; n++) | |||
| { | |||
| Numbers[n]=n; | |||
| @@ -126,8 +124,29 @@ void ControllerPluginGUI::Clear() | |||
| m_CVCount=0; | |||
| } | |||
| void ControllerPluginGUI::UpdateValues() | |||
| { | |||
| void ControllerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| ControllerPlugin *Plugin = (ControllerPlugin *)o; | |||
| int c; | |||
| string Title,Min,Max; | |||
| char temp[64]; | |||
| Clear(); | |||
| c=Plugin->GetNum(); | |||
| for (int n=0; n<c; n++) | |||
| { | |||
| AddCV(); | |||
| m_GuiVec[n]->m_Title->value(Plugin->GetName(n).c_str()); | |||
| sprintf(temp,"%f",Plugin->GetMin(n)); | |||
| m_GuiVec[n]->m_Min->value(temp); | |||
| sprintf(temp,"%f",Plugin->GetMax(n)); | |||
| m_GuiVec[n]->m_Max->value(temp); | |||
| m_GuiVec[n]->m_Chan->value(Plugin->GetVal(n)); | |||
| } | |||
| resize(x(),y(),c*60,h()); | |||
| } | |||
| inline void ControllerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v) | |||
| @@ -138,7 +157,14 @@ inline void ControllerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v) | |||
| long max=strtol(m_GuiVec[num]->m_Min->value(),NULL,10); | |||
| long min=strtol(m_GuiVec[num]->m_Max->value(),NULL,10); | |||
| float val=o->value()*(max-min)+min; | |||
| m_Plugin->SetChannel(num,val); | |||
| m_GUICH->Set("Number",num); | |||
| m_GUICH->Set("Value",val); | |||
| m_GUICH->Set("Min",(int)min); | |||
| m_GUICH->Set("Max",(int)max); | |||
| char temp[256]; | |||
| sprintf(temp,"%s",m_GuiVec[num]->m_Title->value()); | |||
| m_GUICH->Set("Name",temp); | |||
| m_GUICH->SetCommand(ControllerPlugin::SETCHANNEL); | |||
| } | |||
| void ControllerPluginGUI::cb_Chan(Fl_Slider* o, void* v) | |||
| { ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Chan_i(o,v);} | |||
| @@ -150,8 +176,8 @@ inline void ControllerPluginGUI::cb_Add_i(Fl_Button* o, void* v) | |||
| AddCV(); | |||
| resize(x(),y(),w()+60,h()); | |||
| redraw(); | |||
| m_Plugin->SetNum(m_GuiVec.size()); | |||
| m_GUICH->Set("Number",(int)m_GuiVec.size()); | |||
| m_GUICH->SetCommand(ControllerPlugin::SETNUM); | |||
| } | |||
| } | |||
| void ControllerPluginGUI::cb_Add(Fl_Button* o, void* v) | |||
| @@ -165,7 +191,8 @@ inline void ControllerPluginGUI::cb_Delete_i(Fl_Button* o, void* v) | |||
| resize(x(),y(),w()-60,h()); | |||
| redraw(); | |||
| m_Plugin->SetNum(m_GuiVec.size()); | |||
| m_GUICH->Set("Number",(int)m_GuiVec.size()); | |||
| m_GUICH->SetCommand(ControllerPlugin::SETNUM); | |||
| } | |||
| } | |||
| void ControllerPluginGUI::cb_Delete(Fl_Button* o, void* v) | |||
| @@ -36,12 +36,9 @@ static int Numbers[MAX_CHANNELS]; | |||
| class ControllerPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| ControllerPluginGUI(int w, int h, ControllerPlugin *o,const HostInfo *Info); | |||
| ControllerPluginGUI(int w, int h, ControllerPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| ControllerPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| void StreamIn(istream &s); | |||
| void StreamOut(ostream &s); | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| ControllerPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| ControllerPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -162,3 +165,5 @@ ControllerPluginGUI.o: ControllerPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -56,6 +56,9 @@ m_WriteHeadPos(0) | |||
| m_PluginInfo.PortTips.push_back("Delay CV"); | |||
| m_PluginInfo.PortTips.push_back("ReadHead CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Delay",&m_Delay); | |||
| m_AudioCH->Register("Mix",&m_Mix); | |||
| } | |||
| DelayPlugin::~DelayPlugin() | |||
| @@ -71,11 +74,9 @@ PluginInfo &DelayPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *DelayPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new DelayPluginGUI(m_PluginInfo.Width, | |||
| return new DelayPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void DelayPlugin::Execute() | |||
| @@ -34,13 +34,7 @@ public: | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetDelay(float s) { m_Delay=s; } | |||
| void SetMix(float s) { m_Mix=s; } | |||
| float GetDelay() { return m_Delay; } | |||
| float GetDelay() { return m_Delay; } | |||
| float GetMix() { return m_Mix; } | |||
| void Randomise(); | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| DelayPluginGUI::DelayPluginGUI(int w, int h,DelayPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| { | |||
| m_Plugin=o; | |||
| DelayPluginGUI::DelayPluginGUI(int w, int h,DelayPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Delay = new Fl_Slider(15, 20, 20, 70, "Delay"); | |||
| m_Delay->type(4); | |||
| m_Delay->selection_color(GUI_COLOUR); | |||
| @@ -52,21 +50,23 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void DelayPluginGUI::UpdateValues() | |||
| void DelayPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_Delay->value(m_Plugin->GetDelay()-5.0f); | |||
| m_Mix->value(m_Plugin->GetMix()); | |||
| DelayPlugin *Plugin = (DelayPlugin*)o; | |||
| m_Delay->value(Plugin->GetDelay()-5.0f); | |||
| m_Mix->value(Plugin->GetMix()); | |||
| } | |||
| inline void DelayPluginGUI::cb_Delay_i(Fl_Slider* o, void* v) | |||
| { | |||
| float value=1.0f-o->value(); | |||
| m_Plugin->SetDelay(value); | |||
| m_GUICH->Set("Delay",value); | |||
| } | |||
| void DelayPluginGUI::cb_Delay(Fl_Slider* o, void* v) | |||
| { ((DelayPluginGUI*)(o->parent()))->cb_Delay_i(o,v); } | |||
| inline void DelayPluginGUI::cb_Mix_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetMix(o->value()); } | |||
| { m_GUICH->Set("Mix",o->value()); } | |||
| void DelayPluginGUI::cb_Mix(Fl_Knob* o, void* v) | |||
| { ((DelayPluginGUI*)(o->parent()))->cb_Mix_i(o,v); } | |||
| @@ -32,13 +32,10 @@ | |||
| class DelayPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| DelayPluginGUI(int w, int h, DelayPlugin *o,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| DelayPlugin *m_Plugin; | |||
| DelayPluginGUI(int w, int h, DelayPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| Fl_Slider *m_Delay; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| DelayPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| DelayPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -164,3 +167,5 @@ DelayPluginGUI.o: DelayPluginGUI.C \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -69,8 +69,7 @@ PluginInfo &DistributorPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *DistributorPlugin::CreateGUI() | |||
| { | |||
| m_GUI=NULL; | |||
| return m_GUI; | |||
| return NULL; | |||
| } | |||
| void DistributorPlugin::Execute() | |||
| @@ -34,9 +34,6 @@ public: | |||
| virtual void StreamOut(ostream &s) {} | |||
| virtual void StreamIn(istream &s) {} | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| private: | |||
| bool m_Triggered; | |||
| bool m_Switch; | |||
| @@ -26,16 +26,15 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| DistributorPluginGUI::DistributorPluginGUI(int w, int h,DistributorPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| DistributorPluginGUI::DistributorPluginGUI(int w, int h,DistributorPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| end(); | |||
| } | |||
| void DistributorPluginGUI::UpdateValues() | |||
| void DistributorPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| } | |||
| @@ -33,12 +33,9 @@ | |||
| class DistributorPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| DistributorPluginGUI(int w, int h, DistributorPlugin *o,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| DistributorPlugin *m_Plugin; | |||
| DistributorPluginGUI(int w, int h, DistributorPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| //// Callbacks //// | |||
| @@ -44,6 +44,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| DistributorPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -58,6 +60,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| DistributorPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -167,4 +170,5 @@ DistributorPluginGUI.o: DistributorPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -55,6 +55,9 @@ m_HeadPos(0) | |||
| m_PluginInfo.PortTips.push_back("Delay CV"); | |||
| m_PluginInfo.PortTips.push_back("Feedback CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Delay",&m_Delay); | |||
| m_AudioCH->Register("Feedback",&m_Feedback); | |||
| } | |||
| EchoPlugin::~EchoPlugin() | |||
| @@ -70,11 +73,9 @@ PluginInfo &EchoPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *EchoPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new EchoPluginGUI(m_PluginInfo.Width, | |||
| return new EchoPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void EchoPlugin::Execute() | |||
| @@ -33,13 +33,7 @@ public: | |||
| virtual void Execute(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetDelay(float s) { m_Delay=s; } | |||
| void SetFeedback(float s) { m_Feedback=s; } | |||
| float GetDelay() { return m_Delay; } | |||
| float GetFeedback() { return m_Feedback; } | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| EchoPluginGUI::EchoPluginGUI(int w, int h,EchoPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| EchoPluginGUI::EchoPluginGUI(int w, int h,EchoPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| m_Delay = new Fl_Slider(15, 20, 20, 70, "Delay"); | |||
| m_Delay->type(4); | |||
| m_Delay->selection_color(GUI_COLOUR); | |||
| @@ -79,14 +77,16 @@ SpiralPluginGUI(w,h,o) | |||
| extern "C" int sprintf(char *,const char *,...); | |||
| void EchoPluginGUI::UpdateValues() | |||
| void EchoPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_Delay->value(1.0f-m_Plugin->GetDelay()); | |||
| m_Feedback->value(1.1f-m_Plugin->GetFeedback()); | |||
| EchoPlugin *Plugin = (EchoPlugin*)o; | |||
| m_Delay->value(1.0f-Plugin->GetDelay()); | |||
| m_Feedback->value(1.1f-Plugin->GetFeedback()); | |||
| char str[10]; | |||
| sprintf(str,"%5.3f s", m_Plugin->GetDelay()); | |||
| sprintf(str,"%5.3f s", Plugin->GetDelay()); | |||
| m_out_delay->value(str); | |||
| sprintf(str,"%5.1f %%", 100*m_Plugin->GetFeedback()); | |||
| sprintf(str,"%5.1f %%", 100*Plugin->GetFeedback()); | |||
| m_out_feedback->value(str); | |||
| } | |||
| @@ -94,7 +94,7 @@ inline void EchoPluginGUI::cb_Delay_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| float value=1.0f-o->value(); | |||
| m_Plugin->SetDelay(value); | |||
| m_GUICH->Set("Delay",value); | |||
| sprintf(str,"%5.3f s", value); | |||
| m_out_delay->value(str); | |||
| } | |||
| @@ -105,7 +105,7 @@ void EchoPluginGUI::cb_Delay(Fl_Slider* o, void* v) | |||
| inline void EchoPluginGUI::cb_Feedback_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetFeedback(1.1f-o->value()); | |||
| m_GUICH->Set("Feedback",(float)(1.1f-o->value())); | |||
| sprintf(str,"%5.1f %%", 100*(1.1f-o->value())); | |||
| m_out_feedback->value(str); | |||
| } | |||
| @@ -35,12 +35,9 @@ | |||
| class EchoPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| EchoPluginGUI(int w, int h, EchoPlugin *o,const HostInfo *Info); | |||
| EchoPluginGUI(int w, int h, EchoPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| EchoPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| EchoPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| EchoPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -164,3 +167,5 @@ EchoPluginGUI.o: EchoPluginGUI.C \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -4,7 +4,7 @@ for file in `cat PluginList.txt` | |||
| do | |||
| echo $file | |||
| cd $file/ | |||
| nedit $file.h | |||
| nedit $file.C | |||
| cvs edit Makefile.in | |||
| nedit Makefile.in | |||
| cd .. | |||
| done | |||
| @@ -51,6 +51,9 @@ m_Value(0) | |||
| m_PluginInfo.NumOutputs=1; | |||
| m_PluginInfo.PortTips.push_back("Input"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Attack",&m_Attack); | |||
| m_AudioCH->Register("Decay",&m_Decay); | |||
| } | |||
| EnvFollowerPlugin::~EnvFollowerPlugin() | |||
| @@ -64,11 +67,9 @@ PluginInfo &EnvFollowerPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *EnvFollowerPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new EnvFollowerPluginGUI(m_PluginInfo.Width, | |||
| return new EnvFollowerPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void EnvFollowerPlugin::Execute() | |||
| @@ -34,12 +34,7 @@ public: | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetAttack(float v) { m_Attack=v; } | |||
| float GetAttack() { return m_Attack; } | |||
| void SetDecay(float v) { m_Decay=v; } | |||
| float GetDecay() { return m_Decay; } | |||
| private: | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| EnvFollowerPluginGUI::EnvFollowerPluginGUI(int w, int h,EnvFollowerPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| EnvFollowerPluginGUI::EnvFollowerPluginGUI(int w, int h,EnvFollowerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| m_Attack = new Fl_Knob(20, 25, 40, 40, "Attack"); | |||
| m_Attack->color(GUI_COLOUR); | |||
| m_Attack->type(Fl_Knob::DOTLIN); | |||
| @@ -56,18 +54,19 @@ SpiralPluginGUI(w,h,o) | |||
| void EnvFollowerPluginGUI::UpdateValues() | |||
| void EnvFollowerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_Attack->value(m_Plugin->GetAttack()); | |||
| m_Decay->value(m_Plugin->GetDecay()); | |||
| EnvFollowerPlugin *Plugin = (EnvFollowerPlugin*)o; | |||
| m_Attack->value(Plugin->GetAttack()); | |||
| m_Decay->value(Plugin->GetDecay()); | |||
| } | |||
| inline void EnvFollowerPluginGUI::cb_Decay_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetDecay(o->value()); } | |||
| { m_GUICH->Set("Decay",o->value()); } | |||
| void EnvFollowerPluginGUI::cb_Decay(Fl_Knob* o, void* v) | |||
| { ((EnvFollowerPluginGUI*)(o->parent()))->cb_Decay_i(o,v);} | |||
| inline void EnvFollowerPluginGUI::cb_Attack_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetAttack(o->value()); } | |||
| { m_GUICH->Set("Attack",o->value()); } | |||
| void EnvFollowerPluginGUI::cb_Attack(Fl_Knob* o, void* v) | |||
| { ((EnvFollowerPluginGUI*)(o->parent()))->cb_Attack_i(o,v);} | |||
| @@ -33,12 +33,10 @@ | |||
| class EnvFollowerPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| EnvFollowerPluginGUI(int w, int h, EnvFollowerPlugin *o,const HostInfo *Info); | |||
| EnvFollowerPluginGUI(int w, int h, EnvFollowerPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| EnvFollowerPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| Fl_Knob* m_Attack; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| EnvFollowerPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| EnvFollowerPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -166,3 +169,5 @@ EnvFollowerPluginGUI.o: EnvFollowerPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -58,6 +58,13 @@ m_TrigThresh(0.01) | |||
| m_PluginInfo.PortTips.push_back("Input"); | |||
| m_PluginInfo.PortTips.push_back("CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Attack",&m_Attack); | |||
| m_AudioCH->Register("Decay",&m_Decay); | |||
| m_AudioCH->Register("Sustain",&m_Sustain); | |||
| m_AudioCH->Register("Release",&m_Release); | |||
| m_AudioCH->Register("Volume",&m_Volume); | |||
| m_AudioCH->Register("Trig",&m_TrigThresh); | |||
| } | |||
| EnvelopePlugin::~EnvelopePlugin() | |||
| @@ -73,11 +80,9 @@ PluginInfo &EnvelopePlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *EnvelopePlugin::CreateGUI() | |||
| { | |||
| m_GUI = new EnvelopePluginGUI(m_PluginInfo.Width, | |||
| return new EnvelopePluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void EnvelopePlugin::Execute() | |||
| @@ -35,17 +35,7 @@ public: | |||
| virtual void Execute(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetAttack(float s) { m_Attack=s; } | |||
| void SetDecay(float s) { m_Decay=s; } | |||
| void SetSustain(float s) { m_Sustain=s; } | |||
| void SetRelease(float s) { m_Release=s; } | |||
| void SetVolume(float s) { m_Volume=s; } | |||
| void SetTrigThresh(float s) { m_TrigThresh=s; } | |||
| float GetAttack() { return m_Attack; } | |||
| float GetDecay() { return m_Decay; } | |||
| float GetSustain() { return m_Sustain; } | |||
| @@ -27,11 +27,9 @@ static const float TIMED_SLIDER_MAX = 3.0f; | |||
| //////////////////////////////////////////// | |||
| EnvelopePluginGUI::EnvelopePluginGUI(int w, int h,EnvelopePlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| { | |||
| m_Plugin=o; | |||
| EnvelopePluginGUI::EnvelopePluginGUI(int w, int h,EnvelopePlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| Thresh = new Fl_Slider(10, 20, 20, 70, "T"); | |||
| Thresh->type(4); | |||
| Thresh->selection_color(GUI_COLOUR); | |||
| @@ -154,26 +152,28 @@ SpiralPluginGUI(w,h,o) | |||
| extern "C" int sprintf(char *,const char *,...); | |||
| void EnvelopePluginGUI::UpdateValues() | |||
| void EnvelopePluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| Thresh->value(1.0f-sqrt(m_Plugin->GetAttack())); | |||
| Attack->value(TIMED_SLIDER_MAX-sqrt(m_Plugin->GetAttack())); | |||
| Decay->value(TIMED_SLIDER_MAX-sqrt(m_Plugin->GetDecay())); | |||
| Sustain->value(1.0f-m_Plugin->GetSustain()); | |||
| Release->value(TIMED_SLIDER_MAX-sqrt(m_Plugin->GetRelease())); | |||
| Volume->value(1.0f-m_Plugin->GetVolume()); | |||
| EnvelopePlugin *Plugin = (EnvelopePlugin*)o; | |||
| Thresh->value(1.0f-sqrt(Plugin->GetAttack())); | |||
| Attack->value(TIMED_SLIDER_MAX-sqrt(Plugin->GetAttack())); | |||
| Decay->value(TIMED_SLIDER_MAX-sqrt(Plugin->GetDecay())); | |||
| Sustain->value(1.0f-Plugin->GetSustain()); | |||
| Release->value(TIMED_SLIDER_MAX-sqrt(Plugin->GetRelease())); | |||
| Volume->value(1.0f-Plugin->GetVolume()); | |||
| char str[10]; | |||
| sprintf(str,"%4.0f %%", 100*m_Plugin->GetTrigThresh()); | |||
| sprintf(str,"%4.0f %%", 100*Plugin->GetTrigThresh()); | |||
| m_out_thresh->value(str); | |||
| sprintf(str,"%5.3f s", m_Plugin->GetAttack()); | |||
| sprintf(str,"%5.3f s", Plugin->GetAttack()); | |||
| m_out_attack->value(str); | |||
| sprintf(str,"%5.3f s", m_Plugin->GetDecay()); | |||
| sprintf(str,"%5.3f s", Plugin->GetDecay()); | |||
| m_out_decay->value(str); | |||
| sprintf(str,"%4.0f %%", 100*m_Plugin->GetSustain()); | |||
| sprintf(str,"%4.0f %%", 100*Plugin->GetSustain()); | |||
| m_out_sustain->value(str); | |||
| sprintf(str,"%5.3f s", m_Plugin->GetRelease()); | |||
| sprintf(str,"%5.3f s", Plugin->GetRelease()); | |||
| m_out_release->value(str); | |||
| sprintf(str,"%4.0f %%", 100*m_Plugin->GetVolume()); | |||
| sprintf(str,"%4.0f %%", 100*Plugin->GetVolume()); | |||
| m_out_volume->value(str); | |||
| } | |||
| @@ -181,7 +181,7 @@ void EnvelopePluginGUI::UpdateValues() | |||
| inline void EnvelopePluginGUI::cb_Thresh_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetTrigThresh(1.0f-o->value()); | |||
| m_GUICH->Set("Trig",1.0f-o->value()); | |||
| sprintf(str,"%4.0f %%", 100*(1.0f-o->value())); | |||
| m_out_thresh->value(str); | |||
| } | |||
| @@ -193,7 +193,7 @@ inline void EnvelopePluginGUI::cb_Attack_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| float value=TIMED_SLIDER_MAX-o->value(); | |||
| m_Plugin->SetAttack(value*value); | |||
| m_GUICH->Set("Attack",value*value); | |||
| sprintf(str,"%5.3f s", value*value); | |||
| m_out_attack->value(str); | |||
| } | |||
| @@ -204,7 +204,7 @@ inline void EnvelopePluginGUI::cb_Decay_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| float value=TIMED_SLIDER_MAX-o->value(); | |||
| m_Plugin->SetDecay(value*value); | |||
| m_GUICH->Set("Decay",value*value); | |||
| sprintf(str,"%5.3f s", value*value); | |||
| m_out_decay->value(str); | |||
| } | |||
| @@ -214,7 +214,7 @@ void EnvelopePluginGUI::cb_Decay(Fl_Slider* o, void* v) | |||
| inline void EnvelopePluginGUI::cb_Sustain_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetSustain(1.0f-o->value()); | |||
| m_GUICH->Set("Sustain",1.0f-o->value()); | |||
| sprintf(str,"%4.0f %%", 100*(1.0f-o->value())); | |||
| m_out_sustain->value(str); | |||
| } | |||
| @@ -226,7 +226,7 @@ inline void EnvelopePluginGUI::cb_Release_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| float value=TIMED_SLIDER_MAX-o->value(); | |||
| m_Plugin->SetRelease(value*value); | |||
| m_GUICH->Set("Release",value*value); | |||
| sprintf(str,"%5.3f s", value*value); | |||
| m_out_release->value(str); | |||
| } | |||
| @@ -237,7 +237,7 @@ inline void EnvelopePluginGUI::cb_Volume_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetVolume(1.0f-o->value()); | |||
| m_GUICH->Set("Volume",1.0f-o->value()); | |||
| sprintf(str,"%4.0f %%", 100*(1.0f-o->value())); | |||
| m_out_volume->value(str); | |||
| } | |||
| @@ -34,12 +34,10 @@ | |||
| class EnvelopePluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| EnvelopePluginGUI(int w, int h, EnvelopePlugin *o,const HostInfo *Info); | |||
| EnvelopePluginGUI(int w, int h, EnvelopePlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| EnvelopePlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| Fl_Slider *Thresh; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| EnvelopePluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| EnvelopePluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -162,3 +165,5 @@ EnvelopePluginGUI.o: EnvelopePluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -64,6 +64,12 @@ m_RevResonanceMod(false) | |||
| m_PluginInfo.PortTips.push_back("Cutoff CV"); | |||
| m_PluginInfo.PortTips.push_back("Emphasis CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Cutoff",&fc); | |||
| m_AudioCH->Register("Resonance",&Q); | |||
| m_AudioCH->Register("RevC",&m_RevCutoffMod); | |||
| m_AudioCH->Register("RevR",&m_RevResonanceMod); | |||
| } | |||
| FilterPlugin::~FilterPlugin() | |||
| @@ -92,11 +98,9 @@ PluginInfo &FilterPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *FilterPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new FilterPluginGUI(m_PluginInfo.Width, | |||
| return new FilterPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void FilterPlugin::Execute() | |||
| @@ -142,7 +146,7 @@ void FilterPlugin::Execute() | |||
| m_LastFC=fc; | |||
| } | |||
| } | |||
| float in = GetInput(0,n); | |||
| //if (in!=0) | |||
| //{ | |||
| @@ -36,17 +36,10 @@ public: | |||
| virtual void Execute(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void Reset(); | |||
| void SetupCoeffs(); | |||
| void SetCutoff(double s) {fc=s;} | |||
| void SetResonance(double s) {Q=s;} | |||
| void SetRevCutoffMod(bool s) {m_RevCutoffMod=s;} | |||
| void SetRevResonanceMod(bool s) {m_RevResonanceMod=s;} | |||
| double GetCutoff() {return fc;} | |||
| double GetResonance() {return Q;} | |||
| bool GetRevCutoffMod() {return m_RevCutoffMod;} | |||
| @@ -58,10 +51,10 @@ private: | |||
| // Voice independant | |||
| float *coef; | |||
| double fs, fc; // Sampling frequency, cutoff frequency | |||
| double Q; // Resonance > 1.0 < 1000 | |||
| double m_LastFC; | |||
| double m_LastQ; | |||
| float fs, fc; // Sampling frequency, cutoff frequency | |||
| float Q; // Resonance > 1.0 < 1000 | |||
| float m_LastFC; | |||
| float m_LastQ; | |||
| unsigned nInd; | |||
| double a0, a1, a2, b0, b1, b2; | |||
| double k; // overall gain factor | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| FilterPluginGUI::FilterPluginGUI(int w, int h,FilterPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| FilterPluginGUI::FilterPluginGUI(int w, int h,FilterPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| Cutoff = new Fl_Slider(15, 20, 20, 70, "Cutoff"); | |||
| Cutoff->type(4); | |||
| Cutoff->selection_color(GUI_COLOUR); | |||
| @@ -64,38 +62,40 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void FilterPluginGUI::UpdateValues() | |||
| void FilterPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| Cutoff->value(100.0f-sqrt(m_Plugin->GetCutoff()-10.0f)); | |||
| Resonance->value(m_Plugin->GetResonance()-1.0f); | |||
| FilterPlugin *Plugin = (FilterPlugin*)o; | |||
| Cutoff->value(100.0f-sqrt(Plugin->GetCutoff()-10.0f)); | |||
| Resonance->value(Plugin->GetResonance()-1.0f); | |||
| RevCutoff->value(0); | |||
| RevResonance->value(0); | |||
| if (m_Plugin->GetRevCutoffMod()) RevCutoff->value(1); | |||
| if (m_Plugin->GetRevResonanceMod()) RevResonance->value(1); | |||
| if (Plugin->GetRevCutoffMod()) RevCutoff->value(1); | |||
| if (Plugin->GetRevResonanceMod()) RevResonance->value(1); | |||
| } | |||
| inline void FilterPluginGUI::cb_Cutoff_i(Fl_Slider* o, void* v) | |||
| { | |||
| float value=100.0f-o->value(); | |||
| m_Plugin->SetCutoff((value*value)+10.0f); | |||
| m_GUICH->Set("Cutoff",(float)(value*value)+10.0f); | |||
| } | |||
| void FilterPluginGUI::cb_Cutoff(Fl_Slider* o, void* v) | |||
| { ((FilterPluginGUI*)(o->parent()))->cb_Cutoff_i(o,v); } | |||
| inline void FilterPluginGUI::cb_Resonance_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetResonance(o->value()+1.0f); } | |||
| { m_GUICH->Set("Resonance",(float)o->value()+1.0f); } | |||
| void FilterPluginGUI::cb_Resonance(Fl_Knob* o, void* v) | |||
| { ((FilterPluginGUI*)(o->parent()))->cb_Resonance_i(o,v); } | |||
| inline void FilterPluginGUI::cb_RevCutoff_i(Fl_Button* o, void* v) | |||
| { m_Plugin->SetRevCutoffMod(o->value()); } | |||
| { m_GUICH->Set("RevC",(bool)o->value()); } | |||
| void FilterPluginGUI::cb_RevCutoff(Fl_Button* o, void* v) | |||
| { ((FilterPluginGUI*)(o->parent()))->cb_RevCutoff_i(o,v); } | |||
| inline void FilterPluginGUI::cb_RevResonance_i(Fl_Button* o, void* v) | |||
| { m_Plugin->SetRevResonanceMod(o->value()); } | |||
| { m_GUICH->Set("RevR",(bool)o->value()); } | |||
| void FilterPluginGUI::cb_RevResonance(Fl_Button* o, void* v) | |||
| { ((FilterPluginGUI*)(o->parent()))->cb_RevResonance_i(o,v); } | |||
| @@ -32,12 +32,9 @@ | |||
| class FilterPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| FilterPluginGUI(int w, int h, FilterPlugin *o,const HostInfo *Info); | |||
| FilterPluginGUI(int w, int h, FilterPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| FilterPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| FilterPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| FilterPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -172,3 +175,5 @@ FilterPluginGUI.o: FilterPluginGUI.C \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -317,7 +317,8 @@ int GetID() | |||
| /////////////////////////////////////////////////////// | |||
| JackPlugin::JackPlugin() | |||
| JackPlugin::JackPlugin() : | |||
| m_UpdateNames(false) | |||
| { | |||
| m_RefCount++; | |||
| @@ -340,6 +341,15 @@ JackPlugin::JackPlugin() | |||
| sprintf(Temp,"SSM Input %d",n); | |||
| m_PluginInfo.PortTips.push_back(Temp); | |||
| } | |||
| m_AudioCH->Register("Num",&GUIArgs.Num); | |||
| m_AudioCH->RegisterData("Port",ChannelHandler::INPUT,&GUIArgs.Port,sizeof(GUIArgs.Port)); | |||
| m_AudioCH->Register("NumInputPortNames",&m_NumInputPortNames,ChannelHandler::OUTPUT); | |||
| m_AudioCH->Register("NumOutputPortNames",&m_NumOutputPortNames,ChannelHandler::OUTPUT); | |||
| m_AudioCH->RegisterData("InputPortNames",ChannelHandler::OUTPUT,&m_InputPortNames,sizeof(m_InputPortNames)); | |||
| m_AudioCH->RegisterData("OutputPortNames",ChannelHandler::OUTPUT,&m_OutputPortNames,sizeof(m_OutputPortNames)); | |||
| m_AudioCH->Register("UpdateNames",&m_UpdateNames,ChannelHandler::OUTPUT); | |||
| m_AudioCH->Register("Connected",&m_Connected,ChannelHandler::OUTPUT); | |||
| } | |||
| JackPlugin::~JackPlugin() | |||
| @@ -364,11 +374,9 @@ PluginInfo &JackPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *JackPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new JackPluginGUI(m_PluginInfo.Width, | |||
| return new JackPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void JackPlugin::Execute() | |||
| @@ -401,3 +409,27 @@ void JackPlugin::Execute() | |||
| } | |||
| void JackPlugin::ExecuteCommands() | |||
| { | |||
| if (m_UpdateNames) | |||
| { | |||
| vector<string> InputNames,OutputNames; | |||
| GetPortNames(InputNames,OutputNames); | |||
| for (vector<string>::iterator i=InputNames.begin(); | |||
| i!=InputNames.end(); ++i) | |||
| { | |||
| strcpy(m_InputPortNames[n],i->c_str()); | |||
| } | |||
| for (vector<string>::iterator i=OutputNames.begin(); | |||
| i!=OutputNames.end(); ++i) | |||
| { | |||
| strcpy(m_OutputPortNames[n],i->c_str()); | |||
| } | |||
| m_NumInputPortNames=InputNames.size(); | |||
| m_NumOutputPortNames=OutputNames.size(); | |||
| m_UpdateNames=false; | |||
| } | |||
| } | |||
| @@ -30,6 +30,8 @@ typedef jack_default_audio_sample_t sample_t; | |||
| const int NUM_INPUTS = 8; | |||
| const int NUM_OUTPUTS = 8; | |||
| const int MAX_INPUTPORTS = 256; | |||
| const int MAX_OUTPUTPORTS = 256; | |||
| class JackClient | |||
| { | |||
| @@ -99,17 +101,32 @@ public: | |||
| virtual void StreamOut(ostream &s) {} | |||
| virtual void StreamIn(istream &s) {} | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| enum GUICommands{NONE,ATTACH,DETACH,CONNECTINPUT,CONNECTOUTPUT}; | |||
| struct GUIArgs | |||
| { | |||
| int Num; | |||
| char Port[256]; | |||
| }; | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| // slightly clumsy, but we have to share this data with the gui | |||
| int m_NumInputPortNames; | |||
| char m_InputPortNames[MAX_INPUTPORTS][256]; | |||
| int m_NumOutputPortNames; | |||
| char m_OutputPortNames[MAX_OUTPUTPORTS][256]; | |||
| void Attach() { JackClient::Get()->Attach(); } | |||
| void Detach() { JackClient::Get()->Detach(); } | |||
| void GetPortNames(vector<string> &InputNames,vector<string> &OutputNames) { JackClient::Get()->GetPortNames(InputNames,OutputNames); } | |||
| void ConnectInput(int n, const string &JackPort) { JackClient::Get()->ConnectInput(n,JackPort); } | |||
| void ConnectOutput(int n, const string &JackPort) { JackClient::Get()->ConnectOutput(n,JackPort); } | |||
| private: | |||
| static int m_RefCount; | |||
| static int m_NoExecuted; | |||
| bool m_UpdateNames; | |||
| bool m_Connected; | |||
| }; | |||
| #endif | |||
| @@ -75,8 +75,8 @@ int OptionsList(const vector<string> &List) | |||
| //////////////////////////////////////////////////////////////////////// | |||
| JackPluginGUI::JackPluginGUI(int w, int h,JackPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| JackPluginGUI::JackPluginGUI(int w, int h,JackPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| for (int n=0; n<255; n++) Numbers[n]=n; | |||
| @@ -122,7 +122,7 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void JackPluginGUI::UpdateValues() | |||
| void JackPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| } | |||
| @@ -146,7 +146,26 @@ inline void JackPluginGUI::cb_OutputConnect_i(Fl_Button* o, void* v) | |||
| { | |||
| cerr<<"cb_OutputConnect_i"<<endl; | |||
| vector<string> Inputs,Outputs; | |||
| m_Plugin->GetPortNames(Inputs,Outputs); | |||
| m_GUICH->Set("UpdateNames",true); | |||
| // bit of a hack for multithreaded safety | |||
| int ninputs=m_GUICH->GetInt("NumOutputPortNames"), | |||
| int noutputs=m_GUICH->GetInt("NumOutputPortNames"); | |||
| char **inputs = new char[MAX_INPUTPORTS][256]; | |||
| char **outputs = new char[MAX_OUTPUTPORTS][256];; | |||
| for (int n=0 n<m_GUICH->GetInt("NumInputPortNames"); n++) | |||
| { | |||
| Inputs.push_back(inputs[n]); | |||
| } | |||
| for (int n=0 n<m_GUICH->GetInt("NumOutputPortNames"); n++) | |||
| { | |||
| Inputs.push_back(outputs[n]); | |||
| } | |||
| delete[] inputs; | |||
| delete[] outputs; | |||
| // connect this plugin's output to a jack input | |||
| int choice=OptionsList(Inputs); | |||
| @@ -35,14 +35,10 @@ | |||
| class JackPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| JackPluginGUI(int w, int h, JackPlugin *o,const HostInfo *Info); | |||
| JackPluginGUI(int w, int h, JackPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| void SetAttached(bool s) { m_Indicator->value(s); } | |||
| JackPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| virtual void draw() { m_Indicator->value(m_GUICH->GetBool("Connected"); }; | |||
| private: | |||
| @@ -45,6 +45,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_LED_Button.H \ | |||
| @@ -54,6 +55,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| JackPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../Widgets/Fl_LED_Button.cxx \ | |||
| @@ -63,6 +65,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| JackPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../Widgets/Fl_LED_Button.o \ | |||
| @@ -187,3 +190,5 @@ JackPluginGUI.o: JackPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| JoystickPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| JoystickPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -166,4 +169,5 @@ JoystickPluginGUI.o: JoystickPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -20,7 +20,75 @@ | |||
| #include <stdio.h> | |||
| #include "SpiralIcon.xpm" | |||
| #include "utils.h" | |||
| #include <algorithm> | |||
| //////////////////////////////////////////// | |||
| /* FIXME: No matter what, I can't let this as it!! */ | |||
| static LADSPAPlugin * lg = NULL; | |||
| void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, | |||
| LADSPA_Descriptor_Function pfDescriptorFunction) { | |||
| const LADSPA_Descriptor * psDescriptor; | |||
| long lIndex; | |||
| unsigned long lPluginIndex; | |||
| unsigned long lPortIndex; | |||
| unsigned long lLength; | |||
| LADSPA_PortRangeHintDescriptor iHintDescriptor; | |||
| LADSPA_Data fBound; | |||
| #define testcond(c,s) { \ | |||
| if (!(c)) { \ | |||
| cerr << (s); \ | |||
| failure = 1; \ | |||
| } \ | |||
| } | |||
| for (lIndex = 0; (psDescriptor = pfDescriptorFunction(lIndex)) != NULL; lIndex++) { | |||
| int failure = 0; | |||
| testcond(!LADSPA_IS_REALTIME(psDescriptor->Properties), "ERROR: PLUGIN MUST RUN REAL TIME.\n"); | |||
| testcond(psDescriptor->instantiate, "ERROR: PLUGIN HAS NO INSTANTIATE FUNCTION.\n"); | |||
| testcond(psDescriptor->connect_port, "ERROR: PLUGIN HAS NO CONNECT_PORT FUNCTION.\n"); | |||
| testcond(psDescriptor->run, "ERROR: PLUGIN HAS NO RUN FUNCTION.\n"); | |||
| testcond(!(psDescriptor->run_adding != 0 && psDescriptor->set_run_adding_gain == 0), | |||
| "ERROR: PLUGIN HAS RUN_ADDING FUNCTION BUT NOT SET_RUN_ADDING_GAIN.\n"); | |||
| testcond(!(psDescriptor->run_adding == 0 && psDescriptor->set_run_adding_gain != 0), | |||
| "ERROR: PLUGIN HAS SET_RUN_ADDING_GAIN FUNCTION BUT NOT RUN_ADDING.\n"); | |||
| testcond(psDescriptor->cleanup, "ERROR: PLUGIN HAS NO CLEANUP FUNCTION.\n"); | |||
| testcond(!LADSPA_IS_INPLACE_BROKEN(psDescriptor->Properties), | |||
| "ERROR: THIS PLUGIN CANNOT USE IN-PLACE PROCESSING.\n"); | |||
| testcond(psDescriptor->PortCount, "ERROR: PLUGIN HAS NO PORTS.\n"); | |||
| if (!failure) { | |||
| LPluginInfo pi; | |||
| pi.Filename = pcFullFilename; | |||
| pi.Label = psDescriptor->Label; | |||
| pi.Name = psDescriptor->Name; | |||
| /* ARGH! I really can't stand this ugly hack */ | |||
| lg->m_LADSPAList.push_back(pi); | |||
| } else { | |||
| cerr << "Plugin ignored...\n\n"; | |||
| } | |||
| } | |||
| dlclose(pvPluginHandle); | |||
| } | |||
| void LADSPAPlugin::LoadPluginList(void) | |||
| { | |||
| m_LADSPAList.clear(); | |||
| m_CurrentPlugin.Name = ""; | |||
| m_CurrentPlugin.Filename = ""; | |||
| m_CurrentPlugin.Label = ""; | |||
| lg = this; | |||
| LADSPAPluginSearch(describePluginLibrary); | |||
| lg = NULL; | |||
| sort(m_LADSPAList.begin(), m_LADSPAList.end(), LPluginInfoSortAsc()); | |||
| } | |||
| //////////////////////////////////////////////////// | |||
| extern "C" { | |||
| SpiralPlugin* CreateInstance() | |||
| { | |||
| @@ -54,6 +122,17 @@ m_Amped(false) | |||
| m_PluginInfo.NumInputs=0; | |||
| m_PluginInfo.NumOutputs=1; | |||
| m_PluginInfo.PortTips.push_back("Nuffink yet"); | |||
| m_AudioCH->Register("Gain",&m_Gain); | |||
| m_AudioCH->Register("Amped",&m_Amped); | |||
| m_AudioCH->RegisterData("Desc",ChannelHandler::OUTPUT,&PlugDesc,sizeof(PlugDesc)); | |||
| m_AudioCH->Register("Num",&m_GUIArgs.Num); | |||
| m_AudioCH->Register("Value",&m_GUIArgs.Value); | |||
| m_AudioCH->Register("Clamp",&m_GUIArgs.Clamp); | |||
| m_AudioCH->RegisterData("Filename",ChannelHandler::INPUT,&m_GUIArgs.Filename,sizeof(m_GUIArgs.Filename)); | |||
| m_AudioCH->RegisterData("Label",ChannelHandler::INPUT,&m_GUIArgs.Label,sizeof(m_GUIArgs.Label)); | |||
| LoadPluginList(); | |||
| } | |||
| LADSPAPlugin::~LADSPAPlugin() | |||
| @@ -70,11 +149,7 @@ PluginInfo &LADSPAPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *LADSPAPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new LADSPAPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| return new LADSPAPluginGUI(m_PluginInfo.Width,m_PluginInfo.Height,this,m_AudioCH,m_HostInfo,m_LADSPAList); | |||
| } | |||
| void LADSPAPlugin::Execute() | |||
| @@ -106,7 +181,7 @@ void LADSPAPlugin::Execute() | |||
| } | |||
| } | |||
| // Update the GUI outputs with the first value in the buffer | |||
| ((LADSPAPluginGUI*)m_GUI)->UpdatePortDisplay(n,m_LADSPABufVec[n][0]); | |||
| //((LADSPAPluginGUI*)m_GUI)->UpdatePortDisplay(n,m_LADSPABufVec[n][0]); | |||
| } | |||
| else // zero | |||
| { | |||
| @@ -138,6 +213,20 @@ void LADSPAPlugin::Execute() | |||
| } | |||
| } | |||
| void LADSPAPlugin::ExecuteCommands() | |||
| { | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch(m_AudioCH->GetCommand()) | |||
| { | |||
| case (SETMIN) : SetMin(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
| case (SETMAX) : SetMax(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
| case (SETCLAMP) : SetPortClamp(m_GUIArgs.Num,m_GUIArgs.Clamp); break; | |||
| case (UPDATEPLUGIN) : UpdatePlugin(m_GUIArgs.Num); break; | |||
| }; | |||
| } | |||
| } | |||
| void LADSPAPlugin::StreamOut(ostream &s) | |||
| { | |||
| s<<m_Version<<" "; | |||
| @@ -147,8 +236,8 @@ void LADSPAPlugin::StreamOut(ostream &s) | |||
| case 3: | |||
| { | |||
| s<<m_Gain<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetFilename()<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetLabel()<<" "; | |||
| s<<m_CurrentPlugin.Filename<<" "; | |||
| s<<m_CurrentPlugin.Label<<" "; | |||
| s<<m_PortMin.size()<<" "; | |||
| assert(m_PortMin.size()==m_PortMax.size()); | |||
| assert(m_PortMin.size()==m_PortClamp.size()); | |||
| @@ -174,8 +263,8 @@ void LADSPAPlugin::StreamOut(ostream &s) | |||
| // version is always 3! | |||
| { | |||
| s<<m_Gain<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetFilename()<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetLabel()<<" "; | |||
| s<<m_CurrentPlugin.Filename<<" "; | |||
| s<<m_CurrentPlugin.Label<<" "; | |||
| s<<m_PortMin.size()<<" "; | |||
| assert(m_PortMin.size()==m_PortMax.size()); | |||
| for (vector<float>::iterator i=m_PortMin.begin(); | |||
| @@ -194,8 +283,8 @@ void LADSPAPlugin::StreamOut(ostream &s) | |||
| case 1: | |||
| { | |||
| s<<m_Gain<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetFilename()<<" "; | |||
| s<<((LADSPAPluginGUI*)m_GUI)->GetLabel()<<" "; | |||
| s<<m_CurrentPlugin.Filename<<" "; | |||
| s<<m_CurrentPlugin.Label<<" "; | |||
| } | |||
| break; | |||
| } | |||
| @@ -240,10 +329,14 @@ void LADSPAPlugin::StreamIn(istream &s) | |||
| { | |||
| UpdatePlugin(Filename.c_str(), Label.c_str(), false); | |||
| } | |||
| m_CurrentPlugin.Ports.reserve(PortCount); | |||
| for (int n=0; n<PortCount; n++) | |||
| { | |||
| ((LADSPAPluginGUI*)m_GUI)->SetMinMax(n,m_PortMin[n],m_PortMax[n],m_PortClamp[n]); | |||
| m_CurrentPlugin.Ports[n].Min=m_PortMin[n]; | |||
| m_CurrentPlugin.Ports[n].Max=m_PortMax[n]; | |||
| m_CurrentPlugin.Ports[n].Clamped=m_PortClamp[n]; | |||
| } | |||
| } | |||
| break; | |||
| @@ -279,10 +372,14 @@ void LADSPAPlugin::StreamIn(istream &s) | |||
| { | |||
| UpdatePlugin(Filename.c_str(), Label.c_str(), false); | |||
| } | |||
| m_CurrentPlugin.Ports.reserve(PortCount); | |||
| for (int n=0; n<PortCount; n++) | |||
| { | |||
| ((LADSPAPluginGUI*)m_GUI)->SetMinMax(n,m_PortMin[n],m_PortMax[n],m_PortClamp[n]); | |||
| m_CurrentPlugin.Ports[n].Min=m_PortMin[n]; | |||
| m_CurrentPlugin.Ports[n].Max=m_PortMax[n]; | |||
| m_CurrentPlugin.Ports[n].Clamped=m_PortClamp[n]; | |||
| } | |||
| } | |||
| break; | |||
| @@ -303,7 +400,12 @@ void LADSPAPlugin::StreamIn(istream &s) | |||
| } | |||
| } | |||
| bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool PortClampReset) | |||
| bool LADSPAPlugin::UpdatePlugin(int n) | |||
| { | |||
| return UpdatePlugin(m_LADSPAList[n].Filename.c_str(),m_LADSPAList[n].Label.c_str()); | |||
| } | |||
| bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool PortClampReset=true) | |||
| { | |||
| // first call with same info, to clear the ports | |||
| UpdatePluginInfoWithHost(); | |||
| @@ -385,11 +487,13 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool | |||
| ////////////////////////////// | |||
| // Update the GUI stuff | |||
| ((LADSPAPluginGUI*)m_GUI)->SetName(PlugDesc->Name); | |||
| ((LADSPAPluginGUI*)m_GUI)->SetMaker(PlugDesc->Maker); | |||
| m_CurrentPlugin.Name=PlugDesc->Name; | |||
| m_CurrentPlugin.Maker=PlugDesc->Maker; | |||
| m_CurrentPlugin.Filename=filename; | |||
| m_CurrentPlugin.Label=label; | |||
| m_CurrentPlugin.Ports.clear(); | |||
| m_PluginInfo.PortTips.clear(); | |||
| ((LADSPAPluginGUI*)m_GUI)->ClearPortInfo(); | |||
| string desc; | |||
| c=0; | |||
| @@ -400,7 +504,11 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool | |||
| desc = string(PlugDesc->PortNames[i]) + | |||
| (LADSPA_IS_PORT_CONTROL(PlugDesc->PortDescriptors[i]) ? " (CV)" : " (AU)"); | |||
| m_PluginInfo.PortTips.push_back(desc.c_str()); | |||
| ((LADSPAPluginGUI*)m_GUI)->AddPortInfo(m_PluginInfo.PortTips[c].c_str()); | |||
| LPluginInfo::LPortDetails PortDetails; | |||
| PortDetails.Name=m_PluginInfo.PortTips[c].c_str(); | |||
| m_CurrentPlugin.Ports.push_back(PortDetails); | |||
| c++; | |||
| } | |||
| } | |||
| @@ -415,10 +523,7 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool | |||
| m_PluginInfo.PortTips.push_back(desc.c_str()); | |||
| } | |||
| } | |||
| ((LADSPAPluginGUI*)m_GUI)->SetFilename(filename); | |||
| ((LADSPAPluginGUI*)m_GUI)->SetLabel(label); | |||
| UpdatePluginInfoWithHost(); | |||
| if (PortClampReset) | |||
| @@ -455,8 +560,10 @@ bool LADSPAPlugin::UpdatePlugin(const char * filename, const char * label, bool | |||
| m_PortMax.push_back(Max); | |||
| // PortClamp defaults to true | |||
| m_PortClamp.push_back(true); | |||
| ((LADSPAPluginGUI*)m_GUI)->SetMinMax(n, Min, Max, true); | |||
| m_CurrentPlugin.Ports[n].Min=Min; | |||
| m_CurrentPlugin.Ports[n].Max=Max; | |||
| m_CurrentPlugin.Ports[n].Clamped=true; | |||
| } | |||
| } | |||
| return true; | |||
| @@ -19,12 +19,42 @@ | |||
| #include "../SpiralPlugin.h" | |||
| #include <FL/Fl_Pixmap.H> | |||
| #include "ladspa.h" | |||
| #include "utils.h" | |||
| #ifndef LADSPAPLUGIN | |||
| #define LADSPAPLUGIN | |||
| static const unsigned int NUM_PORTS = 8; | |||
| class LPluginInfo { | |||
| public: | |||
| string Filename; | |||
| string Label; | |||
| string Name; | |||
| string Maker; | |||
| struct LPortDetails | |||
| { | |||
| string Name; | |||
| float Min,Max; | |||
| bool Clamped; | |||
| }; | |||
| vector<LPortDetails> Ports; | |||
| bool operator<(const LPluginInfo & li) { return (Name < li.Name); } | |||
| bool operator==(const LPluginInfo& li) { return (Name == li.Name); } | |||
| }; | |||
| // For sorting vectors of LPluginInfo's | |||
| struct LPluginInfoSortAsc | |||
| { | |||
| bool operator()(const LPluginInfo & begin, const LPluginInfo & end) | |||
| { | |||
| return begin.Name < end.Name; | |||
| } | |||
| }; | |||
| class LADSPAPlugin : public SpiralPlugin | |||
| { | |||
| public: | |||
| @@ -34,24 +64,36 @@ public: | |||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType *CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetGain(float s) { m_Gain=s; } | |||
| float GetGain() { return m_Gain; } | |||
| void SetMin(int n,float min) { m_PortMin[n]=min; } | |||
| void SetMax(int n,float max) { m_PortMax[n]=max; } | |||
| void SetPortClamp(int n,bool i) { m_PortClamp[n]=i; } | |||
| void SetAmped(bool s) { m_Amped=s; } | |||
| bool GetAmped() { return m_Amped; } | |||
| bool UpdatePlugin(const char * filename, const char * label, bool PortClampReset=true); | |||
| const LADSPA_Descriptor * GetPlugDesc(void) { return PlugDesc; } | |||
| enum GUICommands{NONE,SETMIN,SETMAX,SETCLAMP,UPDATEPLUGIN}; | |||
| struct GUIArgs | |||
| { | |||
| int Num; | |||
| float Value; | |||
| bool Clamp; | |||
| char Filename[256]; | |||
| char Label[256]; | |||
| }; | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| void SetMin(int n,float min) { m_PortMin[n]=min; } | |||
| void SetMax(int n,float max) { m_PortMax[n]=max; } | |||
| void SetPortClamp(int n,bool i) { m_PortClamp[n]=i; } | |||
| bool UpdatePlugin(int n); | |||
| bool UpdatePlugin(const char * filename, const char * label, bool PortClampReset=true); | |||
| friend void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, LADSPA_Descriptor_Function pfDescriptorFunction); | |||
| void LoadPluginList(void); | |||
| void * PlugHandle; | |||
| const LADSPA_Descriptor * PlugDesc; | |||
| @@ -62,6 +104,10 @@ private: | |||
| vector<float> m_PortMax; | |||
| vector<bool> m_PortClamp; | |||
| // our database of ladspa plugins | |||
| vector<LPluginInfo> m_LADSPAList; | |||
| LPluginInfo m_CurrentPlugin; | |||
| float m_Gain; | |||
| bool m_Amped; | |||
| }; | |||
| @@ -25,97 +25,30 @@ | |||
| #include <math.h> | |||
| #include <dlfcn.h> | |||
| #include <vector> | |||
| #include <algorithm> | |||
| #include "utils.h" | |||
| static const int GUI_COLOUR = 179; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| /* FIXME: No matter what, I can't let this as it!! */ | |||
| static LADSPAPluginGUI * lg = NULL; | |||
| void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, | |||
| LADSPA_Descriptor_Function pfDescriptorFunction) { | |||
| const LADSPA_Descriptor * psDescriptor; | |||
| long lIndex; | |||
| unsigned long lPluginIndex; | |||
| unsigned long lPortIndex; | |||
| unsigned long lLength; | |||
| LADSPA_PortRangeHintDescriptor iHintDescriptor; | |||
| LADSPA_Data fBound; | |||
| #define testcond(c,s) { \ | |||
| if (!(c)) { \ | |||
| cerr << (s); \ | |||
| failure = 1; \ | |||
| } \ | |||
| } | |||
| for (lIndex = 0; (psDescriptor = pfDescriptorFunction(lIndex)) != NULL; lIndex++) { | |||
| int failure = 0; | |||
| testcond(!LADSPA_IS_REALTIME(psDescriptor->Properties), "ERROR: PLUGIN MUST RUN REAL TIME.\n"); | |||
| testcond(psDescriptor->instantiate, "ERROR: PLUGIN HAS NO INSTANTIATE FUNCTION.\n"); | |||
| testcond(psDescriptor->connect_port, "ERROR: PLUGIN HAS NO CONNECT_PORT FUNCTION.\n"); | |||
| testcond(psDescriptor->run, "ERROR: PLUGIN HAS NO RUN FUNCTION.\n"); | |||
| testcond(!(psDescriptor->run_adding != 0 && psDescriptor->set_run_adding_gain == 0), | |||
| "ERROR: PLUGIN HAS RUN_ADDING FUNCTION BUT NOT SET_RUN_ADDING_GAIN.\n"); | |||
| testcond(!(psDescriptor->run_adding == 0 && psDescriptor->set_run_adding_gain != 0), | |||
| "ERROR: PLUGIN HAS SET_RUN_ADDING_GAIN FUNCTION BUT NOT RUN_ADDING.\n"); | |||
| testcond(psDescriptor->cleanup, "ERROR: PLUGIN HAS NO CLEANUP FUNCTION.\n"); | |||
| testcond(!LADSPA_IS_INPLACE_BROKEN(psDescriptor->Properties), | |||
| "ERROR: THIS PLUGIN CANNOT USE IN-PLACE PROCESSING.\n"); | |||
| testcond(psDescriptor->PortCount, "ERROR: PLUGIN HAS NO PORTS.\n"); | |||
| if (!failure) { | |||
| LPluginInfo pi; | |||
| pi.Filename = pcFullFilename; | |||
| pi.Label = psDescriptor->Label; | |||
| pi.Name = psDescriptor->Name; | |||
| /* ARGH! I really can't stand this ugly hack */ | |||
| lg->PluginList.push_back(pi); | |||
| } else { | |||
| cerr << "Plugin ignored...\n\n"; | |||
| } | |||
| } | |||
| dlclose(pvPluginHandle); | |||
| } | |||
| void LADSPAPluginGUI::refreshPluginList(void) | |||
| { | |||
| PluginList.clear(); | |||
| CurrentPlugin.Name = ""; | |||
| CurrentPlugin.Filename = ""; | |||
| CurrentPlugin.Label = ""; | |||
| lg = this; | |||
| LADSPAPluginSearch(describePluginLibrary); | |||
| lg = NULL; | |||
| m_Browser->clear(); | |||
| sort(PluginList.begin(), PluginList.end(), LPluginInfoSortAsc()); | |||
| for (vector<LPluginInfo>::iterator i = PluginList.begin(); i != PluginList.end(); i++) | |||
| { | |||
| m_Browser->add((*i).Name.c_str()); | |||
| } | |||
| } | |||
| LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,LADSPAPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| LADSPAPluginGUI::LADSPAPluginGUI(int w, int h,LADSPAPlugin *o, ChannelHandler *ch,const HostInfo *Info, const vector<LPluginInfo> &PVec) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| PluginList=PVec; | |||
| m_Filename="None"; | |||
| m_Plugin=o; | |||
| int Width=20; | |||
| int Height=100; | |||
| m_Browser= new Fl_Hold_Browser(5,20,290,260,"LADSPA Plugins"); | |||
| m_Browser->callback((Fl_Callback*)cb_Select); | |||
| for (vector<LPluginInfo>::iterator i=PluginList.begin(); | |||
| i!=PluginList.end(); i++) | |||
| { | |||
| m_Browser->add((*i).Name.c_str()); | |||
| } | |||
| m_InputScroll = new Fl_Scroll(300,80,290,150," Value Min Max Clamp?"); | |||
| m_InputScroll->align(FL_ALIGN_TOP_LEFT); | |||
| @@ -165,10 +98,6 @@ SpiralPluginGUI(w,h,o) | |||
| m_PowerAmp->callback((Fl_Callback*)cb_PowerAmp); | |||
| add(m_PowerAmp); | |||
| inited = 0; | |||
| refreshPluginList(); | |||
| inited = 1; | |||
| end(); | |||
| } | |||
| @@ -280,21 +209,24 @@ void LADSPAPluginGUI::AddPortInfo(const char *Info) | |||
| } | |||
| void LADSPAPluginGUI::UpdateValues() | |||
| void LADSPAPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_OutputGain->value(m_Plugin->GetGain()); | |||
| LADSPAPlugin* Plugin = (LADSPAPlugin*)o; | |||
| m_OutputGain->value(Plugin->GetGain()); | |||
| } | |||
| inline void LADSPAPluginGUI::cb_Gain_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetGain(o->value()); } | |||
| { m_GUICH->Set("Gain",(float)(o->value())); } | |||
| void LADSPAPluginGUI::cb_Gain(Fl_Knob* o, void* v) | |||
| { ((LADSPAPluginGUI*)(o->parent()))->cb_Gain_i(o,v); } | |||
| inline void LADSPAPluginGUI::cb_Select_i(Fl_Hold_Browser* o) | |||
| { | |||
| m_Filename=PluginList[o->value()-1].Filename; | |||
| m_Label=PluginList[o->value()-1].Label; | |||
| m_Plugin->UpdatePlugin(m_Filename.c_str(), m_Label.c_str()); | |||
| m_Label=PluginList[o->value()-1].Label; | |||
| m_GUICH->Set("Num",o->value()-1); | |||
| m_GUICH->SetCommand(LADSPAPlugin::UPDATEPLUGIN); | |||
| } | |||
| void LADSPAPluginGUI::cb_Select(Fl_Hold_Browser* o) | |||
| { ((LADSPAPluginGUI*)(o->parent()))->cb_Select_i(o);} | |||
| @@ -305,21 +237,21 @@ inline void LADSPAPluginGUI::cb_MinMax_i(Fl_Button* o, void* v) | |||
| for (vector<Fl_Input*>::iterator i=m_PortMin.begin(); | |||
| i!=m_PortMin.end(); i++) | |||
| { | |||
| m_Plugin->SetMin(n,atof((*i)->value())); | |||
| m_GUICH->Set("Min",(float)(n,atof((*i)->value()))); | |||
| n++; | |||
| } | |||
| n=0; | |||
| for (vector<Fl_Input*>::iterator i=m_PortMax.begin(); | |||
| i!=m_PortMax.end(); i++) | |||
| { | |||
| m_Plugin->SetMax(n,atof((*i)->value())); | |||
| m_GUICH->Set("Max",(n,atof((*i)->value()))); | |||
| n++; | |||
| } | |||
| n=0; | |||
| for (vector<Fl_Check_Button*>::iterator i=m_PortClamp.begin(); | |||
| i!=m_PortClamp.end(); i++) | |||
| { | |||
| m_Plugin->SetPortClamp(n,(*i)->value()); | |||
| m_GUICH->Set("Clamp",(bool)(n,(*i)->value())); | |||
| n++; | |||
| } | |||
| } | |||
| @@ -328,7 +260,7 @@ void LADSPAPluginGUI::cb_MinMax(Fl_Button* o, void* v) | |||
| inline void LADSPAPluginGUI::cb_PowerAmp_i(Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->SetAmped(o->value()); | |||
| m_GUICH->Set("Amped",(bool)(o->value())); | |||
| } | |||
| void LADSPAPluginGUI::cb_PowerAmp(Fl_Button* o, void* v) | |||
| { ((LADSPAPluginGUI*)(o->parent()))->cb_PowerAmp_i(o,v);} | |||
| @@ -31,7 +31,6 @@ | |||
| #include "../Widgets/Fl_Knob.H" | |||
| #include <vector> | |||
| #include "ladspa.h" | |||
| #include <string> | |||
| #include "LADSPAPlugin.h" | |||
| @@ -40,39 +39,18 @@ | |||
| #ifndef LADSPAGUI | |||
| #define LADSPAGUI | |||
| #include "ladspa.h" | |||
| #include <stdio.h> | |||
| #include <math.h> | |||
| #include <dlfcn.h> | |||
| #include <vector> | |||
| #include "utils.h" | |||
| class LPluginInfo { | |||
| public: | |||
| string Filename; | |||
| string Label; | |||
| string Name; | |||
| bool operator<(const LPluginInfo & li) { return (Name < li.Name); } | |||
| bool operator==(const LPluginInfo& li) { return (Name == li.Name); } | |||
| }; | |||
| // For sorting vectors of LPluginInfo's | |||
| struct LPluginInfoSortAsc | |||
| { | |||
| bool operator()(const LPluginInfo & begin, const LPluginInfo & end) | |||
| { | |||
| return begin.Name < end.Name; | |||
| } | |||
| }; | |||
| class LADSPAPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| LADSPAPluginGUI(int w, int h, LADSPAPlugin *o,const HostInfo *Info); | |||
| LADSPAPluginGUI(int w, int h, LADSPAPlugin *o, ChannelHandler *ch, const HostInfo *Info, const vector<LPluginInfo> &PVec); | |||
| ~LADSPAPluginGUI(); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| void SetName(const char *s); | |||
| void SetMaker(const char *s); | |||
| @@ -87,14 +65,9 @@ public: | |||
| string GetLabel() { return m_Label; } | |||
| void SetFilename(string s) { m_Filename=s; } | |||
| void SetLabel(string s) { m_Label=s; } | |||
| LADSPAPlugin *m_Plugin; | |||
| private: | |||
| vector<LPluginInfo> PluginList; | |||
| LPluginInfo CurrentPlugin; | |||
| friend void describePluginLibrary(const char * pcFullFilename, void * pvPluginHandle, LADSPA_Descriptor_Function pfDescriptorFunction); | |||
| void refreshPluginList(void); | |||
| LPluginInfo m_CurrentPlugin; | |||
| Fl_Scroll *m_InputScroll; | |||
| Fl_Pack *m_InputPack; | |||
| @@ -110,6 +83,8 @@ private: | |||
| vector<Fl_Input*> m_PortMax; | |||
| vector<Fl_Check_Button*> m_PortClamp; | |||
| vector<LPluginInfo> PluginList; | |||
| // this is needed as fltk seems to crash if you delete | |||
| // the pack, is won't delete the children properly??? | |||
| vector<Fl_Group*> m_PackVec; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -52,6 +53,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| utils.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -63,6 +65,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| search.c | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -190,3 +193,5 @@ misc.o: misc.c \ | |||
| search.o: search.c \ | |||
| utils.h | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -45,6 +45,9 @@ m_TableLength (DEFAULT_TABLE_LEN) { | |||
| m_PluginInfo.PortTips.push_back ("Output"); | |||
| m_PluginInfo.PortTips.push_back ("'Cosine' Output"); | |||
| m_PluginInfo.PortTips.push_back ("Inverted Output"); | |||
| m_AudioCH->Register("Freq",&m_Freq); | |||
| m_AudioCH->Register("Type",(char*)&m_Type); | |||
| } | |||
| LFOPlugin::~LFOPlugin() { | |||
| @@ -59,9 +62,7 @@ PluginInfo &LFOPlugin::Initialise (const HostInfo *Host) { | |||
| } | |||
| SpiralGUIType *LFOPlugin::CreateGUI() { | |||
| m_GUI = new LFOPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, this, m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| return new LFOPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); | |||
| } | |||
| void LFOPlugin::WriteWaves() { | |||
| @@ -34,16 +34,16 @@ class LFOPlugin : public SpiralPlugin { | |||
| virtual void Execute(); | |||
| virtual void StreamOut (ostream &s); | |||
| virtual void StreamIn (istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| enum Type {SINE, TRIANGLE, SQUARE, SAW}; | |||
| void WriteWaves(); | |||
| void NoteTrigger (int V, int s, int v); | |||
| void SetFreq (float s) { m_Freq=s; } | |||
| float GetFreq() { return m_Freq; } | |||
| void SetType (Type t) { m_Type=t; } | |||
| Type GetType() { return m_Type; } | |||
| private: | |||
| float AdjustPos (float pos); | |||
| // Voice specific parameter | |||
| int m_Note; | |||
| @@ -124,15 +124,13 @@ static unsigned char *image_Saw[] = { | |||
| (unsigned char*)" ", | |||
| (unsigned char*)" "}; | |||
| LFOPluginGUI::LFOPluginGUI(int w, int h,LFOPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o), | |||
| LFOPluginGUI::LFOPluginGUI(int w, int h,LFOPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch), | |||
| pixmap_Sine(image_Sine), | |||
| pixmap_Tri(image_Tri), | |||
| pixmap_Square(image_Square), | |||
| pixmap_Saw(image_Saw) { | |||
| m_Plugin=o; | |||
| ShapeSine = new Fl_Check_Button (5, 15, 55, 30); | |||
| ShapeSine->type (FL_RADIO_BUTTON); | |||
| ShapeSine->down_box (FL_DIAMOND_DOWN_BOX); | |||
| @@ -196,18 +194,20 @@ pixmap_Saw(image_Saw) { | |||
| end(); | |||
| } | |||
| void LFOPluginGUI::UpdateValues() { | |||
| void LFOPluginGUI::UpdateValues(SpiralPlugin *o) { | |||
| LFOPlugin* Plugin = (LFOPlugin*)o; | |||
| ShapeSine->value (0); | |||
| ShapeTri->value (0); | |||
| ShapeSquare->value (0); | |||
| ShapeSaw->value (0); | |||
| switch (m_Plugin->GetType()) { | |||
| switch (Plugin->GetType()) { | |||
| case LFOPlugin::SINE : ShapeSine->value (1); break; | |||
| case LFOPlugin::TRIANGLE : ShapeTri->value (1); break; | |||
| case LFOPlugin::SQUARE : ShapeSquare->value (1); break; | |||
| case LFOPlugin::SAW : ShapeSaw->value (1); break; | |||
| } | |||
| float x = m_Plugin->GetFreq(); | |||
| float x = Plugin->GetFreq(); | |||
| NumFreq->value (x); | |||
| x = 1 / x; | |||
| Perd->value (x); | |||
| @@ -217,8 +217,7 @@ void LFOPluginGUI::UpdateValues() { | |||
| // Callbacks for knobs and counters | |||
| inline void LFOPluginGUI::cb_Perd_i (Fl_Knob* o, void* v) { | |||
| m_Plugin->SetFreq (1 / o->value()); | |||
| UpdateValues(); | |||
| m_GUICH->Set("Freq",(float)(1.0f / o->value())); | |||
| } | |||
| void LFOPluginGUI::cb_Perd (Fl_Knob* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_Perd_i (o, v); | |||
| @@ -226,8 +225,7 @@ void LFOPluginGUI::cb_Perd (Fl_Knob* o, void* v) { | |||
| inline void LFOPluginGUI::cb_NumPerd_i (Fl_Knob* o, void* v) { | |||
| m_Plugin->SetFreq (1 / o->value()); | |||
| UpdateValues(); | |||
| m_GUICH->Set("Freq",(float)(1.0f / o->value())); | |||
| } | |||
| void LFOPluginGUI::cb_NumPerd (Fl_Knob* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_NumPerd_i (o, v); | |||
| @@ -235,8 +233,7 @@ void LFOPluginGUI::cb_NumPerd (Fl_Knob* o, void* v) { | |||
| inline void LFOPluginGUI::cb_NumFreq_i (Fl_Knob* o, void* v) { | |||
| m_Plugin->SetFreq (o->value()); | |||
| UpdateValues(); | |||
| m_GUICH->Set("Freq",(float)(o->value())); | |||
| } | |||
| void LFOPluginGUI::cb_NumFreq (Fl_Knob* o, void* v) { | |||
| @@ -246,7 +243,7 @@ void LFOPluginGUI::cb_NumFreq (Fl_Knob* o, void* v) { | |||
| // Callbacks for waveform buttons | |||
| inline void LFOPluginGUI::cb_Sine_i (Fl_Check_Button* o, void* v) { | |||
| m_Plugin->SetType (LFOPlugin::SINE); | |||
| m_GUICH->Set("Type",(char)(LFOPlugin::SINE)); | |||
| } | |||
| void LFOPluginGUI::cb_Sine(Fl_Check_Button* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_Sine_i (o, v); | |||
| @@ -254,7 +251,7 @@ void LFOPluginGUI::cb_Sine(Fl_Check_Button* o, void* v) { | |||
| inline void LFOPluginGUI::cb_Tri_i (Fl_Check_Button* o, void* v) { | |||
| m_Plugin->SetType (LFOPlugin::TRIANGLE); | |||
| m_GUICH->Set("Type",(char)(LFOPlugin::TRIANGLE)); | |||
| } | |||
| void LFOPluginGUI::cb_Tri (Fl_Check_Button* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_Tri_i (o, v); | |||
| @@ -262,7 +259,7 @@ void LFOPluginGUI::cb_Tri (Fl_Check_Button* o, void* v) { | |||
| inline void LFOPluginGUI::cb_Square_i (Fl_Check_Button* o, void* v) { | |||
| m_Plugin->SetType (LFOPlugin::SQUARE); | |||
| m_GUICH->Set("Type",(char)(LFOPlugin::SQUARE)); | |||
| } | |||
| void LFOPluginGUI::cb_Square (Fl_Check_Button* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_Square_i (o, v); | |||
| @@ -270,7 +267,7 @@ void LFOPluginGUI::cb_Square (Fl_Check_Button* o, void* v) { | |||
| inline void LFOPluginGUI::cb_Saw_i (Fl_Check_Button* o, void* v) { | |||
| m_Plugin->SetType (LFOPlugin::SAW); | |||
| m_GUICH->Set("Type",(LFOPlugin::SAW)); | |||
| } | |||
| void LFOPluginGUI::cb_Saw (Fl_Check_Button* o, void* v) { | |||
| ((LFOPluginGUI*)(o->parent()))->cb_Saw_i (o, v); | |||
| @@ -28,11 +28,10 @@ | |||
| class LFOPluginGUI : public SpiralPluginGUI { | |||
| public: | |||
| LFOPluginGUI(int w, int h, LFOPlugin *o,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| LFOPlugin *m_Plugin; | |||
| private: | |||
| LFOPluginGUI(int w, int h, LFOPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| Fl_Check_Button* ShapeSine; | |||
| Fl_Pixmap pixmap_Sine; | |||
| Fl_Check_Button* ShapeTri; | |||
| @@ -10,8 +10,8 @@ | |||
| CC = gcc | |||
| CXX = g++ | |||
| CFLAGS = -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused | |||
| CXXFLAGS= -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused | |||
| CFLAGS = -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused -fPIC | |||
| CXXFLAGS= -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused -fPIC -fPIC | |||
| INCPATH = -I/usr/X11R6/include | |||
| LINK = g++ -shared | |||
| LFLAGS = | |||
| @@ -44,6 +44,7 @@ mandir = ${prefix}/man | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| LFOPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -58,6 +60,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| LFOPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -165,3 +168,5 @@ LFOPluginGUI.o: LFOPluginGUI.C \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| LFOPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| LFOPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -164,3 +167,5 @@ LFOPluginGUI.o: LFOPluginGUI.C \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_LED_Button.H \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| MatrixPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../Widgets/Fl_LED_Button.cxx \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| MatrixPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../Widgets/Fl_LED_Button.o \ | |||
| @@ -174,3 +177,5 @@ MatrixPluginGUI.o: MatrixPluginGUI.C \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_LED_Button.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -101,6 +101,18 @@ m_CopyPattern(0) | |||
| m_TriggerLevel[n]=0; | |||
| } | |||
| m_AudioCH->Register("NoteCut",&m_NoteCut,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Current",&m_Current,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Num",&m_GUIArgs.Num,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Length",&m_GUIArgs.Length,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Speed",&m_GUIArgs.Speed,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("X",&m_GUIArgs.X,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Y",&m_GUIArgs.Y,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Octave",&m_GUIArgs.Octave,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Step",&m_Step,ChannelHandler::OUTPUT); | |||
| m_AudioCH->RegisterData("Matrix",ChannelHandler::OUTPUT_REQUEST,&m_Matrix,sizeof(m_Matrix)); | |||
| } | |||
| MatrixPlugin::~MatrixPlugin() | |||
| @@ -116,11 +128,9 @@ PluginInfo &MatrixPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *MatrixPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new MatrixPluginGUI(m_PluginInfo.Width, | |||
| return new MatrixPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void MatrixPlugin::Execute() | |||
| @@ -157,7 +167,7 @@ void MatrixPlugin::Execute() | |||
| // make it so the next note to trigger | |||
| // will be the first one | |||
| if (m_GUI) ((MatrixPluginGUI*)m_GUI)->UpdateValues(); | |||
| //if (m_GUI) ((MatrixPluginGUI*)m_GUI)->UpdateValues(); | |||
| m_Time=m_StepTime*(1/m_Matrix[m_Current].Speed); | |||
| m_Step=-1; | |||
| @@ -206,7 +216,7 @@ void MatrixPlugin::Execute() | |||
| if (m_Step >= m_Matrix[m_Current].Length) m_Step=0; | |||
| if (m_GUI) ((MatrixPluginGUI*)m_GUI)->SetLED(m_Step); | |||
| //if (m_GUI) ((MatrixPluginGUI*)m_GUI)->SetLED(m_Step); | |||
| // Reset the values | |||
| m_CurrentTriggerCV=0; | |||
| @@ -236,10 +246,52 @@ void MatrixPlugin::Execute() | |||
| } | |||
| } | |||
| } | |||
| void MatrixPlugin::PastePattern() { | |||
| cerr<<hex<<this<<dec<<endl; | |||
| cerr<<m_CopyPattern<<endl; | |||
| void MatrixPlugin::ExecuteCommands() | |||
| { | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch (m_AudioCH->GetCommand()) | |||
| { | |||
| case MAT_LENGTH : | |||
| cerr<<m_GUIArgs.Length<<endl; | |||
| m_Matrix[m_Current].Length=m_GUIArgs.Length; | |||
| break; | |||
| case MAT_SPEED : | |||
| m_Matrix[m_Current].Speed=m_GUIArgs.Speed; | |||
| break; | |||
| case MAT_ACTIVATE : | |||
| m_Matrix[m_Current].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=true; | |||
| break; | |||
| case MAT_DEACTIVATE : | |||
| m_Matrix[m_Current].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=false; | |||
| break; | |||
| case MAT_OCTAVE : | |||
| m_Matrix[m_Current].Octave=m_GUIArgs.Octave; | |||
| break; | |||
| case COPY : | |||
| CopyPattern(); | |||
| break; | |||
| case PASTE : | |||
| PastePattern(); | |||
| break; | |||
| case CLEAR : | |||
| ClearPattern(); | |||
| break; | |||
| case TUP : | |||
| if (CanTransposeUp()) TransposeUp(); | |||
| break; | |||
| case TDOWN : | |||
| if (CanTransposeDown()) TransposeDown(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| void MatrixPlugin::PastePattern() { | |||
| m_Matrix[m_Current].Length = m_Matrix[m_CopyPattern].Length; | |||
| m_Matrix[m_Current].Speed = m_Matrix[m_CopyPattern].Speed; | |||
| m_Matrix[m_Current].Octave = m_Matrix[m_CopyPattern].Octave; | |||
| @@ -43,20 +43,31 @@ public: | |||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType *CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetNoteCut(bool s) { m_NoteCut=s; } | |||
| bool GetNoteCut() { return m_NoteCut; } | |||
| void SetCurrent(int s) { m_Current=s; } | |||
| int GetCurrent() { return m_Current; } | |||
| void SetStepTime(float s) { m_StepTime=s; } | |||
| float GetStepTime() { return m_StepTime; } | |||
| Pattern* GetPattern() { return &m_Matrix[m_Current]; } | |||
| enum GUICommands{NONE,MAT_LENGTH,MAT_SPEED,MAT_ACTIVATE,MAT_DEACTIVATE, | |||
| MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN}; | |||
| struct GUIArgs | |||
| { | |||
| int Num; | |||
| int Length; | |||
| float Speed; | |||
| int X,Y; | |||
| int Octave; | |||
| }; | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| void CopyPattern() { m_CopyPattern = m_Current; } | |||
| void PastePattern(); | |||
| void ClearPattern(); | |||
| @@ -65,7 +76,6 @@ public: | |||
| void TransposeDown(); | |||
| bool CanTransposeDown(); | |||
| private: | |||
| float m_TickTime; | |||
| float m_StepTime; | |||
| float m_Time; | |||
| @@ -27,10 +27,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| //size_range(10,10); | |||
| m_NoteCut = new Fl_Button (5, h-30, 85, 20,"NoteCut"); | |||
| m_NoteCut->type(1); | |||
| @@ -142,25 +141,39 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void MatrixPluginGUI::UpdateValues() | |||
| void MatrixPluginGUI::draw() | |||
| { | |||
| SpiralPluginGUI::draw(); | |||
| for(int x=0; x<MATX; x++) | |||
| { | |||
| m_Flash[x]->value(0); | |||
| } | |||
| m_Flash[m_GUICH->GetInt("Step")]->value(1); | |||
| } | |||
| void MatrixPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_Pattern->value(m_Plugin->GetCurrent()); | |||
| m_Length->value(m_Plugin->GetPattern()->Length); | |||
| m_Speed->value(m_Plugin->GetPattern()->Speed); | |||
| MatrixPlugin *Plugin = (MatrixPlugin*)o; | |||
| m_Pattern->value(Plugin->GetCurrent()); | |||
| m_Length->value(Plugin->GetPattern()->Length); | |||
| m_Speed->value(Plugin->GetPattern()->Speed); | |||
| m_SpeedVal->value((int)m_Speed->value()); | |||
| m_Octave->value(m_Plugin->GetPattern()->Octave); | |||
| m_Octave->value(Plugin->GetPattern()->Octave); | |||
| for(int x=0; x<MATX; x++) | |||
| for(int y=0; y<MATY; y++) | |||
| { | |||
| m_Matrix[x][y]->value(m_Plugin->GetPattern()->Matrix[x][y]); | |||
| m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]); | |||
| } | |||
| if (m_Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate(); | |||
| if (m_Plugin->CanTransposeDown()) m_TransDnBtn->activate(); else m_TransDnBtn->deactivate(); | |||
| //if (Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate(); | |||
| //if (Plugin->CanTransposeDown()) m_TransDnBtn->activate(); else m_TransDnBtn->deactivate(); | |||
| } | |||
| void MatrixPluginGUI::SetLED(int n) | |||
| /*void MatrixPluginGUI::SetLED(int n) | |||
| { | |||
| for (int i=0; i<MATX; i++) | |||
| { | |||
| @@ -168,20 +181,35 @@ void MatrixPluginGUI::SetLED(int n) | |||
| } | |||
| m_Flash[n]->value(true); | |||
| } | |||
| }*/ | |||
| void MatrixPluginGUI::UpdateMatrix() | |||
| { | |||
| m_GUICH->RequestChannelAndWait("Matrix"); | |||
| m_GUICH->GetData("Matrix",(void*)m_GUIMatrix); | |||
| for(int x=0; x<MATX; x++) | |||
| for(int y=0; y<MATY; y++) | |||
| { | |||
| m_Matrix[x][y]->value(m_GUIMatrix[(int)m_Pattern->value()].Matrix[x][y]); | |||
| } | |||
| } | |||
| inline void MatrixPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->SetNoteCut(o->value()); | |||
| m_GUICH->Set("NoteCut",o->value()); | |||
| } | |||
| void MatrixPluginGUI::cb_NoteCut(Fl_Button* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);} | |||
| inline void MatrixPluginGUI::cb_Matrix_i(Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->GetPattern()->Matrix[*(int*)v/MATY][*(int*)v%MATY]=o->value(); | |||
| UpdateValues(); | |||
| m_GUICH->Set("X",*(int*)v/MATY); | |||
| m_GUICH->Set("Y",*(int*)v%MATY); | |||
| if (o->value()) m_GUICH->SetCommand(MatrixPlugin::MAT_ACTIVATE); | |||
| else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE); | |||
| } | |||
| void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Matrix_i(o,v);} | |||
| @@ -190,8 +218,8 @@ inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v) | |||
| { | |||
| if (o->value()<0) o->value(0); | |||
| if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1); | |||
| m_Plugin->SetCurrent((int)o->value()); | |||
| UpdateValues(); | |||
| m_GUICH->Set("Current",(int)o->value()); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_Pattern(Fl_Counter* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);} | |||
| @@ -200,7 +228,13 @@ inline void MatrixPluginGUI::cb_Length_i(Fl_Counter* o, void* v) | |||
| { | |||
| if (o->value()<1) o->value(1); | |||
| if (o->value()>64) o->value(64); | |||
| m_Plugin->GetPattern()->Length=(int)o->value(); | |||
| //m_GUICH->GetPattern()->Length=(int)o->value(); | |||
| cerr<<(int)o->value()<<endl; | |||
| m_GUICH->Set("Length",(int)o->value()); | |||
| m_GUICH->SetCommand(MatrixPlugin::MAT_LENGTH); | |||
| } | |||
| void MatrixPluginGUI::cb_Length(Fl_Counter* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Length_i(o,v);} | |||
| @@ -209,8 +243,10 @@ inline void MatrixPluginGUI::cb_Speed_i(Fl_Knob* o, void* v) | |||
| { | |||
| // Round off value, but it should be a float for tweaking | |||
| float value=o->value()+((int)o->value()-o->value()); | |||
| m_Plugin->GetPattern()->Speed=o->value(); | |||
| m_SpeedVal->value(value); | |||
| m_GUICH->Set("Speed",(float)value); | |||
| m_GUICH->SetCommand(MatrixPlugin::MAT_SPEED); | |||
| } | |||
| void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Speed_i(o,v);} | |||
| @@ -218,16 +254,17 @@ void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v) | |||
| inline void MatrixPluginGUI::cb_Octave_i(Fl_Counter* o, void* v) | |||
| { | |||
| if (o->value()<0) o->value(0); | |||
| if (o->value()>6) o->value(6); | |||
| m_Plugin->GetPattern()->Octave=(int)o->value(); | |||
| if (o->value()>6) o->value(6); | |||
| m_GUICH->Set("Octave",(int)o->value()); | |||
| m_GUICH->SetCommand(MatrixPlugin::MAT_OCTAVE); | |||
| } | |||
| void MatrixPluginGUI::cb_Octave(Fl_Counter* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Octave_i(o,v);} | |||
| inline void MatrixPluginGUI::cb_SpeedVal_i (Fl_Counter* o, void* v) | |||
| { | |||
| m_Speed->value (o->value()); | |||
| m_Plugin->GetPattern()->Speed = (float)o->value() * 0.1; | |||
| m_Speed->value(o->value()); | |||
| } | |||
| void MatrixPluginGUI::cb_SpeedVal (Fl_Counter* o, void* v) | |||
| @@ -238,7 +275,7 @@ void MatrixPluginGUI::cb_SpeedVal (Fl_Counter* o, void* v) | |||
| inline void MatrixPluginGUI::cb_CopyBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_PasteBtn->activate(); | |||
| m_Plugin->CopyPattern(); | |||
| m_GUICH->SetCommand(MatrixPlugin::COPY); | |||
| } | |||
| void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v) | |||
| @@ -248,8 +285,8 @@ void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v) | |||
| inline void MatrixPluginGUI::cb_PasteBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->PastePattern(); | |||
| UpdateValues(); | |||
| m_GUICH->SetCommand(MatrixPlugin::PASTE); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_PasteBtn (Fl_Button* o, void* v) | |||
| @@ -259,8 +296,8 @@ void MatrixPluginGUI::cb_PasteBtn (Fl_Button* o, void* v) | |||
| inline void MatrixPluginGUI::cb_ClearBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->ClearPattern(); | |||
| UpdateValues(); | |||
| m_GUICH->SetCommand(MatrixPlugin::CLEAR); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_ClearBtn (Fl_Button* o, void* v) | |||
| @@ -270,8 +307,8 @@ void MatrixPluginGUI::cb_ClearBtn (Fl_Button* o, void* v) | |||
| inline void MatrixPluginGUI::cb_TransUpBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->TransposeUp(); | |||
| UpdateValues(); | |||
| m_GUICH->SetCommand(MatrixPlugin::TUP); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_TransUpBtn (Fl_Button* o, void* v) | |||
| @@ -281,8 +318,8 @@ void MatrixPluginGUI::cb_TransUpBtn (Fl_Button* o, void* v) | |||
| inline void MatrixPluginGUI::cb_TransDnBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_Plugin->TransposeDown(); | |||
| UpdateValues(); | |||
| m_GUICH->SetCommand(MatrixPlugin::TDOWN); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_TransDnBtn (Fl_Button* o, void* v) | |||
| @@ -33,21 +33,19 @@ | |||
| #ifndef MatrixGUI | |||
| #define MatrixGUI | |||
| class MatrixPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| MatrixPluginGUI(int w, int h, MatrixPlugin *o,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| MatrixPluginGUI(int w, int h, MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void draw(); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| void SetLED(int n); | |||
| MatrixPlugin *m_Plugin; | |||
| private: | |||
| void UpdateMatrix(); | |||
| int Numbers[MATX*MATY]; | |||
| Pattern m_GUIMatrix[NUM_PATTERNS]; | |||
| Fl_Button* m_NoteCut; | |||
| Fl_Counter* m_Pattern; | |||
| @@ -7,8 +7,8 @@ | |||
| CC = gcc | |||
| CXX = g++ | |||
| CFLAGS = -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused | |||
| CXXFLAGS= -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused | |||
| CFLAGS = -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused -fPIC | |||
| CXXFLAGS= -pipe -Wall -O3 -ffast-math -DNO_DEBUG -Wno-unused -fPIC -fPIC | |||
| INCPATH = -I/usr/X11R6/include | |||
| LINK = g++ -shared | |||
| LFLAGS = | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| MidiPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| MidiPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -175,3 +178,5 @@ MidiPluginGUI.o: MidiPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -73,6 +73,12 @@ m_CurrentNote(0) | |||
| m_PluginInfo.PortTips.push_back("Aftertouch CV"); | |||
| for (int n=0; n<128; n++) m_ControlLevel[n]=0; | |||
| m_AudioCH->Register("DeviceNum",&m_DeviceNum); | |||
| m_AudioCH->Register("NoteCut",&m_NoteCut); | |||
| m_AudioCH->Register("CC",&m_GUIArgs.s); | |||
| m_AudioCH->RegisterData("Name",ChannelHandler::INPUT, | |||
| &m_GUIArgs.Name,sizeof(m_GUIArgs.Name)); | |||
| } | |||
| MidiPlugin::~MidiPlugin() | |||
| @@ -91,16 +97,14 @@ PluginInfo &MidiPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *MidiPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new MidiPluginGUI(m_PluginInfo.Width, | |||
| return new MidiPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| // m_GUI->show(); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void MidiPlugin::Execute() | |||
| { | |||
| // Done to clear IsEmpty field... | |||
| GetOutputBuf(0)->Zero(); | |||
| GetOutputBuf(1)->Zero(); | |||
| @@ -229,6 +233,19 @@ void MidiPlugin::Execute() | |||
| if (Triggered && !m_ContinuousNotes) SetOutput(1,0,0); | |||
| } | |||
| void MidiPlugin::ExecuteCommands() | |||
| { | |||
| // Process any commands from the GUI | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch (m_AudioCH->GetCommand()) | |||
| { | |||
| case (ADDCONTROL) : AddControl(m_GUIArgs.s,m_GUIArgs.Name); break; | |||
| case (DELCONTROL) : DeleteControl(); | |||
| }; | |||
| } | |||
| } | |||
| void MidiPlugin::AddControl(int s, const string &Name) | |||
| { | |||
| m_ControlList.push_back(s); | |||
| @@ -31,22 +31,29 @@ public: | |||
| virtual PluginInfo& Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType* CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetDeviceNum(int s) { m_DeviceNum=s; } | |||
| int GetDeviceNum() { return m_DeviceNum; } | |||
| void SetNoteCut(bool s) { m_NoteCut=s; } | |||
| bool GetNoteCut() { return m_NoteCut; } | |||
| void SetContinuousNotes(bool s) { m_ContinuousNotes=s; } | |||
| bool GetContinuousNotes() { return m_ContinuousNotes; } | |||
| void AddControl(int s,const string &Name); | |||
| void DeleteControl(); | |||
| enum GUICommands{NONE,ADDCONTROL,DELCONTROL}; | |||
| struct GUIArgs | |||
| { | |||
| int s; | |||
| char Name[256]; | |||
| }; | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| void AddControl(int s,const string &Name); | |||
| void DeleteControl(); | |||
| int m_DeviceNum; | |||
| @@ -74,11 +74,9 @@ int OptionsList(const vector<string> &List) | |||
| //////////////////////////////////////////////////////////////////////// | |||
| MidiPluginGUI::MidiPluginGUI(int w, int h,MidiPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| MidiPluginGUI::MidiPluginGUI(int w, int h,MidiPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| m_DeviceNum = new Fl_Counter(20,30,40,20,"Channel"); | |||
| m_DeviceNum->type(FL_SIMPLE_COUNTER); | |||
| m_DeviceNum->step(1); | |||
| @@ -103,24 +101,25 @@ SpiralPluginGUI(w,h,o) | |||
| m_RemoveControl->callback((Fl_Callback*)cb_RemoveControl, NULL); | |||
| } | |||
| void MidiPluginGUI::UpdateValues() | |||
| void MidiPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| m_DeviceNum->value(m_Plugin->GetDeviceNum()); | |||
| MidiPlugin *Plugin = (MidiPlugin*)o; | |||
| m_DeviceNum->value(Plugin->GetDeviceNum()); | |||
| } | |||
| //// Callbacks //// | |||
| inline void MidiPluginGUI::cb_DeviceNum_i(Fl_Counter* o, void* v) | |||
| { m_Plugin->SetDeviceNum((int)o->value()); } | |||
| { m_GUICH->Set("DeviceNum",(int)o->value()); } | |||
| void MidiPluginGUI::cb_DeviceNum(Fl_Counter* o, void* v) | |||
| { ((MidiPluginGUI*)(o->parent()))->cb_DeviceNum_i(o,v);} | |||
| inline void MidiPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v) | |||
| { m_Plugin->SetNoteCut(o->value()); } | |||
| { m_GUICH->Set("NoteCut",o->value()); } | |||
| void MidiPluginGUI::cb_NoteCut(Fl_Button* o, void* v) | |||
| { ((MidiPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);} | |||
| inline void MidiPluginGUI::cb_ContinuousNotes_i(Fl_Button* o, void* v) | |||
| { m_Plugin->SetContinuousNotes(o->value()); } | |||
| { m_GUICH->Set("ContinuousNotes",o->value()); } | |||
| void MidiPluginGUI::cb_ContinuousNotes(Fl_Button* o, void* v) | |||
| { ((MidiPluginGUI*)(o->parent()))->cb_ContinuousNotes_i(o,v);} | |||
| @@ -258,12 +257,23 @@ inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | |||
| List.push_back("127 Poly Operation"); | |||
| int c=OptionsList(List)-1; | |||
| if (c>-1) m_Plugin->AddControl(c,List[c]); | |||
| if (c>-1) | |||
| { | |||
| m_GUICH->Set("CC",c); | |||
| char Temp[256]; | |||
| sprintf(Temp,"%s",List[c].c_str()); | |||
| m_GUICH->SetData("Name",Temp); | |||
| m_GUICH->SetCommand(MidiPlugin::ADDCONTROL); | |||
| //m_Plugin->AddControl(c,List[c]); | |||
| } | |||
| } | |||
| void MidiPluginGUI::cb_AddControl(Fl_Button* o, void* v) | |||
| { ((MidiPluginGUI*)(o->parent()))->cb_AddControl_i(o,v);} | |||
| inline void MidiPluginGUI::cb_RemoveControl_i(Fl_Button* o, void* v) | |||
| { m_Plugin->DeleteControl(); } | |||
| { | |||
| m_GUICH->SetCommand(MidiPlugin::DELCONTROL); | |||
| } | |||
| void MidiPluginGUI::cb_RemoveControl(Fl_Button* o, void* v) | |||
| { ((MidiPluginGUI*)(o->parent()))->cb_RemoveControl_i(o,v);} | |||
| @@ -36,12 +36,9 @@ int OptionsList(const vector<string> &List); | |||
| class MidiPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| MidiPluginGUI(int w, int h, MidiPlugin *o,const HostInfo *Info); | |||
| MidiPluginGUI(int w, int h, MidiPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| MidiPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| MixerPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| MixerPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -162,3 +165,5 @@ MixerPluginGUI.o: MixerPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -56,6 +56,9 @@ MixerPlugin::MixerPlugin() | |||
| { | |||
| m_ChannelVal[n]=1.0f; | |||
| } | |||
| m_AudioCH->Register("Value",&m_GUIArgs.Value); | |||
| m_AudioCH->Register("Num",&m_GUIArgs.Num); | |||
| } | |||
| MixerPlugin::~MixerPlugin() | |||
| @@ -69,11 +72,9 @@ PluginInfo &MixerPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *MixerPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new MixerPluginGUI(m_PluginInfo.Width, | |||
| return new MixerPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void MixerPlugin::Execute() | |||
| @@ -88,6 +89,17 @@ void MixerPlugin::Execute() | |||
| } | |||
| } | |||
| void MixerPlugin::ExecuteCommands() | |||
| { | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch (m_AudioCH->GetCommand()) | |||
| { | |||
| case (SETCH) : SetChannel(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
| } | |||
| } | |||
| } | |||
| void MixerPlugin::StreamOut(ostream &s) | |||
| { | |||
| s<<m_Version<<" "; | |||
| @@ -33,16 +33,27 @@ public: | |||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType *CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetChannel(int n, float s) { m_ChannelVal[n]=s; } | |||
| enum GUICommands{NONE,SETCH}; | |||
| struct GUIArgs | |||
| { | |||
| int Num; | |||
| float Value; | |||
| }; | |||
| float GetChannel(int n) { return m_ChannelVal[n]; } | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| void SetChannel(int n, float s) { m_ChannelVal[n]=s; } | |||
| float m_ChannelVal[NUM_CHANNELS]; | |||
| }; | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| MixerPluginGUI::MixerPluginGUI(int w, int h,MixerPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| MixerPluginGUI::MixerPluginGUI(int w, int h,MixerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| int Width=20; | |||
| int Height=100; | |||
| @@ -52,15 +50,22 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void MixerPluginGUI::UpdateValues() | |||
| void MixerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| MixerPlugin *Plugin = (MixerPlugin *)o; | |||
| for (int n=0; n<NUM_CHANNELS; n++) | |||
| { | |||
| m_Chan[n]->value(2.0f-m_Plugin->GetChannel(n)); | |||
| m_Chan[n]->value(2.0f-Plugin->GetChannel(n)); | |||
| } | |||
| } | |||
| inline void MixerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v) | |||
| { m_Plugin->SetChannel(*(int*)(v),2.0f-o->value()); } | |||
| { | |||
| m_GUICH->Set("Num",(*(int*)(v))); | |||
| m_GUICH->Set("Value",(float)(2.0f-o->value())); | |||
| m_GUICH->SetCommand(MixerPlugin::SETCH); | |||
| } | |||
| void MixerPluginGUI::cb_Chan(Fl_Slider* o, void* v) | |||
| { ((MixerPluginGUI*)(o->parent()))->cb_Chan_i(o,v);} | |||
| @@ -31,12 +31,10 @@ | |||
| class MixerPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| MixerPluginGUI(int w, int h, MixerPlugin *o,const HostInfo *Info); | |||
| MixerPluginGUI(int w, int h, MixerPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| MixerPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| int Numbers[NUM_CHANNELS]; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| MoogFilterPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| MoogFilterPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -164,3 +167,6 @@ MoogFilterPluginGUI.o: MoogFilterPluginGUI.C \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -71,6 +71,9 @@ t2(0.0f) | |||
| m_PluginInfo.PortTips.push_back("LowPass output"); | |||
| m_PluginInfo.PortTips.push_back("BandPass output"); | |||
| m_PluginInfo.PortTips.push_back("HighPass output"); | |||
| m_AudioCH->Register("Cutoff",&Cutoff); | |||
| m_AudioCH->Register("Resonance",&Resonance); | |||
| } | |||
| MoogFilterPlugin::~MoogFilterPlugin() | |||
| @@ -86,11 +89,9 @@ PluginInfo &MoogFilterPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *MoogFilterPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new MoogFilterPluginGUI(m_PluginInfo.Width, | |||
| return new MoogFilterPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void MoogFilterPlugin::Execute() | |||
| @@ -34,11 +34,6 @@ public: | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetCutoff(float s) { Cutoff=s; } | |||
| void SetResonance(float s) { Resonance=s; } | |||
| float GetCutoff() { return Cutoff; } | |||
| float GetResonance() { return Resonance; } | |||
| @@ -26,11 +26,9 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| MoogFilterPluginGUI::MoogFilterPluginGUI(int w, int h,MoogFilterPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| MoogFilterPluginGUI::MoogFilterPluginGUI(int w, int h,MoogFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| Cutoff = new Fl_Slider(15, 20, 20, 70, "Cutoff"); | |||
| Cutoff->type(4); | |||
| Cutoff->selection_color(GUI_COLOUR); | |||
| @@ -52,22 +50,24 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void MoogFilterPluginGUI::UpdateValues() | |||
| void MoogFilterPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| Cutoff->value(1.0f-m_Plugin->GetCutoff()); | |||
| Resonance->value(m_Plugin->GetResonance()); | |||
| MoogFilterPlugin *Plugin = (MoogFilterPlugin*)o; | |||
| Cutoff->value(1.0f-Plugin->GetCutoff()); | |||
| Resonance->value(Plugin->GetResonance()); | |||
| } | |||
| inline void MoogFilterPluginGUI::cb_Cutoff_i(Fl_Slider* o, void* v) | |||
| { | |||
| float value=1.0f-o->value(); | |||
| // m_Plugin->SetCutoff((value*value)+10.0f); | |||
| m_Plugin->SetCutoff(value); | |||
| m_GUICH->Set("Cutoff",value); | |||
| } | |||
| void MoogFilterPluginGUI::cb_Cutoff(Fl_Slider* o, void* v) | |||
| { ((MoogFilterPluginGUI*)(o->parent()))->cb_Cutoff_i(o,v); } | |||
| inline void MoogFilterPluginGUI::cb_Resonance_i(Fl_Knob* o, void* v) | |||
| { m_Plugin->SetResonance(o->value()); } | |||
| { m_GUICH->Set("Resonance",o->value()); } | |||
| void MoogFilterPluginGUI::cb_Resonance(Fl_Knob* o, void* v) | |||
| { ((MoogFilterPluginGUI*)(o->parent()))->cb_Resonance_i(o,v); } | |||
| @@ -32,12 +32,9 @@ | |||
| class MoogFilterPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| MoogFilterPluginGUI(int w, int h, MoogFilterPlugin *o,const HostInfo *Info); | |||
| MoogFilterPluginGUI(int w, int h, MoogFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| MoogFilterPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| NoteSnapPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| NoteSnapPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -148,3 +151,5 @@ NoteSnapPlugin.o: NoteSnapPlugin.C \ | |||
| NoteSnapPluginGUI.o: NoteSnapPluginGUI.C | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -62,8 +62,7 @@ PluginInfo &NoteSnapPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *NoteSnapPlugin::CreateGUI() | |||
| { | |||
| m_GUI=NULL; | |||
| return m_GUI; | |||
| return NULL; | |||
| } | |||
| void NoteSnapPlugin::Execute() | |||
| @@ -33,9 +33,6 @@ public: | |||
| virtual void Execute(); | |||
| virtual void StreamOut(ostream &s) {} | |||
| virtual void StreamIn(istream &s) {} | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| private: | |||
| }; | |||
| @@ -26,16 +26,15 @@ static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| NoteSnapPluginGUI::NoteSnapPluginGUI(int w, int h,NoteSnapPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| NoteSnapPluginGUI::NoteSnapPluginGUI(int w, int h,NoteSnapPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| end(); | |||
| } | |||
| void NoteSnapPluginGUI::UpdateValues() | |||
| void NoteSnapPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| } | |||
| @@ -33,12 +33,10 @@ | |||
| class NoteSnapPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| NoteSnapPluginGUI(int w, int h, NoteSnapPlugin *o,const HostInfo *Info); | |||
| NoteSnapPluginGUI(int w, int h, NoteSnapPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| NoteSnapPlugin *m_Plugin; | |||
| private: | |||
| //// Callbacks //// | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -50,6 +51,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| OscillatorPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -57,6 +59,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| OscillatorPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -164,3 +167,5 @@ OscillatorPluginGUI.o: OscillatorPluginGUI.C \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -71,6 +71,13 @@ m_SHModBuf(NULL) | |||
| m_PluginInfo.PortTips.push_back("PulseWidth CV"); | |||
| m_PluginInfo.PortTips.push_back("Sample & Hold length CV"); | |||
| m_PluginInfo.PortTips.push_back("Output"); | |||
| m_AudioCH->Register("Octave",&m_Octave); | |||
| m_AudioCH->Register("FineFreq",&m_FineFreq); | |||
| m_AudioCH->Register("PulseWidth",&m_PulseWidth); | |||
| m_AudioCH->Register("Type",(char*)&m_Type); | |||
| m_AudioCH->Register("SHLen",&m_SHLen); | |||
| m_AudioCH->Register("ModAmount",&m_ModAmount); | |||
| } | |||
| OscillatorPlugin::~OscillatorPlugin() | |||
| @@ -84,11 +91,9 @@ PluginInfo &OscillatorPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *OscillatorPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new OscillatorPluginGUI(m_PluginInfo.Width, | |||
| return new OscillatorPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void OscillatorPlugin::Execute() | |||
| @@ -34,9 +34,6 @@ public: | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| enum Type{NONE,SQUARE,SAW,NOISE}; | |||
| void ModulateFreq(Sample *data) {m_FreqModBuf=data;} | |||
| @@ -44,12 +41,6 @@ public: | |||
| void ModulateSHLen(Sample *data) {m_SHModBuf=data;} | |||
| void NoteTrigger(int V,int s,int v); | |||
| void SetOctave(int o) {m_Octave=o;} | |||
| void SetFineFreq(float s) {m_FineFreq=s;} | |||
| void SetPulseWidth(float p) {m_PulseWidth=p;} | |||
| void SetType(Type t) {m_Type=t;} | |||
| void SetSHLen(float s) {m_SHLen=s;} | |||
| void SetModAmount(float s) {m_ModAmount=s;} | |||
| int GetOctave() {return m_Octave;} | |||
| float GetFineFreq() {return m_FineFreq;} | |||
| float GetPulseWidth() {return m_PulseWidth;} | |||
| @@ -100,14 +100,12 @@ static unsigned char *image_Saw[] = { | |||
| (unsigned char*)" "}; | |||
| OscillatorPluginGUI::OscillatorPluginGUI(int w, int h,OscillatorPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o), | |||
| OscillatorPluginGUI::OscillatorPluginGUI(int w, int h,OscillatorPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch), | |||
| pixmap_Square(image_Square), | |||
| pixmap_Noise(image_Noise), | |||
| pixmap_Saw(image_Saw) | |||
| { | |||
| m_Plugin=o; | |||
| ShapeSquare = new Fl_Check_Button(5, 15, 55, 30); | |||
| ShapeSquare->type(102); | |||
| ShapeSquare->down_box(FL_DIAMOND_DOWN_BOX); | |||
| @@ -224,13 +222,15 @@ pixmap_Saw(image_Saw) | |||
| extern "C" int sprintf(char *,const char *,...); | |||
| void OscillatorPluginGUI::UpdateValues() | |||
| void OscillatorPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| OscillatorPlugin *Plugin = (OscillatorPlugin*)o; | |||
| ShapeSquare->value(0); | |||
| ShapeNoise->value(0); | |||
| ShapeSaw->value(0); | |||
| switch (m_Plugin->GetType()) | |||
| switch (Plugin->GetType()) | |||
| { | |||
| case OscillatorPlugin::SQUARE : ShapeSquare->value(1); break; | |||
| case OscillatorPlugin::NOISE : ShapeNoise->value(1); break; | |||
| @@ -238,25 +238,25 @@ void OscillatorPluginGUI::UpdateValues() | |||
| case OscillatorPlugin::NONE : break; | |||
| } | |||
| Freq->value(m_Plugin->GetOctave()+3); | |||
| ModAmount->value(m_Plugin->GetModAmount()); | |||
| FineTune->value(sqrt(m_Plugin->GetFineFreq())); | |||
| PulseWidth->value(m_Plugin->GetPulseWidth()); | |||
| Freq->value(Plugin->GetOctave()+3); | |||
| ModAmount->value(Plugin->GetModAmount()); | |||
| FineTune->value(sqrt(Plugin->GetFineFreq())); | |||
| PulseWidth->value(Plugin->GetPulseWidth()); | |||
| SHLen->value(0.2f-m_Plugin->GetSHLen()); | |||
| SHLen->value(0.2f-Plugin->GetSHLen()); | |||
| char str[10]; | |||
| float fr = 110.0f * m_Plugin->GetFineFreq(); | |||
| int oc = m_Plugin->GetOctave(); | |||
| float fr = 110.0f * Plugin->GetFineFreq(); | |||
| int oc = Plugin->GetOctave(); | |||
| if (oc > 0) fr *= 1 << oc; | |||
| if (oc < 0) fr /= 1 << (-oc); | |||
| sprintf(str,"%4.1f Hz", fr); | |||
| m_out_freq->value(str); | |||
| sprintf(str,"%4.0f %%", 100*m_Plugin->GetPulseWidth()); | |||
| sprintf(str,"%4.0f %%", 100*Plugin->GetPulseWidth()); | |||
| m_out_pulseW->value(str); | |||
| sprintf(str,"%4.0f %%", 100*m_Plugin->GetModAmount()); | |||
| sprintf(str,"%4.0f %%", 100*Plugin->GetModAmount()); | |||
| m_out_mod->value(str); | |||
| sprintf(str,"%4.3f s", m_Plugin->GetSHLen()); | |||
| sprintf(str,"%4.3f s", Plugin->GetSHLen()); | |||
| m_out_SHlen->value(str); | |||
| } | |||
| @@ -266,13 +266,13 @@ void OscillatorPluginGUI::UpdateValues() | |||
| inline void OscillatorPluginGUI::cb_Freq_i(Fl_Knob* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetOctave((int)o->value()-3); | |||
| float fr = 110.0f * m_Plugin->GetFineFreq(); | |||
| int oc = m_Plugin->GetOctave(); | |||
| if (oc > 0) fr *= 1 << oc; | |||
| if (oc < 0) fr /= 1 << (-oc); | |||
| sprintf(str,"%4.1f Hz", fr); | |||
| m_out_freq->value(str); | |||
| m_GUICH->Set("Octave",(int)o->value()-3); | |||
| //float fr = 110.0f * m_Plugin->GetFineFreq(); | |||
| //int oc = m_Plugin->GetOctave(); | |||
| //if (oc > 0) fr *= 1 << oc; | |||
| //if (oc < 0) fr /= 1 << (-oc); | |||
| //sprintf(str,"%4.1f Hz", fr); | |||
| //m_out_freq->value(str); | |||
| } | |||
| void OscillatorPluginGUI::cb_Freq(Fl_Knob* o, void* v) | |||
| @@ -281,13 +281,13 @@ void OscillatorPluginGUI::cb_Freq(Fl_Knob* o, void* v) | |||
| inline void OscillatorPluginGUI::cb_FineTune_i(Fl_Knob* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetFineFreq(o->value()*o->value()); | |||
| float fr = 110.0f * m_Plugin->GetFineFreq(); | |||
| int oc = m_Plugin->GetOctave(); | |||
| if (oc > 0) fr *= 1 << oc; | |||
| if (oc < 0) fr /= 1 << (-oc); | |||
| sprintf(str,"%4.1f Hz", fr); | |||
| m_out_freq->value(str); | |||
| m_GUICH->Set("FineFreq",o->value()*o->value()); | |||
| //float fr = 110.0f * m_Plugin->GetFineFreq(); | |||
| //int oc = m_Plugin->GetOctave(); | |||
| //if (oc > 0) fr *= 1 << oc; | |||
| //if (oc < 0) fr /= 1 << (-oc); | |||
| //sprintf(str,"%4.1f Hz", fr); | |||
| //m_out_freq->value(str); | |||
| } | |||
| void OscillatorPluginGUI::cb_FineTune(Fl_Knob* o, void* v) | |||
| @@ -296,7 +296,7 @@ void OscillatorPluginGUI::cb_FineTune(Fl_Knob* o, void* v) | |||
| inline void OscillatorPluginGUI::cb_PulseWidth_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetPulseWidth(o->value()); | |||
| m_GUICH->Set("PulseWidth",o->value()); | |||
| sprintf(str,"%4.0f %%", 100*o->value()); | |||
| m_out_pulseW->value(str); | |||
| } | |||
| @@ -305,24 +305,24 @@ void OscillatorPluginGUI::cb_PulseWidth(Fl_Slider* o, void* v) | |||
| { ((OscillatorPluginGUI*)(o->parent()))->cb_PulseWidth_i(o,v);} | |||
| inline void OscillatorPluginGUI::cb_Square_i(Fl_Check_Button* o, void* v) | |||
| { m_Plugin->SetType(OscillatorPlugin::SQUARE); } | |||
| { m_GUICH->Set("Type",(char)OscillatorPlugin::SQUARE); } | |||
| void OscillatorPluginGUI::cb_Square(Fl_Check_Button* o, void* v) | |||
| { ((OscillatorPluginGUI*)(o->parent()))->cb_Square_i(o,v); } | |||
| inline void OscillatorPluginGUI::cb_Saw_i(Fl_Check_Button* o, void* v) | |||
| { m_Plugin->SetType(OscillatorPlugin::SAW); } | |||
| { m_GUICH->Set("Type",(char)OscillatorPlugin::SAW); } | |||
| void OscillatorPluginGUI::cb_Saw(Fl_Check_Button* o, void* v) | |||
| { ((OscillatorPluginGUI*)(o->parent()))->cb_Saw_i(o,v); } | |||
| inline void OscillatorPluginGUI::cb_Noise_i(Fl_Check_Button* o, void* v) | |||
| { m_Plugin->SetType(OscillatorPlugin::NOISE); } | |||
| { m_GUICH->Set("Type",(char)OscillatorPlugin::NOISE); } | |||
| void OscillatorPluginGUI::cb_Noise(Fl_Check_Button* o, void* v) | |||
| { ((OscillatorPluginGUI*)(o->parent()))->cb_Noise_i(o,v); } | |||
| inline void OscillatorPluginGUI::cb_SHLen_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetSHLen(0.2f-o->value()); | |||
| m_GUICH->Set("SHLen",0.2f-o->value()); | |||
| sprintf(str,"%4.3f s", 0.2f-o->value()); | |||
| m_out_SHlen->value(str); | |||
| } | |||
| @@ -333,7 +333,7 @@ void OscillatorPluginGUI::cb_SHLen(Fl_Slider* o, void* v) | |||
| inline void OscillatorPluginGUI::cb_ModAmount_i(Fl_Knob* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_Plugin->SetModAmount(o->value()); | |||
| m_GUICH->Set("ModAmount",o->value()); | |||
| sprintf(str,"%4.0f %%", 100*o->value()); | |||
| m_out_mod->value(str); | |||
| } | |||
| @@ -33,13 +33,10 @@ | |||
| class OscillatorPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| OscillatorPluginGUI(int w, int h, OscillatorPlugin *o,const HostInfo *Info); | |||
| OscillatorPluginGUI(int w, int h, OscillatorPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| OscillatorPlugin *m_Plugin; | |||
| private: | |||
| Fl_Check_Button *ShapeSquare; | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| OutputPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| OutputPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -176,3 +179,5 @@ OutputPluginGUI.o: OutputPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -63,7 +63,8 @@ int OutputPlugin::m_NoExecuted=0; | |||
| return; \ | |||
| } | |||
| extern "C" { | |||
| extern "C" | |||
| { | |||
| SpiralPlugin* CreateInstance() | |||
| { | |||
| return new OutputPlugin; | |||
| @@ -97,6 +98,8 @@ OutputPlugin::OutputPlugin() | |||
| m_PluginInfo.PortTips.push_back("Left In"); | |||
| m_PluginInfo.PortTips.push_back("Right In"); | |||
| m_AudioCH->Register("Mode",(char*)&m_Mode,ChannelHandler::INPUT); | |||
| m_Mode=OUTPUT; | |||
| } | |||
| @@ -119,11 +122,11 @@ PluginInfo &OutputPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *OutputPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new OutputPluginGUI(m_PluginInfo.Width, | |||
| return new OutputPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this, | |||
| m_AudioCH, | |||
| m_HostInfo); | |||
| } | |||
| void OutputPlugin::Execute() | |||
| @@ -472,6 +475,3 @@ void OSSOutput::OpenReadWrite() | |||
| result = ioctl(m_Dspfd,SNDCTL_DSP_SPEED,&val); | |||
| CHECK_AND_REPORT_ERROR; | |||
| } | |||
| @@ -74,16 +74,13 @@ public: | |||
| virtual ~OutputPlugin(); | |||
| virtual PluginInfo& Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType* CreateGUI(); | |||
| virtual SpiralGUIType* CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void StreamOut(ostream &s) {} | |||
| virtual void StreamIn(istream &s) {} | |||
| // has to be defined in the plugin | |||
| virtual void UpdateGUI() { Fl::check(); } | |||
| void SetMode(Mode s) { m_Mode=s; } | |||
| Mode GetMode() { return m_Mode; } | |||
| private: | |||
| static int m_RefCount; | |||
| static int m_NoExecuted; | |||
| @@ -24,11 +24,9 @@ static const int GUI_COLOUR = 179; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| OutputPluginGUI::OutputPluginGUI(int w, int h,OutputPlugin *o,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o) | |||
| OutputPluginGUI::OutputPluginGUI(int w, int h, SpiralPlugin *o, ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Plugin=o; | |||
| Volume = new Fl_Knob(30, 22, 40, 40, "Volume"); | |||
| Volume->color(GUI_COLOUR); | |||
| Volume->type(Fl_Knob::DOTLIN); | |||
| @@ -65,7 +63,7 @@ SpiralPluginGUI(w,h,o) | |||
| end(); | |||
| } | |||
| void OutputPluginGUI::UpdateValues() | |||
| void OutputPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| Volume->value(OSSOutput::Get()->GetVolume()); | |||
| } | |||
| @@ -108,7 +106,7 @@ inline void OutputPluginGUI::cb_OpenRead_i(Fl_Button* o, void* v) | |||
| OpenWrite->value(0); | |||
| OSSOutput::Get()->Close(); | |||
| OSSOutput::Get()->OpenRead(); | |||
| m_Plugin->SetMode(OutputPlugin::INPUT); | |||
| m_GUICH->Set("Mode",(char)OutputPlugin::INPUT); | |||
| } | |||
| else | |||
| { | |||
| @@ -126,7 +124,7 @@ inline void OutputPluginGUI::cb_OpenDuplex_i(Fl_Button* o, void* v) | |||
| OpenRead->value(0); | |||
| OSSOutput::Get()->Close(); | |||
| OSSOutput::Get()->OpenReadWrite(); | |||
| m_Plugin->SetMode(OutputPlugin::DUPLEX); | |||
| m_GUICH->Set("Mode",(char)OutputPlugin::DUPLEX); | |||
| } | |||
| else | |||
| { | |||
| @@ -144,7 +142,7 @@ inline void OutputPluginGUI::cb_OpenWrite_i(Fl_Button* o, void* v) | |||
| OpenRead->value(0); | |||
| OSSOutput::Get()->Close(); | |||
| OSSOutput::Get()->OpenWrite(); | |||
| m_Plugin->SetMode(OutputPlugin::OUTPUT); | |||
| m_GUICH->Set("Mode",(char)OutputPlugin::OUTPUT); | |||
| } | |||
| else | |||
| { | |||
| @@ -33,12 +33,9 @@ | |||
| class OutputPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| OutputPluginGUI(int w, int h, OutputPlugin *o,const HostInfo *Info); | |||
| OutputPluginGUI(int w, int h, SpiralPlugin *o, ChannelHandler *ch, const HostInfo *Info); | |||
| virtual void UpdateValues(); | |||
| virtual SpiralPlugin* GetPlugin() { return m_Plugin; } | |||
| OutputPlugin *m_Plugin; | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| @@ -43,6 +43,7 @@ mandir = @mandir@ | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| @@ -51,6 +52,7 @@ HEADERS = ../SpiralPlugin.h \ | |||
| PoshSamplerPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| @@ -59,6 +61,7 @@ SOURCES = ../SpiralPlugin.C \ | |||
| PoshSamplerPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| @@ -174,3 +177,5 @@ PoshSamplerPluginGUI.o: PoshSamplerPluginGUI.C \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -118,6 +118,20 @@ m_Recording(false) | |||
| } | |||
| m_Version=3; | |||
| m_Current = 0; | |||
| m_AudioCH->Register("Num",&m_GUIArgs.Num); | |||
| m_AudioCH->Register("Value",&m_GUIArgs.Value); | |||
| m_AudioCH->Register("Bool",&m_GUIArgs.Boole); | |||
| m_AudioCH->Register("Int",&m_GUIArgs.Int); | |||
| m_AudioCH->Register("Start",&m_GUIArgs.Start); | |||
| m_AudioCH->Register("End",&m_GUIArgs.End); | |||
| m_AudioCH->Register("LoopStart",&m_GUIArgs.LoopStart); | |||
| m_AudioCH->RegisterData("Name",ChannelHandler::INPUT,&m_GUIArgs.Name,sizeof(m_GUIArgs.Name)); | |||
| m_AudioCH->Register("PlayPos",&m_CurrentPlayPos,ChannelHandler::OUTPUT); | |||
| m_AudioCH->RegisterData("SampleBuffer",ChannelHandler::OUTPUT_REQUEST,&m_SampleBuffer,TRANSBUF_SIZE); | |||
| m_AudioCH->Register("SampleSize",&m_SampleSize,ChannelHandler::OUTPUT_REQUEST); | |||
| } | |||
| PoshSamplerPlugin::~PoshSamplerPlugin() | |||
| @@ -142,11 +156,9 @@ PluginInfo &PoshSamplerPlugin::Initialise(const HostInfo *Host) | |||
| SpiralGUIType *PoshSamplerPlugin::CreateGUI() | |||
| { | |||
| m_GUI = new PoshSamplerPluginGUI(m_PluginInfo.Width, | |||
| return new PoshSamplerPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_HostInfo); | |||
| m_GUI->hide(); | |||
| return m_GUI; | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void PoshSamplerPlugin::Execute() | |||
| @@ -249,14 +261,12 @@ void PoshSamplerPlugin::Execute() | |||
| } | |||
| } | |||
| } | |||
| PoshSamplerPluginGUI *GUI=(PoshSamplerPluginGUI *)m_GUI; | |||
| // record | |||
| static int LastRecording=false; | |||
| if(m_Recording && InputExists(REC_INPUT)) | |||
| { | |||
| int s=GUI->GetCurrentSample(); | |||
| int s=0;//GUI->GetCurrentSample(); | |||
| if (!LastRecording) m_SampleVec[s]->Clear(); | |||
| @@ -279,13 +289,49 @@ void PoshSamplerPlugin::Execute() | |||
| } | |||
| LastRecording=m_Recording; | |||
| if (m_SampleDescVec[GUI->GetCurrentSample()]->SamplePos>0) | |||
| if (m_SampleDescVec[m_Current]->SamplePos>0) | |||
| { | |||
| GUI->SetPlayPos((int)m_SampleDescVec[GUI->GetCurrentSample()]->SamplePos); | |||
| m_CurrentPlayPos=(long)m_SampleDescVec[m_Current]->SamplePos; | |||
| } | |||
| } | |||
| #include <FL/fl_file_chooser.H> | |||
| void PoshSamplerPlugin::ExecuteCommands() | |||
| { | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch(m_AudioCH->GetCommand()) | |||
| { | |||
| case (LOAD) : LoadSample(m_GUIArgs.Num,m_GUIArgs.Name); break; | |||
| case (SAVE) : SaveSample(m_GUIArgs.Num,m_GUIArgs.Name); break; | |||
| case (SETVOL) : SetVolume(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
| case (SETPITCH) : SetPitch(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
| case (SETLOOP) : SetLoop(m_GUIArgs.Num,m_GUIArgs.Boole); break; | |||
| case (SETPING) : SetPingPong(m_GUIArgs.Num,m_GUIArgs.Boole); break; | |||
| case (SETNOTE) : SetNote(m_GUIArgs.Num,m_GUIArgs.Int); break; | |||
| case (SETOCT) : SetOctave(m_GUIArgs.Num,m_GUIArgs.Int); break; | |||
| case (SETPLAYPOINTS): | |||
| { | |||
| SetPlayStart(m_GUIArgs.Num,m_GUIArgs.Start); | |||
| SetLoopStart(m_GUIArgs.Num,m_GUIArgs.LoopStart); | |||
| SetLoopEnd(m_GUIArgs.Num,m_GUIArgs.End); | |||
| } break; | |||
| case (SETREC) : SetRecord(m_GUIArgs.Boole); break; | |||
| case (CUT) : Cut(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (COPY) : Copy(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (PASTE) : Paste(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (MIX) : Mix(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (CROP) : Crop(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (REV) : Reverse(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (AMP) : Amp(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
| case (SETCURRENT) : m_Current = m_GUIArgs.Num; break; | |||
| case (GETSAMPLE) : | |||
| { | |||
| m_AudioCH->SetupBulkTransfer((void*)m_SampleVec[m_Current]->GetBuffer()); | |||
| m_SampleSize=m_SampleVec[m_Current]->GetLengthInBytes(); | |||
| } break; | |||
| }; | |||
| } | |||
| } | |||
| void PoshSamplerPlugin::StreamOut(ostream &s) | |||
| { | |||
| @@ -334,8 +380,6 @@ void PoshSamplerPlugin::StreamIn(istream &s) | |||
| s.get(Buf,size+1); | |||
| } | |||
| } | |||
| ((PoshSamplerPluginGUI*)m_GUI)->UpdateValues(); | |||
| } | |||
| void PoshSamplerPlugin::LoadSample(int n, const string &Name) | |||
| @@ -349,7 +393,7 @@ void PoshSamplerPlugin::LoadSample(int n, const string &Name) | |||
| m_SampleDescVec[n]->SampleRate=Wav.GetSamplerate(); | |||
| m_SampleDescVec[n]->Stereo=Wav.IsStereo(); | |||
| m_SampleDescVec[n]->Pitch *= m_SampleDescVec[n]->SampleRate/(float)m_HostInfo->SAMPLERATE; | |||
| m_SampleDescVec[n]->LoopEnd=m_SampleVec[n]->GetLength()-1; | |||
| m_SampleDescVec[n]->LoopEnd=m_SampleVec[n]->GetLength()-1; | |||
| } | |||
| } | |||