@@ -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; | |||
} | |||
} | |||