@@ -105,7 +105,7 @@ m_Minimised (true) | |||||
if (m_PluginWindow) { | if (m_PluginWindow) { | ||||
m_PluginWindow->hide(); | m_PluginWindow->hide(); | ||||
add (m_PluginWindow); | add (m_PluginWindow); | ||||
m_PluginWindow->ResizeCallback (&cb_Resize, this); | |||||
m_PluginWindow->SetResizeCallback (&cb_Resize, this); | |||||
} | } | ||||
resizable(NULL); | resizable(NULL); | ||||
//Add the input/output ports | //Add the input/output ports | ||||
@@ -154,15 +154,13 @@ void Fl_DeviceGUI::ResizeToPluginWindow (void) { | |||||
void Fl_DeviceGUI::Minimise() { | void Fl_DeviceGUI::Minimise() { | ||||
m_Minimised = true; | m_Minimised = true; | ||||
Resize (m_MiniWidth, m_MiniHeight); | Resize (m_MiniWidth, m_MiniHeight); | ||||
parent()->redraw(); | |||||
} | } | ||||
void Fl_DeviceGUI::Maximise() { | void Fl_DeviceGUI::Maximise() { | ||||
m_Minimised=false; | m_Minimised=false; | ||||
ResizeToPluginWindow(); | |||||
m_PluginWindow->show(); | m_PluginWindow->show(); | ||||
m_IconButton->hide(); | m_IconButton->hide(); | ||||
parent()->redraw(); | |||||
ResizeToPluginWindow(); | |||||
((Fl_Canvas*)parent())->ToTop(this); | ((Fl_Canvas*)parent())->ToTop(this); | ||||
} | } | ||||
@@ -178,6 +176,7 @@ void Fl_DeviceGUI::Resize (int width, int height) { | |||||
int Centx = x()+w()/2; | int Centx = x()+w()/2; | ||||
int Centy = y()+h()/2; | int Centy = y()+h()/2; | ||||
m_IconButton->position (Centx-m_Icon->w()/2, Centy-m_Icon->h()/2); | m_IconButton->position (Centx-m_Icon->w()/2, Centy-m_Icon->h()/2); | ||||
parent()->redraw(); | |||||
} | } | ||||
void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | ||||
@@ -21,14 +21,14 @@ | |||||
#include <FL/Fl_Group.H> | #include <FL/Fl_Group.H> | ||||
class Fl_DeviceGUI; | class Fl_DeviceGUI; | ||||
class SpiralGUIType; | |||||
typedef void (SpiralGUISizeCB)(Fl_DeviceGUI *o); | typedef void (SpiralGUISizeCB)(Fl_DeviceGUI *o); | ||||
class SpiralGUIType : public Fl_Group { | class SpiralGUIType : public Fl_Group { | ||||
public: | public: | ||||
SpiralGUIType (int x, int y, int w, int h, const char *label = 0); | SpiralGUIType (int x, int y, int w, int h, const char *label = 0); | ||||
~SpiralGUIType (); | ~SpiralGUIType (); | ||||
void ResizeCallback (SpiralGUISizeCB *c, Fl_DeviceGUI *d) { m_ResizeSpiralGUI = c; m_DeviceGUI = d; } | |||||
void SetResizeCallback (SpiralGUISizeCB *c, Fl_DeviceGUI *d) { m_ResizeSpiralGUI = c; m_DeviceGUI = d; } | |||||
protected: | protected: | ||||
void DoResizeCallback (void) { if (m_ResizeSpiralGUI) m_ResizeSpiralGUI(m_DeviceGUI); } | void DoResizeCallback (void) { if (m_ResizeSpiralGUI) m_ResizeSpiralGUI(m_DeviceGUI); } | ||||
private: | private: | ||||
@@ -14,7 +14,7 @@ | |||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with this program; if not, write to the Free Software | * along with this program; if not, write to the Free Software | ||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | |||||
*/ | |||||
#include "Midi.h" | #include "Midi.h" | ||||
#include "unistd.h" | #include "unistd.h" | ||||
@@ -25,7 +25,7 @@ | |||||
static const int MIDI_SCANBUFSIZE=256; | static const int MIDI_SCANBUFSIZE=256; | ||||
static const int MIDI_KEYOFFSET=0; | static const int MIDI_KEYOFFSET=0; | ||||
static const unsigned char STATUS_START = 0x80; | |||||
static const unsigned char STATUS_START = 0x80; | |||||
static const unsigned char STATUS_NOTE_OFF = 0x80; | static const unsigned char STATUS_NOTE_OFF = 0x80; | ||||
static const unsigned char STATUS_NOTE_ON = 0x90; | static const unsigned char STATUS_NOTE_ON = 0x90; | ||||
static const unsigned char STATUS_AFTERTOUCH = 0xa0; | static const unsigned char STATUS_AFTERTOUCH = 0xa0; | ||||
@@ -40,97 +40,63 @@ static const unsigned char MIDI_CLOCK = 0xf8; | |||||
static const unsigned char ACTIVE_SENSE = 0xfe; | static const unsigned char ACTIVE_SENSE = 0xfe; | ||||
static int NKEYS = 30; | static int NKEYS = 30; | ||||
MidiDevice *MidiDevice::m_Singleton; | MidiDevice *MidiDevice::m_Singleton; | ||||
string MidiDevice::m_AppName; | |||||
#ifdef OSS_MIDI | |||||
string MidiDevice::m_DeviceName; | string MidiDevice::m_DeviceName; | ||||
string MidiDevice::m_AppName; | |||||
#endif | |||||
#if __APPLE__ | #if __APPLE__ | ||||
#define read AppleRead | #define read AppleRead | ||||
#endif | #endif | ||||
void MidiDevice::Init(const string &name, Type t) | |||||
{ | |||||
if (!m_Singleton) | |||||
void MidiDevice::Init(const string &name, Type t) | |||||
{ | |||||
if (!m_Singleton) | |||||
{ | { | ||||
m_AppName=name; | m_AppName=name; | ||||
m_Singleton=new MidiDevice(t); | |||||
m_Singleton=new MidiDevice(t); | |||||
} | } | ||||
} | } | ||||
MidiDevice::MidiDevice(Type t) : | |||||
m_Poly(1), | |||||
m_Clock(1.0f), | |||||
m_ClockCount(0) | |||||
{ | |||||
Open(t); | |||||
} | |||||
MidiDevice::~MidiDevice() | |||||
MidiDevice::MidiDevice(Type t) : | |||||
m_Poly (1), | |||||
m_Clock (1.0f), | |||||
m_ClockCount (0) | |||||
{ | { | ||||
#if __APPLE__ | |||||
AppleOpen(); | |||||
#endif | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
snd_seq_close (seq_handle); | |||||
#else | |||||
Close(); | |||||
seq_handle=AlsaOpen(t); | |||||
#endif | #endif | ||||
#ifdef OSS_MIDI | |||||
if (!OssOpen()) return; | |||||
#endif | |||||
m_Mutex = new pthread_mutex_t; | |||||
pthread_mutex_init (m_Mutex, NULL); | |||||
pthread_create (&m_MidiReader, NULL, (void*(*)(void*))MidiDevice::MidiReaderCallback, (void*)this); | |||||
} | } | ||||
void MidiDevice::Close() | |||||
{ | |||||
#if __APPLE__ | |||||
AppleClose(); | |||||
#else | |||||
pthread_mutex_lock(m_Mutex); | |||||
pthread_cancel(m_MidiReader); | |||||
pthread_mutex_unlock(m_Mutex); | |||||
pthread_mutex_destroy(m_Mutex); | |||||
close(m_MidiFd); | |||||
close(m_MidiWrFd); | |||||
cerr<<"Closed midi device"<<endl; | |||||
#endif // !__APPLE__ | |||||
} | |||||
void MidiDevice::Open(Type t) | |||||
{ | |||||
MidiDevice::~MidiDevice() { | |||||
pthread_mutex_lock (m_Mutex); | |||||
pthread_cancel (m_MidiReader); | |||||
pthread_mutex_unlock (m_Mutex); | |||||
pthread_mutex_destroy (m_Mutex); | |||||
#if __APPLE__ | #if __APPLE__ | ||||
AppleOpen(); | |||||
#else | |||||
#ifdef ALSA_MIDI | |||||
seq_handle=AlsaOpen(t); | |||||
#else | |||||
//if (!SpiralInfo::WANTMIDI) return; | |||||
m_MidiFd = open(m_DeviceName.c_str(),O_RDONLY|O_SYNC); | |||||
if (!m_MidiFd) | |||||
{ | |||||
cerr<<"Couldn't open midi for reading ["<<m_DeviceName<<"]"<<endl; | |||||
return; | |||||
} | |||||
m_MidiWrFd = open(m_DeviceName.c_str(),O_WRONLY); | |||||
if (!m_MidiWrFd) | |||||
{ | |||||
cerr<<"Couldn't open midi for writing ["<<m_DeviceName<<"]"<<endl; | |||||
return; | |||||
} | |||||
cerr<<"Opened midi device ["<<m_DeviceName<<"]"<<endl; | |||||
AppleClose(); | |||||
#endif | #endif | ||||
#endif // !__APPLE__ | |||||
m_Mutex = new pthread_mutex_t; | |||||
pthread_mutex_init(m_Mutex, NULL); | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
pthread_create(&m_MidiReader,NULL,(void*(*)(void*))MidiDevice::AlsaMidiReaderCallback,(void*)this); | |||||
#else | |||||
pthread_create(&m_MidiReader,NULL,(void*(*)(void*))MidiDevice::MidiReaderCallback,(void*)this); | |||||
AlsaClose(); | |||||
#endif | |||||
#ifdef OSS_MIDI | |||||
OssClose(); | |||||
#endif | #endif | ||||
} | } | ||||
// returns the next event off the list, or an | |||||
// returns the next event off the list, or an | |||||
// empty event if the list is exhausted | // empty event if the list is exhausted | ||||
MidiEvent MidiDevice::GetEvent(int Device) | MidiEvent MidiDevice::GetEvent(int Device) | ||||
{ | { | ||||
@@ -146,7 +112,7 @@ MidiEvent MidiDevice::GetEvent(int Device) | |||||
pthread_mutex_unlock(m_Mutex); | pthread_mutex_unlock(m_Mutex); | ||||
return MidiEvent(MidiEvent::NONE,0,0); | return MidiEvent(MidiEvent::NONE,0,0); | ||||
} | } | ||||
MidiEvent event(m_EventVec[Device].front()); | MidiEvent event(m_EventVec[Device].front()); | ||||
m_EventVec[Device].pop(); | m_EventVec[Device].pop(); | ||||
pthread_mutex_unlock(m_Mutex); | pthread_mutex_unlock(m_Mutex); | ||||
@@ -154,8 +120,7 @@ MidiEvent MidiDevice::GetEvent(int Device) | |||||
return event; | return event; | ||||
} | } | ||||
void MidiDevice::SendEvent(int Device,const MidiEvent &Event) | |||||
{ | |||||
void MidiDevice::SendEvent (int Device, const MidiEvent &Event) { | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
snd_seq_event_t ev; | snd_seq_event_t ev; | ||||
snd_seq_ev_clear (&ev); | snd_seq_ev_clear (&ev); | ||||
@@ -188,58 +153,82 @@ void MidiDevice::SendEvent(int Device,const MidiEvent &Event) | |||||
} | } | ||||
char message[3]; | char message[3]; | ||||
message[1]=Event.GetNote()+MIDI_KEYOFFSET; | message[1]=Event.GetNote()+MIDI_KEYOFFSET; | ||||
message[2]=(char)Event.GetVolume(); | message[2]=(char)Event.GetVolume(); | ||||
if (Event.GetType()==MidiEvent::ON) | if (Event.GetType()==MidiEvent::ON) | ||||
{ | { | ||||
message[0]=STATUS_NOTE_ON+Device; | message[0]=STATUS_NOTE_ON+Device; | ||||
write(m_MidiWrFd,message,3); | write(m_MidiWrFd,message,3); | ||||
//cerr<<"sending "<<message<<endl; | //cerr<<"sending "<<message<<endl; | ||||
} | } | ||||
if (Event.GetType()==MidiEvent::OFF) | if (Event.GetType()==MidiEvent::OFF) | ||||
{ | { | ||||
message[0]=STATUS_NOTE_OFF+Device; | message[0]=STATUS_NOTE_OFF+Device; | ||||
write(m_MidiWrFd,message,3); | |||||
write(m_MidiWrFd,message,3); | |||||
//cerr<<"sending "<<message<<endl; | //cerr<<"sending "<<message<<endl; | ||||
} | } | ||||
#endif | #endif | ||||
} | } | ||||
///////////////////////////////////////////////////////////////////////////////// | |||||
// Reader thread functions | |||||
//////////////////////////////////////////// Oss Code Only //////////////////////////////////////// | |||||
#ifdef OSS_MIDI | |||||
bool MidiDevice::OssOpen() { | |||||
//if (!SpiralInfo::WANTMIDI) return; | |||||
m_MidiFd = open (m_DeviceName.c_str(), O_RDONLY | O_SYNC); | |||||
if (!m_MidiFd) { | |||||
cerr << "Couldn't open midi for reading [" << m_DeviceName << "]" << endl; | |||||
return false; | |||||
} | |||||
m_MidiWrFd = open (m_DeviceName.c_str(), O_WRONLY); | |||||
if (!m_MidiWrFd) { | |||||
cerr << "Couldn't open midi for writing [" << m_DeviceName << "]" << endl; | |||||
return false; | |||||
} | |||||
cerr << "Opened midi device [" << m_DeviceName << "]" << endl; | |||||
return true; | |||||
} | |||||
void MidiDevice::OssClose() { | |||||
close(m_MidiFd); | |||||
close(m_MidiWrFd); | |||||
cerr<<"Closed midi device"<<endl; | |||||
} | |||||
// little helper to strip out the realtime and unused messages | // little helper to strip out the realtime and unused messages | ||||
void MidiDevice::ReadByte(unsigned char *c) | |||||
void MidiDevice::OssReadByte(unsigned char *c) | |||||
{ | { | ||||
*c=ACTIVE_SENSE; | *c=ACTIVE_SENSE; | ||||
do read(m_MidiFd,c,1); | |||||
while (*c>=STATUS_END && *c!=MIDI_CLOCK); | |||||
do read(m_MidiFd,c,1); | |||||
while (*c>=STATUS_END && *c!=MIDI_CLOCK); | |||||
} | } | ||||
// collect events deals with the byte level messages, and sorts | |||||
// collect events deals with the byte level messages, and sorts | |||||
// and filters them into distinct messages we can handle easily | // and filters them into distinct messages we can handle easily | ||||
void MidiDevice::CollectEvents() | |||||
{ | |||||
unsigned char buf[1]; | |||||
void MidiDevice::OssCollectEvents() | |||||
{ | |||||
unsigned char buf[1]; | |||||
int count,n,nn; | int count,n,nn; | ||||
bool MessageSent; | bool MessageSent; | ||||
unsigned char data[3],last=0; | unsigned char data[3],last=0; | ||||
// constantly scan for relevent input, | // constantly scan for relevent input, | ||||
// and write it to the pipe | // and write it to the pipe | ||||
// filters out unhandled messages, and attempts to build | |||||
// filters out unhandled messages, and attempts to build | |||||
// coherent messages to send to the midi handler | // coherent messages to send to the midi handler | ||||
bool InSysex=false; | bool InSysex=false; | ||||
for(;;) | for(;;) | ||||
{ | { | ||||
ReadByte(buf); | |||||
if (*buf==MIDI_CLOCK) | |||||
OssReadByte(buf); | |||||
if (*buf==MIDI_CLOCK) | |||||
{ | { | ||||
m_ClockCount++; | m_ClockCount++; | ||||
if (m_ClockCount==6) | if (m_ClockCount==6) | ||||
@@ -250,65 +239,65 @@ void MidiDevice::CollectEvents() | |||||
} | } | ||||
else | else | ||||
if (*buf>=STATUS_START) // we've got a status byte | if (*buf>=STATUS_START) // we've got a status byte | ||||
{ | |||||
{ | |||||
if (*buf==SYSEX_TERMINATOR) InSysex=false; | if (*buf==SYSEX_TERMINATOR) InSysex=false; | ||||
// find out if it's an opcode | // find out if it's an opcode | ||||
if(*buf>=STATUS_START && *buf<=STATUS_END) | |||||
{ | |||||
if(*buf>=STATUS_START && *buf<=STATUS_END) | |||||
{ | |||||
InSysex=false; | InSysex=false; | ||||
last=data[0]=*buf; | last=data[0]=*buf; | ||||
if (data[0]>=STATUS_PROG_CHANGE && data[0]<STATUS_PITCH_WHEEL) | |||||
if (data[0]>=STATUS_PROG_CHANGE && data[0]<STATUS_PITCH_WHEEL) | |||||
{ | { | ||||
ReadByte(&data[1]); //one byte | |||||
OssReadByte(&data[1]); //one byte | |||||
data[2]=0; | data[2]=0; | ||||
} | } | ||||
else // get the next two bytes | else // get the next two bytes | ||||
{ | |||||
ReadByte(&data[1]); | |||||
ReadByte(&data[2]); | |||||
{ | |||||
OssReadByte(&data[1]); | |||||
OssReadByte(&data[2]); | |||||
} | } | ||||
AddEvent(data); | |||||
} | |||||
OssAddEvent(data); | |||||
} | |||||
else // its a sysex or other message like active sense | else // its a sysex or other message like active sense | ||||
{ | |||||
{ | |||||
if (*buf==SYSEX_START) InSysex=true; | if (*buf==SYSEX_START) InSysex=true; | ||||
cerr<<"Unhandled midi message: "; printf("%x\n",(int)*buf); | |||||
cerr<<"Unhandled midi message: "; printf("%x\n",(int)*buf); | |||||
} | } | ||||
} | } | ||||
else // more data (running status) | |||||
else // more data (running status) | |||||
{ | { | ||||
if (!InSysex) | |||||
if (!InSysex) | |||||
{ | { | ||||
data[0]=last; | data[0]=last; | ||||
data[1]=*buf; | data[1]=*buf; | ||||
if (data[0]>=STATUS_PROG_CHANGE && data[0]<STATUS_PITCH_WHEEL) | |||||
{ | |||||
if (data[0]>=STATUS_PROG_CHANGE && data[0]<STATUS_PITCH_WHEEL) | |||||
{ | |||||
data[2]=0; //one byte | data[2]=0; //one byte | ||||
} | } | ||||
else // get the next byte | else // get the next byte | ||||
{ | |||||
ReadByte(&data[2]); | |||||
{ | |||||
OssReadByte(&data[2]); | |||||
} | } | ||||
AddEvent(data); | |||||
OssAddEvent(data); | |||||
} | } | ||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
// addevent converts the midi bytecode into midi message objects and | |||||
// addevent converts the midi bytecode into midi message objects and | |||||
// stacks them onto the event list to be picked up by the app | // stacks them onto the event list to be picked up by the app | ||||
void MidiDevice::AddEvent(unsigned char* midi) | |||||
{ | |||||
void MidiDevice::OssAddEvent(unsigned char* midi) | |||||
{ | |||||
MidiEvent::type MessageType=MidiEvent::NONE; | MidiEvent::type MessageType=MidiEvent::NONE; | ||||
int Volume=0,Note=0,EventDevice=0; | |||||
int Volume=0,Note=0,EventDevice=0; | |||||
// note off | // note off | ||||
if (midi[0] >= STATUS_NOTE_OFF && midi[0] < STATUS_NOTE_ON) | |||||
{ | |||||
if (midi[0] >= STATUS_NOTE_OFF && midi[0] < STATUS_NOTE_ON) | |||||
{ | |||||
MessageType=MidiEvent::OFF; | MessageType=MidiEvent::OFF; | ||||
Note=midi[1]-MIDI_KEYOFFSET; | Note=midi[1]-MIDI_KEYOFFSET; | ||||
EventDevice=midi[0]-STATUS_NOTE_OFF; | EventDevice=midi[0]-STATUS_NOTE_OFF; | ||||
@@ -317,8 +306,8 @@ void MidiDevice::AddEvent(unsigned char* midi) | |||||
else if (midi[0] >= STATUS_NOTE_ON && midi[0] < STATUS_AFTERTOUCH) | else if (midi[0] >= STATUS_NOTE_ON && midi[0] < STATUS_AFTERTOUCH) | ||||
{ | { | ||||
Volume = midi[2]; | Volume = midi[2]; | ||||
// cope with Roland equipment, where note on's | |||||
// cope with Roland equipment, where note on's | |||||
// with zero velocity are sent as note offs. | // with zero velocity are sent as note offs. | ||||
if (Volume) MessageType=MidiEvent::ON; | if (Volume) MessageType=MidiEvent::ON; | ||||
else MessageType=MidiEvent::OFF; | else MessageType=MidiEvent::OFF; | ||||
@@ -328,15 +317,15 @@ void MidiDevice::AddEvent(unsigned char* midi) | |||||
} | } | ||||
// aftertouch | // aftertouch | ||||
else if (midi[0] >= STATUS_AFTERTOUCH && midi[0] < STATUS_CONTROL_CHANGE) | else if (midi[0] >= STATUS_AFTERTOUCH && midi[0] < STATUS_CONTROL_CHANGE) | ||||
{ | |||||
{ | |||||
MessageType=MidiEvent::AFTERTOUCH; | MessageType=MidiEvent::AFTERTOUCH; | ||||
Note=midi[1]-MIDI_KEYOFFSET; | |||||
Volume=midi[2]; | |||||
Note=midi[1]-MIDI_KEYOFFSET; | |||||
Volume=midi[2]; | |||||
EventDevice=midi[0]-STATUS_AFTERTOUCH; | EventDevice=midi[0]-STATUS_AFTERTOUCH; | ||||
} | } | ||||
// parameter | // parameter | ||||
else if (midi[0] >= STATUS_CONTROL_CHANGE && midi[0] < STATUS_PROG_CHANGE) | else if (midi[0] >= STATUS_CONTROL_CHANGE && midi[0] < STATUS_PROG_CHANGE) | ||||
{ | |||||
{ | |||||
MessageType=MidiEvent::PARAMETER; | MessageType=MidiEvent::PARAMETER; | ||||
Note=midi[1]; | Note=midi[1]; | ||||
Volume=midi[2]; | Volume=midi[2]; | ||||
@@ -344,20 +333,20 @@ void MidiDevice::AddEvent(unsigned char* midi) | |||||
} | } | ||||
// channel pressure | // channel pressure | ||||
else if (midi[0] >= STATUS_CHANNEL_PRESSURE && midi[0] < STATUS_PITCH_WHEEL) | else if (midi[0] >= STATUS_CHANNEL_PRESSURE && midi[0] < STATUS_PITCH_WHEEL) | ||||
{ | |||||
MessageType=MidiEvent::CHANNELPRESSURE; | |||||
Volume=midi[1]; | |||||
{ | |||||
MessageType=MidiEvent::CHANNELPRESSURE; | |||||
Volume=midi[1]; | |||||
EventDevice=midi[0]-STATUS_CHANNEL_PRESSURE; | EventDevice=midi[0]-STATUS_CHANNEL_PRESSURE; | ||||
} | } | ||||
// note pitchbend | // note pitchbend | ||||
else if (midi[0] >= STATUS_PITCH_WHEEL && midi[0] < STATUS_END) | else if (midi[0] >= STATUS_PITCH_WHEEL && midi[0] < STATUS_END) | ||||
{ | |||||
{ | |||||
MessageType=MidiEvent::PITCHBEND; | MessageType=MidiEvent::PITCHBEND; | ||||
// should probably take the first byte into account too? | // should probably take the first byte into account too? | ||||
Volume=midi[2]; | |||||
Volume=midi[2]; | |||||
EventDevice=midi[0]-STATUS_PITCH_WHEEL; | EventDevice=midi[0]-STATUS_PITCH_WHEEL; | ||||
} | } | ||||
if (EventDevice<0 || EventDevice>15) | if (EventDevice<0 || EventDevice>15) | ||||
{ | { | ||||
cerr<<"Error - Midi device "<<EventDevice<<" ??"<<endl; | cerr<<"Error - Midi device "<<EventDevice<<" ??"<<endl; | ||||
@@ -369,43 +358,50 @@ void MidiDevice::AddEvent(unsigned char* midi) | |||||
pthread_mutex_unlock(m_Mutex); | pthread_mutex_unlock(m_Mutex); | ||||
} | } | ||||
/////////////////////////////////////////////////////////////////////////////// | |||||
#endif | |||||
//////////////////////////////////////////// Alsa Code Only //////////////////////////////////////// | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
// code taken and modified from jack_miniFMsynth | // code taken and modified from jack_miniFMsynth | ||||
void MidiDevice::AlsaCollectEvents() | |||||
void MidiDevice::AlsaClose () { | |||||
snd_seq_close (seq_handle); | |||||
} | |||||
void MidiDevice::AlsaCollectEvents() | |||||
{ | { | ||||
int seq_nfds, l1; | int seq_nfds, l1; | ||||
struct pollfd *pfds; | struct pollfd *pfds; | ||||
seq_nfds = snd_seq_poll_descriptors_count(seq_handle, POLLIN); | seq_nfds = snd_seq_poll_descriptors_count(seq_handle, POLLIN); | ||||
pfds = (struct pollfd *)alloca(sizeof(struct pollfd) * seq_nfds); | pfds = (struct pollfd *)alloca(sizeof(struct pollfd) * seq_nfds); | ||||
snd_seq_poll_descriptors(seq_handle, pfds, seq_nfds, POLLIN); | snd_seq_poll_descriptors(seq_handle, pfds, seq_nfds, POLLIN); | ||||
for(;;) | for(;;) | ||||
{ | |||||
if (poll (pfds, seq_nfds, 1000) > 0) | |||||
{ | |||||
if (poll (pfds, seq_nfds, 1000) > 0) | |||||
{ | { | ||||
for (l1 = 0; l1 < seq_nfds; l1++) | |||||
for (l1 = 0; l1 < seq_nfds; l1++) | |||||
{ | { | ||||
if (pfds[l1].revents > 0) | if (pfds[l1].revents > 0) | ||||
{ | |||||
{ | |||||
snd_seq_event_t *ev; | snd_seq_event_t *ev; | ||||
int l1; | int l1; | ||||
MidiEvent::type MessageType=MidiEvent::NONE; | MidiEvent::type MessageType=MidiEvent::NONE; | ||||
int Volume=0,Note=0,EventDevice=0; | |||||
do | |||||
int Volume=0,Note=0,EventDevice=0; | |||||
do | |||||
{ | { | ||||
snd_seq_event_input(seq_handle, &ev); | snd_seq_event_input(seq_handle, &ev); | ||||
if ((ev->type == SND_SEQ_EVENT_NOTEON) && (ev->data.note.velocity == 0)) | |||||
if ((ev->type == SND_SEQ_EVENT_NOTEON) && (ev->data.note.velocity == 0)) | |||||
{ | { | ||||
ev->type = SND_SEQ_EVENT_NOTEOFF; | |||||
ev->type = SND_SEQ_EVENT_NOTEOFF; | |||||
} | } | ||||
switch (ev->type) { | switch (ev->type) { | ||||
case SND_SEQ_EVENT_PITCHBEND: | case SND_SEQ_EVENT_PITCHBEND: | ||||
MessageType=MidiEvent::CHANNELPRESSURE; | |||||
MessageType=MidiEvent::CHANNELPRESSURE; | |||||
Volume = (char)((ev->data.control.value / 8192.0)*256); | Volume = (char)((ev->data.control.value / 8192.0)*256); | ||||
break; | break; | ||||
case SND_SEQ_EVENT_CONTROLLER: | case SND_SEQ_EVENT_CONTROLLER: | ||||
@@ -418,17 +414,17 @@ void MidiDevice::AlsaCollectEvents() | |||||
EventDevice = ev->data.control.channel; | EventDevice = ev->data.control.channel; | ||||
Note = ev->data.note.note; | Note = ev->data.note.note; | ||||
Volume = ev->data.note.velocity; | Volume = ev->data.note.velocity; | ||||
break; | |||||
break; | |||||
case SND_SEQ_EVENT_NOTEOFF: | case SND_SEQ_EVENT_NOTEOFF: | ||||
MessageType=MidiEvent::ON; | MessageType=MidiEvent::ON; | ||||
EventDevice = ev->data.control.channel; | EventDevice = ev->data.control.channel; | ||||
Note = ev->data.note.note; | Note = ev->data.note.note; | ||||
break; | |||||
break; | |||||
} | } | ||||
pthread_mutex_lock(m_Mutex); | pthread_mutex_lock(m_Mutex); | ||||
m_EventVec[EventDevice].push(MidiEvent(MessageType,Note,Volume)); | m_EventVec[EventDevice].push(MidiEvent(MessageType,Note,Volume)); | ||||
pthread_mutex_unlock(m_Mutex); | pthread_mutex_unlock(m_Mutex); | ||||
snd_seq_free_event(ev); | snd_seq_free_event(ev); | ||||
} while (snd_seq_event_input_pending(seq_handle, 0) > 0); | } while (snd_seq_event_input_pending(seq_handle, 0) > 0); | ||||
} | } | ||||
@@ -437,11 +433,11 @@ void MidiDevice::AlsaCollectEvents() | |||||
} | } | ||||
} | } | ||||
snd_seq_t *MidiDevice::AlsaOpen(Type t) | |||||
snd_seq_t *MidiDevice::AlsaOpen(Type t) | |||||
{ | { | ||||
snd_seq_t *seq_handle; | snd_seq_t *seq_handle; | ||||
int client_id, port_id; | int client_id, port_id; | ||||
if (t==WRITE) | if (t==WRITE) | ||||
{ | { | ||||
if (snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_OUTPUT, 0) < 0) { | if (snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_OUTPUT, 0) < 0) { | ||||
@@ -475,26 +471,28 @@ snd_seq_t *MidiDevice::AlsaOpen(Type t) | |||||
#endif | #endif | ||||
//////////////////////////////////////////// Apple Code Only ///////////////////////////////////////// | |||||
#if __APPLE__ | #if __APPLE__ | ||||
void MidiDevice::AppleOpen() | void MidiDevice::AppleOpen() | ||||
{ | { | ||||
m_ReadFillIndex = m_ReadReadIndex = 0; | m_ReadFillIndex = m_ReadReadIndex = 0; | ||||
OSStatus err = 0; | OSStatus err = 0; | ||||
mMIDISource = NULL; | mMIDISource = NULL; | ||||
mMIDIClient = NULL; | mMIDIClient = NULL; | ||||
mMIDIDestination = NULL; | mMIDIDestination = NULL; | ||||
err = MIDIClientCreate(CFSTR("org.pawpal.ssm"), NULL, NULL, &mMIDIClient); | err = MIDIClientCreate(CFSTR("org.pawpal.ssm"), NULL, NULL, &mMIDIClient); | ||||
if (err) printf("MIDIClientCreate failed returned %d\n", err); | if (err) printf("MIDIClientCreate failed returned %d\n", err); | ||||
if (!err) { | if (!err) { | ||||
err = MIDISourceCreate(mMIDIClient, CFSTR("SpiralSynth"), &mMIDISource); | err = MIDISourceCreate(mMIDIClient, CFSTR("SpiralSynth"), &mMIDISource); | ||||
if (err) printf("MIDIInputPortCreate failed returned %d\n", err); | if (err) printf("MIDIInputPortCreate failed returned %d\n", err); | ||||
} | } | ||||
if (!err) { | if (!err) { | ||||
err = MIDIDestinationCreate(mMIDIClient, CFSTR("SpiralSynth"), sMIDIRead, this, &mMIDIDestination); | err = MIDIDestinationCreate(mMIDIClient, CFSTR("SpiralSynth"), sMIDIRead, this, &mMIDIDestination); | ||||
MIDIObjectSetIntegerProperty(mMIDIDestination, kMIDIPropertyUniqueID, 'SSmP'); | MIDIObjectSetIntegerProperty(mMIDIDestination, kMIDIPropertyUniqueID, 'SSmP'); | ||||
@@ -543,7 +541,7 @@ int MidiDevice::AppleRead(int dummy, unsigned char *outbuffer, int maxlen) | |||||
void MidiDevice::sMIDIRead(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon) | void MidiDevice::sMIDIRead(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon) | ||||
{ | { | ||||
MidiDevice & t = *((MidiDevice*)readProcRefCon); | MidiDevice & t = *((MidiDevice*)readProcRefCon); | ||||
const MIDIPacket *packet = &pktlist->packet[0]; | const MIDIPacket *packet = &pktlist->packet[0]; | ||||
for (int i = 0; i < (int)pktlist->numPackets; i++) { | for (int i = 0; i < (int)pktlist->numPackets; i++) { | ||||
const MIDIPacket & p = *packet; | const MIDIPacket & p = *packet; | ||||
@@ -30,7 +30,10 @@ | |||||
using namespace std; | using namespace std; | ||||
// comment out one of these to choose your MIDI driver (for non-Apple systems) | |||||
// I'll stick this in the ./configue when it'd all working | |||||
#define ALSA_MIDI | #define ALSA_MIDI | ||||
//#define OSS_MIDI | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
#include <alsa/asoundlib.h> | #include <alsa/asoundlib.h> | ||||
@@ -46,9 +49,9 @@ public: | |||||
enum type{NONE,ON,OFF,AFTERTOUCH,PARAMETER,CHANNELPRESSURE,PITCHBEND}; | enum type{NONE,ON,OFF,AFTERTOUCH,PARAMETER,CHANNELPRESSURE,PITCHBEND}; | ||||
MidiEvent() {m_Type=NONE;} | MidiEvent() {m_Type=NONE;} | ||||
MidiEvent(type t, int note, float v) | |||||
MidiEvent(type t, int note, float v) | |||||
{m_Type=t; m_Note=note; m_Volume=v;} | {m_Type=t; m_Note=note; m_Volume=v;} | ||||
type GetType() const {return m_Type;} | type GetType() const {return m_Type;} | ||||
float GetVolume() const {return m_Volume;} | float GetVolume() const {return m_Volume;} | ||||
int GetNote() const {return m_Note;} | int GetNote() const {return m_Note;} | ||||
@@ -66,9 +69,13 @@ public: | |||||
enum Type{READ,WRITE}; | enum Type{READ,WRITE}; | ||||
static void Init(const string &name, Type t); | static void Init(const string &name, Type t); | ||||
static void SetDeviceName(string s) { m_DeviceName=s; } | |||||
static MidiDevice *Get() { return m_Singleton; } | |||||
static void PackUpAndGoHome() { if(m_Singleton) delete m_Singleton; m_Singleton=NULL; } | |||||
static void SetDeviceName(string s) { | |||||
#ifdef OSS_MIDI | |||||
m_DeviceName=s; | |||||
#endif | |||||
} | |||||
static MidiDevice *Get() { return m_Singleton; } | |||||
static void PackUpAndGoHome() { if (m_Singleton) delete m_Singleton; m_Singleton=NULL; } | |||||
MidiEvent GetEvent(int Device); | MidiEvent GetEvent(int Device); | ||||
void SendEvent(int Device,const MidiEvent &Event); | void SendEvent(int Device,const MidiEvent &Event); | ||||
@@ -76,47 +83,43 @@ public: | |||||
void SetPoly(int s) { m_Poly=s; } | void SetPoly(int s) { m_Poly=s; } | ||||
float GetClock() { return m_Clock; } | float GetClock() { return m_Clock; } | ||||
private: | private: | ||||
MidiDevice(Type t); | MidiDevice(Type t); | ||||
void Open(Type t); | |||||
void Close(); | |||||
void CollectEvents(); | |||||
void AddEvent(unsigned char* midi); | |||||
void ReadByte(unsigned char *c); | |||||
static void *MidiReaderCallback(void *o) { ((MidiDevice*)o)->CollectEvents(); return NULL; } | |||||
int m_MidiFd; | |||||
int m_MidiWrFd; | |||||
static string m_DeviceName; | |||||
int m_Poly; | int m_Poly; | ||||
float m_Clock; | float m_Clock; | ||||
int m_ClockCount; | int m_ClockCount; | ||||
queue<MidiEvent> m_EventVec[16]; | queue<MidiEvent> m_EventVec[16]; | ||||
static MidiDevice *m_Singleton; | static MidiDevice *m_Singleton; | ||||
pthread_t m_MidiReader; | pthread_t m_MidiReader; | ||||
pthread_mutex_t* m_Mutex; | pthread_mutex_t* m_Mutex; | ||||
static string m_AppName; | |||||
static string m_AppName; | |||||
#ifdef ALSA_MIDI | #ifdef ALSA_MIDI | ||||
static void *AlsaMidiReaderCallback(void *o) { ((MidiDevice*)o)->AlsaCollectEvents(); return NULL; } | |||||
static void *MidiReaderCallback (void *o) { ((MidiDevice*)o)->AlsaCollectEvents(); return NULL; } | |||||
void AlsaCollectEvents(); | void AlsaCollectEvents(); | ||||
void AlsaClose (); | |||||
snd_seq_t *seq_handle; | snd_seq_t *seq_handle; | ||||
snd_seq_t *AlsaOpen(Type t); | snd_seq_t *AlsaOpen(Type t); | ||||
#endif | #endif | ||||
#ifdef OSS_MIDI | |||||
static void *MidiReaderCallback (void *o) { ((MidiDevice*)o)->OssCollectEvents(); return NULL; } | |||||
void OssCollectEvents(); | |||||
void OssAddEvent(unsigned char* midi); | |||||
void OssReadByte(unsigned char *c); | |||||
void OssClose(); | |||||
static string m_DeviceName; | |||||
int m_MidiFd, m_MidiWrFd; | |||||
#endif | |||||
#if __APPLE__ | #if __APPLE__ | ||||
MIDIClientRef mMIDIClient; | MIDIClientRef mMIDIClient; | ||||
MIDIEndpointRef mMIDISource; | MIDIEndpointRef mMIDISource; | ||||
MIDIEndpointRef mMIDIDestination; | MIDIEndpointRef mMIDIDestination; | ||||
#define midi_ReadSize 4096 | #define midi_ReadSize 4096 | ||||
unsigned char m_ReadBuffer[midi_ReadSize]; | unsigned char m_ReadBuffer[midi_ReadSize]; | ||||
volatile int m_ReadFillIndex; | volatile int m_ReadFillIndex; | ||||
@@ -126,10 +129,10 @@ private: | |||||
void MidiDevice::AppleClose(); | void MidiDevice::AppleClose(); | ||||
int MidiDevice::AppleWrite(int dummy, unsigned char *outbuffer, int maxlen); | int MidiDevice::AppleWrite(int dummy, unsigned char *outbuffer, int maxlen); | ||||
int MidiDevice::AppleRead(int dummy, unsigned char *outbuffer, int maxlen); | int MidiDevice::AppleRead(int dummy, unsigned char *outbuffer, int maxlen); | ||||
static void MidiDevice::sMIDIRead(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon); | static void MidiDevice::sMIDIRead(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon); | ||||
#endif | |||||
#endif | |||||
}; | }; | ||||
#endif | #endif |
@@ -106,71 +106,58 @@ m_CVCount(0) | |||||
} | } | ||||
void ControllerPluginGUI::AddCV() | |||||
{ | |||||
CVGUI *NewCV = new CVGUI (m_CVCount, this, m_GUIColour); | |||||
m_GUIVec.push_back(NewCV); | |||||
m_MainPack->add(NewCV->m_SliderGroup); | |||||
m_CVCount++; | |||||
void ControllerPluginGUI::AddCV() { | |||||
CVGUI *NewCV = new CVGUI (m_CVCount, this, m_GUIColour); | |||||
m_GUIVec.push_back (NewCV); | |||||
m_MainPack->add (NewCV->m_SliderGroup); | |||||
m_CVCount++; | |||||
} | } | ||||
void ControllerPluginGUI::DeleteCV() | |||||
{ | |||||
vector<CVGUI*>::iterator i=m_GUIVec.end(); | |||||
i--; | |||||
m_MainPack->remove((*i)->m_SliderGroup); | |||||
delete *i; | |||||
m_GUIVec.erase(i); | |||||
m_CVCount--; | |||||
void ControllerPluginGUI::DeleteCV() { | |||||
vector<CVGUI*>::iterator i=m_GUIVec.end(); | |||||
i--; | |||||
m_MainPack->remove ((*i)->m_SliderGroup); | |||||
delete *i; | |||||
m_GUIVec.erase (i); | |||||
m_CVCount--; | |||||
} | } | ||||
void ControllerPluginGUI::Clear() | |||||
{ | |||||
for (vector<ControllerPluginGUI::CVGUI*>::iterator i=m_GUIVec.begin(); | |||||
i!=m_GUIVec.end(); i++) | |||||
{ | |||||
m_MainPack->remove((*i)->m_SliderGroup); | |||||
delete *i; | |||||
} | |||||
m_GUIVec.clear(); | |||||
m_CVCount=0; | |||||
void ControllerPluginGUI::Clear() { | |||||
for (vector<ControllerPluginGUI::CVGUI*>::iterator i=m_GUIVec.begin(); i!=m_GUIVec.end(); i++) { | |||||
m_MainPack->remove ((*i)->m_SliderGroup); | |||||
delete *i; | |||||
} | |||||
m_GUIVec.clear(); | |||||
m_CVCount = 0; | |||||
} | } | ||||
void ControllerPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
{ | |||||
ControllerPlugin *Plugin = (ControllerPlugin *)o; | |||||
int c; | |||||
float min, max, val; | |||||
string Title,Min,Max; | |||||
char temp[64]; | |||||
Clear(); | |||||
c=Plugin->GetNum(); | |||||
for (int n=0; n<c; n++) { | |||||
AddCV(); | |||||
m_GUIVec[n]->m_Title->value(Plugin->GetName(n).c_str()); | |||||
min = Plugin->GetMin(n); | |||||
max = Plugin->GetMax(n); | |||||
sprintf(temp,"%.6f",min); | |||||
m_GUIVec[n]->m_Min->value(temp); | |||||
sprintf(temp,"%.6f",max); | |||||
m_GUIVec[n]->m_Max->value(temp); | |||||
// Scale and invert value to match slider range (0->1) | |||||
float val = 1.0f - (Plugin->GetVal(n) - min) / (max - min); | |||||
m_GUIVec[n]->m_Chan->value(val); | |||||
} | |||||
resize(x(), y(), c*60, h()); | |||||
void ControllerPluginGUI::UpdateValues (SpiralPlugin *o) { | |||||
ControllerPlugin *Plugin = (ControllerPlugin *)o; | |||||
int c; | |||||
float min, max, val; | |||||
string Title, Min, Max; | |||||
char temp[64]; | |||||
Clear(); | |||||
c=Plugin->GetNum(); | |||||
for (int n=0; n<c; n++) { | |||||
AddCV(); | |||||
m_GUIVec[n]->m_Title->value (Plugin->GetName (n).c_str()); | |||||
min = Plugin->GetMin (n); | |||||
sprintf(temp, "%.6f", min); | |||||
m_GUIVec[n]->m_Min->value (temp); | |||||
max = Plugin->GetMax (n); | |||||
sprintf (temp, "%.6f", max); | |||||
m_GUIVec[n]->m_Max->value (temp); | |||||
// Scale and/or invert value to match slider range (0->1) | |||||
float val = 1.0f - (Plugin->GetVal(n) - min) / (max - min); | |||||
m_GUIVec[n]->m_Chan->value (val); | |||||
} | |||||
Resize (c*60, h()); | |||||
} | } | ||||
inline void ControllerPluginGUI::cb_Title_i(Fl_Input* o, void* v) | inline void ControllerPluginGUI::cb_Title_i(Fl_Input* o, void* v) | ||||
{ | { | ||||
int num=*(int*)(v); | int num=*(int*)(v); | ||||
char temp[256]; | char temp[256]; | ||||
sprintf(temp,"%s",m_GUIVec[num]->m_Title->value()); | sprintf(temp,"%s",m_GUIVec[num]->m_Title->value()); | ||||
m_GUICH->Set("Number",num); | m_GUICH->Set("Number",num); | ||||
@@ -249,44 +236,58 @@ inline void ControllerPluginGUI::cb_Min_i(Fl_Input* o, void* v) | |||||
void ControllerPluginGUI::cb_Min(Fl_Input* o, void* v) | void ControllerPluginGUI::cb_Min(Fl_Input* o, void* v) | ||||
{ ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Min_i(o,v);} | { ((ControllerPluginGUI*)(o->parent()->user_data()))->cb_Min_i(o,v);} | ||||
inline void ControllerPluginGUI::cb_Add_i(Fl_Button* o, void* v) { | |||||
if (m_CVCount<MAX_CHANNELS) { | |||||
AddCV(); | |||||
int num = (int)m_GUIVec.size(); | |||||
float min = atof(m_GUIVec[num - 1]->m_Min->value()); | |||||
float max = atof(m_GUIVec[num - 1]->m_Max->value()); | |||||
float val = (1.0f-o->value())*(max-min)+min; | |||||
char temp[256]; | |||||
sprintf(temp,"%s",m_GUIVec[num - 1]->m_Title->value()); | |||||
m_GUICH->Set("Number", num); | |||||
m_GUICH->SetCommand(ControllerPlugin::SETNUM); | |||||
m_GUICH->Wait(); | |||||
m_GUICH->Set("Number", num); | |||||
m_GUICH->SetData("Name",(void*)temp); | |||||
m_GUICH->Set("Max",max); | |||||
m_GUICH->Set("Value",val); | |||||
m_GUICH->Set("Min",min); | |||||
m_GUICH->SetCommand(ControllerPlugin::SETALL); | |||||
m_GUICH->Wait(); | |||||
resize(x(),y(),w()+60,h()); | |||||
} | |||||
inline void ControllerPluginGUI::cb_Add_i (Fl_Button* o, void* v) { | |||||
if (m_CVCount < MAX_CHANNELS) { | |||||
AddCV(); | |||||
int num = (int)m_GUIVec.size(); | |||||
float min = atof (m_GUIVec[num - 1]->m_Min->value()); | |||||
float max = atof (m_GUIVec[num - 1]->m_Max->value()); | |||||
float val = (1.0f-o->value()) * (max-min) + min; | |||||
char temp[256]; | |||||
sprintf (temp,"%s",m_GUIVec[num - 1]->m_Title->value()); | |||||
m_GUICH->Set ("Number", num); | |||||
m_GUICH->SetCommand (ControllerPlugin::SETNUM); | |||||
m_GUICH->Wait (); | |||||
m_GUICH->Set ("Number", num); | |||||
m_GUICH->SetData ("Name", (void*)temp); | |||||
m_GUICH->Set ("Max", max); | |||||
m_GUICH->Set ("Value", val); | |||||
m_GUICH->Set ("Min", min); | |||||
m_GUICH->SetCommand (ControllerPlugin::SETALL); | |||||
m_GUICH->Wait(); | |||||
Resize (w()+60, h()); | |||||
} | |||||
} | } | ||||
void ControllerPluginGUI::cb_Add(Fl_Button* o, void* v) | |||||
{ ((ControllerPluginGUI*)(o->parent()->parent()))->cb_Add_i(o,v);} | |||||
inline void ControllerPluginGUI::cb_Delete_i(Fl_Button* o, void* v) { | |||||
if (m_GUIVec.size()>1) { | |||||
DeleteCV(); | |||||
m_GUICH->Set("Number",(int)m_GUIVec.size()); | |||||
m_GUICH->SetCommand(ControllerPlugin::SETNUM); | |||||
m_GUICH->Wait(); | |||||
resize(x(),y(),w()-60,h()); | |||||
} | |||||
void ControllerPluginGUI::cb_Add (Fl_Button* o, void* v) { | |||||
((ControllerPluginGUI*)(o->parent()->parent()))->cb_Add_i (o, v); | |||||
} | } | ||||
void ControllerPluginGUI::cb_Delete(Fl_Button* o, void* v) | |||||
{ ((ControllerPluginGUI*)(o->parent()->parent()))->cb_Delete_i(o,v);} | |||||
inline void ControllerPluginGUI::cb_Delete_i (Fl_Button* o, void* v) { | |||||
if (m_GUIVec.size()>1) { | |||||
DeleteCV(); | |||||
m_GUICH->Set ("Number", (int)m_GUIVec.size()); | |||||
m_GUICH->SetCommand (ControllerPlugin::SETNUM); | |||||
m_GUICH->Wait(); | |||||
Resize (w()-60, h()); | |||||
} | |||||
} | |||||
void ControllerPluginGUI::cb_Delete (Fl_Button* o, void* v) { | |||||
((ControllerPluginGUI*)(o->parent()->parent()))->cb_Delete_i (o, v); | |||||
} | |||||
const string ControllerPluginGUI::GetHelpText(const string &loc){ | |||||
return string("") | |||||
+ "This is a simple plugin to allow you to generate CV values\n" | |||||
+ "interatively with sliders in the plugin window. Useful if you\n" | |||||
+ "can't use Midi, or for controlling LADSPA plugins. The slider\n" | |||||
+ "ranges can be set, and titles can be given to each slider.\n" | |||||
+ "You can add or delete sliders from the plugin using the\n" | |||||
+ "+ or - buttons.\n"; | |||||
} | |||||
/* | |||||
// call for version <3 | // call for version <3 | ||||
istream &operator>>(istream &s, ControllerPluginGUI &o) | istream &operator>>(istream &s, ControllerPluginGUI &o) | ||||
{ | { | ||||
@@ -307,11 +308,11 @@ istream &operator>>(istream &s, ControllerPluginGUI &o) | |||||
o.m_GUIVec[n]->m_Chan->value(Val); | o.m_GUIVec[n]->m_Chan->value(Val); | ||||
} | } | ||||
o.resize(o.x(),o.y(),c*60,o.h()); | |||||
o.resize (o.x(), o.y(), c*60, o.h()); | |||||
return s; | return s; | ||||
} | } | ||||
// call for version >=3 | // call for version >=3 | ||||
// another version of the stream to fix the old style string streaming problem | // another version of the stream to fix the old style string streaming problem | ||||
void ControllerPluginGUI::StreamIn(istream &s) | void ControllerPluginGUI::StreamIn(istream &s) | ||||
@@ -358,13 +359,4 @@ void ControllerPluginGUI::StreamOut(ostream &s) | |||||
s<<(*i)->m_Chan->value()<<endl; | s<<(*i)->m_Chan->value()<<endl; | ||||
} | } | ||||
} | } | ||||
const string ControllerPluginGUI::GetHelpText(const string &loc){ | |||||
return string("") | |||||
+ "This is a simple plugin to allow you to generate CV values\n" | |||||
+ "interatively with sliders in the plugin window. Useful if you\n" | |||||
+ "can't use Midi, or for controlling LADSPA plugins. The slider\n" | |||||
+ "ranges can be set, and titles can be given to each slider.\n" | |||||
+ "You can add or delete sliders from the plugin using the\n" | |||||
+ "+ or - buttons.\n"; | |||||
} | |||||
*/ |
@@ -31,63 +31,47 @@ | |||||
static int Numbers[MAX_CHANNELS]; | static int Numbers[MAX_CHANNELS]; | ||||
class ControllerPluginGUI : public SpiralPluginGUI | |||||
{ | |||||
public: | |||||
ControllerPluginGUI(int w, int h, ControllerPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||||
virtual void UpdateValues(SpiralPlugin *o); | |||||
void StreamIn(std::istream &s); | |||||
void StreamOut(std::ostream &s); | |||||
protected: | |||||
const std::string GetHelpText(const std::string &loc); | |||||
private: | |||||
void Clear(); | |||||
Fl_Color m_GUIColour; | |||||
class CVGUI | |||||
{ | |||||
public: | |||||
CVGUI::CVGUI(int n, ControllerPluginGUI *p, Fl_Color SelColour); | |||||
Fl_Group *m_SliderGroup; | |||||
Fl_Input *m_Title; | |||||
Fl_Input *m_Min; | |||||
Fl_Input *m_Max; | |||||
Fl_Slider *m_Chan; | |||||
}; | |||||
friend class CVGUI; | |||||
Fl_Pack *m_MainPack, *m_Buttons; | |||||
Fl_Button *m_Add, *m_Delete; | |||||
std::vector<CVGUI*> m_GUIVec; | |||||
void AddCV(); | |||||
void DeleteCV(); | |||||
int m_CVCount; | |||||
//// Callbacks //// | |||||
inline void cb_Title_i(Fl_Input* o, void* v); | |||||
static void cb_Title(Fl_Input* o, void* v); | |||||
inline void cb_Max_i(Fl_Input* o, void* v); | |||||
static void cb_Max(Fl_Input* o, void* v); | |||||
inline void cb_Chan_i(Fl_Slider* o, void* v); | |||||
static void cb_Chan(Fl_Slider* o, void* v); | |||||
inline void cb_Min_i(Fl_Input* o, void* v); | |||||
static void cb_Min(Fl_Input* o, void* v); | |||||
inline void cb_Add_i(Fl_Button* o, void* v); | |||||
static void cb_Add(Fl_Button* o, void* v); | |||||
inline void cb_Delete_i(Fl_Button* o, void* v); | |||||
static void cb_Delete(Fl_Button* o, void* v); | |||||
friend std::istream &operator>>(std::istream &s, ControllerPluginGUI &o); | |||||
class ControllerPluginGUI : public SpiralPluginGUI { | |||||
public: | |||||
ControllerPluginGUI(int w, int h, ControllerPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||||
virtual void UpdateValues(SpiralPlugin *o); | |||||
// void StreamIn(std::istream &s); | |||||
// void StreamOut(std::ostream &s); | |||||
protected: | |||||
const std::string GetHelpText(const std::string &loc); | |||||
private: | |||||
void Clear(); | |||||
Fl_Color m_GUIColour; | |||||
class CVGUI { | |||||
public: | |||||
CVGUI::CVGUI(int n, ControllerPluginGUI *p, Fl_Color SelColour); | |||||
Fl_Group *m_SliderGroup; | |||||
Fl_Input *m_Title, *m_Min, *m_Max; | |||||
Fl_Slider *m_Chan; | |||||
}; | |||||
friend class CVGUI; | |||||
Fl_Pack *m_MainPack, *m_Buttons; | |||||
Fl_Button *m_Add, *m_Delete; | |||||
std::vector<CVGUI*> m_GUIVec; | |||||
void AddCV(); | |||||
void DeleteCV(); | |||||
int m_CVCount; | |||||
//// Callbacks //// | |||||
inline void cb_Title_i(Fl_Input* o, void* v); | |||||
static void cb_Title(Fl_Input* o, void* v); | |||||
inline void cb_Max_i(Fl_Input* o, void* v); | |||||
static void cb_Max(Fl_Input* o, void* v); | |||||
inline void cb_Chan_i(Fl_Slider* o, void* v); | |||||
static void cb_Chan(Fl_Slider* o, void* v); | |||||
inline void cb_Min_i(Fl_Input* o, void* v); | |||||
static void cb_Min(Fl_Input* o, void* v); | |||||
inline void cb_Add_i(Fl_Button* o, void* v); | |||||
static void cb_Add(Fl_Button* o, void* v); | |||||
inline void cb_Delete_i(Fl_Button* o, void* v); | |||||
static void cb_Delete(Fl_Button* o, void* v); | |||||
// friend std::istream &operator>>(std::istream &s, ControllerPluginGUI &o); | |||||
}; | }; | ||||
std::istream &operator>>(std::istream &s, ControllerPluginGUI &o); | |||||
// std::istream &operator>>(std::istream &s, ControllerPluginGUI &o); | |||||
#endif | #endif |
@@ -284,8 +284,6 @@ void LADSPAPluginGUI::Update(void) | |||||
m_BSlider->resize(x()+60, y()+15, 50, 20); | m_BSlider->resize(x()+60, y()+15, 50, 20); | ||||
m_BSetup->resize(x() + w() - 55, y()+15, 50, 20); | m_BSetup->resize(x() + w() - 55, y()+15, 50, 20); | ||||
} | } | ||||
// Andy Preston bodged this bit in - might be better somewhere else | |||||
DoResizeCallback (); | |||||
} | } | ||||
// This lot is only done on patch load | // This lot is only done on patch load | ||||
@@ -513,7 +511,7 @@ void LADSPAPluginGUI::SetPage(int index) | |||||
m_SliderGroup->hide(); | m_SliderGroup->hide(); | ||||
m_SetupGroup->show(); | m_SetupGroup->show(); | ||||
resize(x(), y(), 500, 320); | |||||
Resize(500, 320); | |||||
m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | ||||
m_SliderGroup->resize(x()+5, y()+35, w()-10, h()-40); | m_SliderGroup->resize(x()+5, y()+35, w()-10, h()-40); | ||||
@@ -524,8 +522,6 @@ void LADSPAPluginGUI::SetPage(int index) | |||||
m_BKnob->resize(x()+5, y()+15, 50, 20); | m_BKnob->resize(x()+5, y()+15, 50, 20); | ||||
m_BSlider->resize(x()+60, y()+15, 50, 20); | m_BSlider->resize(x()+60, y()+15, 50, 20); | ||||
m_BSetup->resize(x() + w() - 55, y()+15, 50, 20); | m_BSetup->resize(x() + w() - 55, y()+15, 50, 20); | ||||
// Andy Preston bodged this bit in - might be better somewhere else | |||||
DoResizeCallback (); | |||||
} | } | ||||
void LADSPAPluginGUI::SetUniqueID(unsigned long n) | void LADSPAPluginGUI::SetUniqueID(unsigned long n) | ||||
@@ -769,7 +765,7 @@ void LADSPAPluginGUI::UpdateKnobs(void) | |||||
height = 45+rows*80; | height = 45+rows*80; | ||||
width = width < 170 ? 170 : width; | width = width < 170 ? 170 : width; | ||||
} | } | ||||
resize(x(), y(), width, height); | |||||
Resize (width, height); | |||||
// Resize all groups to fit | // Resize all groups to fit | ||||
m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | ||||
@@ -817,8 +813,6 @@ void LADSPAPluginGUI::UpdateKnobs(void) | |||||
m_KnobLabels[p]->hide(); | m_KnobLabels[p]->hide(); | ||||
} | } | ||||
} | } | ||||
// Andy Preston bodged this bit in - might be better somewhere else | |||||
DoResizeCallback (); | |||||
} | } | ||||
// Rearrange sliders depending on connections | // Rearrange sliders depending on connections | ||||
@@ -882,7 +876,7 @@ void LADSPAPluginGUI::UpdateSliders(void) | |||||
height = 45+rows*140; | height = 45+rows*140; | ||||
width = width < 170 ? 170 : width; | width = width < 170 ? 170 : width; | ||||
} | } | ||||
resize(x(), y(), width, height); | |||||
Resize (width, height); | |||||
// Resize all groups to fit | // Resize all groups to fit | ||||
m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40); | ||||
@@ -925,8 +919,6 @@ void LADSPAPluginGUI::UpdateSliders(void) | |||||
m_SliderLabels[p]->hide(); | m_SliderLabels[p]->hide(); | ||||
} | } | ||||
} | } | ||||
// Andy Preston bodged this bit in - might be better somewhere else | |||||
DoResizeCallback (); | |||||
} | } | ||||
// Set value of slider and/or knob (both use the same settings) | // Set value of slider and/or knob (both use the same settings) | ||||
@@ -1152,7 +1144,8 @@ inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o) | |||||
m_GUICH->Wait(); | m_GUICH->Wait(); | ||||
} | } | ||||
SelectPlugin(); | SelectPlugin(); | ||||
DoResizeCallback (); | |||||
// Make sure GUI frame can fit all the ports | |||||
Resize (w(), h()); | |||||
} | } | ||||
void LADSPAPluginGUI::cb_Select(Fl_Choice* o) | void LADSPAPluginGUI::cb_Select(Fl_Choice* o) | ||||
{ // Group GUI | { // Group GUI | ||||
@@ -136,7 +136,7 @@ inline void LogicPluginGUI::cb_Inputs_i (Fl_Counter* o, void* v) { | |||||
m_GUICH->Set ("Inputs", int (o->value ())); | m_GUICH->Set ("Inputs", int (o->value ())); | ||||
m_GUICH->SetCommand (LogicPlugin::SETINPUTS); | m_GUICH->SetCommand (LogicPlugin::SETINPUTS); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
DoResizeCallback (); | |||||
Resize (w(), h()); | |||||
} | } | ||||
} | } | ||||
@@ -96,7 +96,7 @@ m_CurrentNote(0) | |||||
MidiPlugin::~MidiPlugin() | MidiPlugin::~MidiPlugin() | ||||
{ | { | ||||
m_RefCount--; | |||||
m_RefCount--; | |||||
if (m_RefCount==0) MidiDevice::PackUpAndGoHome(); | if (m_RefCount==0) MidiDevice::PackUpAndGoHome(); | ||||
} | } | ||||
@@ -128,17 +128,17 @@ inline void MidiPluginGUI::cb_DeviceNum_i(Fl_Counter* o, void* v) | |||||
m_GUICH->Set("DeviceNum",(int)o->value()-1); | m_GUICH->Set("DeviceNum",(int)o->value()-1); | ||||
} | } | ||||
void MidiPluginGUI::cb_DeviceNum(Fl_Counter* o, void* v) | |||||
void MidiPluginGUI::cb_DeviceNum(Fl_Counter* o, void* v) | |||||
{ ((MidiPluginGUI*)(o->parent()))->cb_DeviceNum_i(o,v);} | { ((MidiPluginGUI*)(o->parent()))->cb_DeviceNum_i(o,v);} | ||||
inline void MidiPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v) | |||||
inline void MidiPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v) | |||||
{ m_GUICH->Set("NoteCut",o->value()); } | { m_GUICH->Set("NoteCut",o->value()); } | ||||
void MidiPluginGUI::cb_NoteCut(Fl_Button* o, void* v) | |||||
void MidiPluginGUI::cb_NoteCut(Fl_Button* o, void* v) | |||||
{ ((MidiPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);} | { ((MidiPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);} | ||||
inline void MidiPluginGUI::cb_ContinuousNotes_i(Fl_Button* o, void* v) | |||||
inline void MidiPluginGUI::cb_ContinuousNotes_i(Fl_Button* o, void* v) | |||||
{ m_GUICH->Set("ContinuousNotes",o->value()); } | { m_GUICH->Set("ContinuousNotes",o->value()); } | ||||
void MidiPluginGUI::cb_ContinuousNotes(Fl_Button* o, void* v) | |||||
void MidiPluginGUI::cb_ContinuousNotes(Fl_Button* o, void* v) | |||||
{ ((MidiPluginGUI*)(o->parent()))->cb_ContinuousNotes_i(o,v);} | { ((MidiPluginGUI*)(o->parent()))->cb_ContinuousNotes_i(o,v);} | ||||
inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | ||||
@@ -148,67 +148,67 @@ inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | |||||
List.push_back("0 Bank Select"); | List.push_back("0 Bank Select"); | ||||
List.push_back("1 Modulation Wheel (coarse)"); | List.push_back("1 Modulation Wheel (coarse)"); | ||||
List.push_back("2 Breath controller (coarse)"); | List.push_back("2 Breath controller (coarse)"); | ||||
List.push_back("3 None"); | |||||
List.push_back("3 None"); | |||||
List.push_back("4 Foot Pedal (coarse)"); | List.push_back("4 Foot Pedal (coarse)"); | ||||
List.push_back("5 Portamento Time (coarse)"); | List.push_back("5 Portamento Time (coarse)"); | ||||
List.push_back("6 Data Entry (coarse)"); | List.push_back("6 Data Entry (coarse)"); | ||||
List.push_back("7 Volume (coarse)"); | List.push_back("7 Volume (coarse)"); | ||||
List.push_back("8 Balance (coarse)"); | List.push_back("8 Balance (coarse)"); | ||||
List.push_back("9 None"); | |||||
List.push_back("9 None"); | |||||
List.push_back("10 Pan position (coarse)"); | List.push_back("10 Pan position (coarse)"); | ||||
List.push_back("11 Expression (coarse)"); | List.push_back("11 Expression (coarse)"); | ||||
List.push_back("12 Effect Control 1 (coarse)"); | List.push_back("12 Effect Control 1 (coarse)"); | ||||
List.push_back("13 Effect Control 2 (coarse)"); | List.push_back("13 Effect Control 2 (coarse)"); | ||||
List.push_back("14 None"); | |||||
List.push_back("15 None"); | |||||
List.push_back("14 None"); | |||||
List.push_back("15 None"); | |||||
List.push_back("16 General Purpose Slider 1"); | List.push_back("16 General Purpose Slider 1"); | ||||
List.push_back("17 General Purpose Slider 2"); | List.push_back("17 General Purpose Slider 2"); | ||||
List.push_back("18 General Purpose Slider 3"); | List.push_back("18 General Purpose Slider 3"); | ||||
List.push_back("19 General Purpose Slider 4"); | List.push_back("19 General Purpose Slider 4"); | ||||
List.push_back("20 None"); | |||||
List.push_back("21 None"); | |||||
List.push_back("22 None"); | |||||
List.push_back("23 None"); | |||||
List.push_back("24 None"); | |||||
List.push_back("25 None"); | |||||
List.push_back("26 None"); | |||||
List.push_back("27 None"); | |||||
List.push_back("28 None"); | |||||
List.push_back("29 None"); | |||||
List.push_back("30 None"); | |||||
List.push_back("31 None"); | |||||
List.push_back("20 None"); | |||||
List.push_back("21 None"); | |||||
List.push_back("22 None"); | |||||
List.push_back("23 None"); | |||||
List.push_back("24 None"); | |||||
List.push_back("25 None"); | |||||
List.push_back("26 None"); | |||||
List.push_back("27 None"); | |||||
List.push_back("28 None"); | |||||
List.push_back("29 None"); | |||||
List.push_back("30 None"); | |||||
List.push_back("31 None"); | |||||
List.push_back("32 Bank Select (fine)"); | List.push_back("32 Bank Select (fine)"); | ||||
List.push_back("33 Modulation Wheel (fine)"); | List.push_back("33 Modulation Wheel (fine)"); | ||||
List.push_back("34 Breath controller (fine)"); | List.push_back("34 Breath controller (fine)"); | ||||
List.push_back("35 None"); | |||||
List.push_back("35 None"); | |||||
List.push_back("36 Foot Pedal (fine)"); | List.push_back("36 Foot Pedal (fine)"); | ||||
List.push_back("37 Portamento Time (fine)"); | List.push_back("37 Portamento Time (fine)"); | ||||
List.push_back("38 Data Entry (fine)"); | List.push_back("38 Data Entry (fine)"); | ||||
List.push_back("39 Volume (fine)"); | List.push_back("39 Volume (fine)"); | ||||
List.push_back("40 Balance (fine)"); | List.push_back("40 Balance (fine)"); | ||||
List.push_back("41 None"); | |||||
List.push_back("41 None"); | |||||
List.push_back("42 Pan position (fine)"); | List.push_back("42 Pan position (fine)"); | ||||
List.push_back("43 Expression (fine)"); | List.push_back("43 Expression (fine)"); | ||||
List.push_back("44 Effect Control 1 (fine)"); | List.push_back("44 Effect Control 1 (fine)"); | ||||
List.push_back("45 Effect Control 2 (fine)"); | List.push_back("45 Effect Control 2 (fine)"); | ||||
List.push_back("46 None"); | |||||
List.push_back("47 None"); | |||||
List.push_back("48 None"); | |||||
List.push_back("49 None"); | |||||
List.push_back("50 None"); | |||||
List.push_back("51 None"); | |||||
List.push_back("52 None"); | |||||
List.push_back("53 None"); | |||||
List.push_back("54 None"); | |||||
List.push_back("55 None"); | |||||
List.push_back("56 None"); | |||||
List.push_back("57 None"); | |||||
List.push_back("58 None"); | |||||
List.push_back("59 None"); | |||||
List.push_back("60 None"); | |||||
List.push_back("61 None"); | |||||
List.push_back("62 None"); | |||||
List.push_back("63 None"); | |||||
List.push_back("46 None"); | |||||
List.push_back("47 None"); | |||||
List.push_back("48 None"); | |||||
List.push_back("49 None"); | |||||
List.push_back("50 None"); | |||||
List.push_back("51 None"); | |||||
List.push_back("52 None"); | |||||
List.push_back("53 None"); | |||||
List.push_back("54 None"); | |||||
List.push_back("55 None"); | |||||
List.push_back("56 None"); | |||||
List.push_back("57 None"); | |||||
List.push_back("58 None"); | |||||
List.push_back("59 None"); | |||||
List.push_back("60 None"); | |||||
List.push_back("61 None"); | |||||
List.push_back("62 None"); | |||||
List.push_back("63 None"); | |||||
List.push_back("64 Hold Pedal (on/off)"); | List.push_back("64 Hold Pedal (on/off)"); | ||||
List.push_back("65 Portamento (on/off)"); | List.push_back("65 Portamento (on/off)"); | ||||
List.push_back("66 Sustenuto Pedal (on/off)"); | List.push_back("66 Sustenuto Pedal (on/off)"); | ||||
@@ -229,13 +229,13 @@ inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | |||||
List.push_back("81 General Purpose Button 2 (on/off)"); | List.push_back("81 General Purpose Button 2 (on/off)"); | ||||
List.push_back("82 General Purpose Button 3 (on/off)"); | List.push_back("82 General Purpose Button 3 (on/off)"); | ||||
List.push_back("83 General Purpose Button 4 (on/off)"); | List.push_back("83 General Purpose Button 4 (on/off)"); | ||||
List.push_back("84 None"); | |||||
List.push_back("85 None"); | |||||
List.push_back("86 None"); | |||||
List.push_back("87 None"); | |||||
List.push_back("88 None"); | |||||
List.push_back("89 None"); | |||||
List.push_back("90 None"); | |||||
List.push_back("84 None"); | |||||
List.push_back("85 None"); | |||||
List.push_back("86 None"); | |||||
List.push_back("87 None"); | |||||
List.push_back("88 None"); | |||||
List.push_back("89 None"); | |||||
List.push_back("90 None"); | |||||
List.push_back("91 Effects Level"); | List.push_back("91 Effects Level"); | ||||
List.push_back("92 Tremulo Level"); | List.push_back("92 Tremulo Level"); | ||||
List.push_back("93 Chorus Level"); | List.push_back("93 Chorus Level"); | ||||
@@ -247,11 +247,11 @@ inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | |||||
List.push_back("99 Non-registered Parameter (coarse)"); | List.push_back("99 Non-registered Parameter (coarse)"); | ||||
List.push_back("100 Registered Parameter (fine)"); | List.push_back("100 Registered Parameter (fine)"); | ||||
List.push_back("101 Registered Parameter (coarse)"); | List.push_back("101 Registered Parameter (coarse)"); | ||||
List.push_back("102 None"); | |||||
List.push_back("103 None"); | |||||
List.push_back("104 None"); | |||||
List.push_back("105 None"); | |||||
List.push_back("106 None"); | |||||
List.push_back("102 None"); | |||||
List.push_back("103 None"); | |||||
List.push_back("104 None"); | |||||
List.push_back("105 None"); | |||||
List.push_back("106 None"); | |||||
List.push_back("107 None"); | List.push_back("107 None"); | ||||
List.push_back("108 None"); | List.push_back("108 None"); | ||||
List.push_back("109 None"); | List.push_back("109 None"); | ||||
@@ -283,21 +283,26 @@ inline void MidiPluginGUI::cb_AddControl_i(Fl_Button* o, void* v) | |||||
m_GUICH->SetData("Name",Temp); | m_GUICH->SetData("Name",Temp); | ||||
m_GUICH->SetCommand(MidiPlugin::ADDCONTROL); | m_GUICH->SetCommand(MidiPlugin::ADDCONTROL); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
DoResizeCallback (); | |||||
// Make sure GUI frame can show all the ports | |||||
Resize (w(), h()); | |||||
//m_Plugin->AddControl(c,List[c]); | //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_GUICH->SetCommand(MidiPlugin::DELCONTROL); | |||||
m_GUICH->Wait (); | |||||
DoResizeCallback (); | |||||
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_GUICH->SetCommand(MidiPlugin::DELCONTROL); | |||||
m_GUICH->Wait (); | |||||
// Make sure GUI frame can show all the ports | |||||
Resize (w(), h()); | |||||
} | |||||
void MidiPluginGUI::cb_RemoveControl (Fl_Button* o, void* v) { | |||||
((MidiPluginGUI*)(o->parent()))->cb_RemoveControl_i (o, v); | |||||
} | } | ||||
void MidiPluginGUI::cb_RemoveControl(Fl_Button* o, void* v) | |||||
{ ((MidiPluginGUI*)(o->parent()))->cb_RemoveControl_i(o,v);} | |||||
const string MidiPluginGUI::GetHelpText(const string &loc){ | const string MidiPluginGUI::GetHelpText(const string &loc){ | ||||
return string("") | return string("") | ||||
@@ -59,7 +59,7 @@ inline void MixSwitchPluginGUI::cb_Chans_i (Fl_Counter* o, void* v) { | |||||
m_GUICH->Set ("Chans", int (o->value ())); | m_GUICH->Set ("Chans", int (o->value ())); | ||||
m_GUICH->SetCommand (MixSwitchPlugin::SETCHANS); | m_GUICH->SetCommand (MixSwitchPlugin::SETCHANS); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
DoResizeCallback (); | |||||
Resize (w(), h()); | |||||
} | } | ||||
} | } | ||||
@@ -83,9 +83,7 @@ void MixerPluginGUI::AddChan (bool SendData, bool ResizeIt) { | |||||
m_GUICH->SetCommand(MixerPlugin::SETCH); | m_GUICH->SetCommand(MixerPlugin::SETCH); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
} | } | ||||
if (ResizeIt && num > 3) { | |||||
resize (x(), y(), w()+20, h()); | |||||
} | |||||
if (ResizeIt && num > 3) Resize (w()+20, h()); | |||||
} | } | ||||
void MixerPluginGUI::DeleteChan (bool SendData) { | void MixerPluginGUI::DeleteChan (bool SendData) { | ||||
@@ -100,9 +98,7 @@ void MixerPluginGUI::DeleteChan (bool SendData) { | |||||
m_GUICH->SetCommand (MixerPlugin::SETNUM); | m_GUICH->SetCommand (MixerPlugin::SETNUM); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
} | } | ||||
if (num > 2) { | |||||
resize (x(), y(), w()-20, h()); | |||||
} | |||||
if (num > 2) Resize (w()-20, h()); | |||||
} | } | ||||
void MixerPluginGUI::UpdateValues(SpiralPlugin *o) { | void MixerPluginGUI::UpdateValues(SpiralPlugin *o) { | ||||
@@ -63,10 +63,10 @@ SpiralPluginGUI::~SpiralPluginGUI() | |||||
Fl::check(); | Fl::check(); | ||||
} | } | ||||
void SpiralPluginGUI::resize (int newx, int newy, int neww, int newh) { | |||||
void SpiralPluginGUI::Resize (int neww, int newh) { | |||||
resize (x(), y(), neww, newh); | |||||
m_Help->position (x()+neww-11, y()+2); | m_Help->position (x()+neww-11, y()+2); | ||||
SpiralGUIType::resize (newx, newy, neww, newh); | |||||
//DoResizeCallback (); | |||||
DoResizeCallback (); | |||||
} | } | ||||
void SpiralPluginGUI::Update() | void SpiralPluginGUI::Update() | ||||
@@ -32,10 +32,9 @@ class SpiralPluginGUI : public SpiralGUIType { | |||||
public: | public: | ||||
SpiralPluginGUI (int w, int h, SpiralPlugin* o, ChannelHandler *ch); | SpiralPluginGUI (int w, int h, SpiralPlugin* o, ChannelHandler *ch); | ||||
~SpiralPluginGUI (); | ~SpiralPluginGUI (); | ||||
virtual void resize (int x, int y, int w, int h); | |||||
void Resize (int neww, int newh); | |||||
virtual void Update (); | virtual void Update (); | ||||
// called while audio thread is suspended, so direct access to the | |||||
// spiralplugin is acceptable | |||||
// called while audio thread is suspended, so direct access to the spiralplugin is acceptable | |||||
virtual void UpdateValues (SpiralPlugin *o) = 0; | virtual void UpdateValues (SpiralPlugin *o) = 0; | ||||
protected: | protected: | ||||
ChannelHandler *m_GUICH; | ChannelHandler *m_GUICH; | ||||
@@ -59,7 +59,7 @@ inline void SplitSwitchPluginGUI::cb_Chans_i (Fl_Counter* o, void* v) { | |||||
m_GUICH->Set ("Chans", int (o->value ())); | m_GUICH->Set ("Chans", int (o->value ())); | ||||
m_GUICH->SetCommand (SplitSwitchPlugin::SETCHANS); | m_GUICH->SetCommand (SplitSwitchPlugin::SETCHANS); | ||||
m_GUICH->Wait (); | m_GUICH->Wait (); | ||||
DoResizeCallback (); | |||||
Resize (w(), h()); | |||||
} | } | ||||
} | } | ||||