Browse Source

midi plugin segfault fix - Plugin GUI resizing bug fix

master
edgeeffect 20 years ago
parent
commit
486efa5215
16 changed files with 408 additions and 439 deletions
  1. BIN
      GUI/SSM.xcf
  2. +3
    -4
      GUI/Widgets/Fl_DeviceGUI.C
  3. +2
    -2
      GUI/Widgets/SpiralGUI.H
  4. +155
    -157
      SpiralSound/Midi.C
  5. +31
    -28
      SpiralSound/Midi.h
  6. +93
    -101
      SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.C
  7. +40
    -56
      SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.h
  8. +5
    -12
      SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C
  9. +1
    -1
      SpiralSound/Plugins/LogicPlugin/LogicPluginGUI.C
  10. +1
    -1
      SpiralSound/Plugins/MidiPlugin/MidiPlugin.C
  11. +68
    -63
      SpiralSound/Plugins/MidiPlugin/MidiPluginGUI.C
  12. +1
    -1
      SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.C
  13. +2
    -6
      SpiralSound/Plugins/MixerPlugin/MixerPluginGUI.C
  14. +3
    -3
      SpiralSound/Plugins/SpiralPluginGUI.C
  15. +2
    -3
      SpiralSound/Plugins/SpiralPluginGUI.h
  16. +1
    -1
      SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPluginGUI.C

BIN
GUI/SSM.xcf View File


+ 3
- 4
GUI/Widgets/Fl_DeviceGUI.C View File

@@ -105,7 +105,7 @@ m_Minimised (true)
if (m_PluginWindow) {
m_PluginWindow->hide();
add (m_PluginWindow);
m_PluginWindow->ResizeCallback (&cb_Resize, this);
m_PluginWindow->SetResizeCallback (&cb_Resize, this);
}
resizable(NULL);
//Add the input/output ports
@@ -154,15 +154,13 @@ void Fl_DeviceGUI::ResizeToPluginWindow (void) {
void Fl_DeviceGUI::Minimise() {
m_Minimised = true;
Resize (m_MiniWidth, m_MiniHeight);
parent()->redraw();
}

void Fl_DeviceGUI::Maximise() {
m_Minimised=false;
ResizeToPluginWindow();
m_PluginWindow->show();
m_IconButton->hide();
parent()->redraw();
ResizeToPluginWindow();
((Fl_Canvas*)parent())->ToTop(this);
}

@@ -178,6 +176,7 @@ void Fl_DeviceGUI::Resize (int width, int height) {
int Centx = x()+w()/2;
int Centy = y()+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)


+ 2
- 2
GUI/Widgets/SpiralGUI.H View File

@@ -21,14 +21,14 @@
#include <FL/Fl_Group.H>

class Fl_DeviceGUI;
class SpiralGUIType;
typedef void (SpiralGUISizeCB)(Fl_DeviceGUI *o);

class SpiralGUIType : public Fl_Group {
public:
SpiralGUIType (int x, int y, int w, int h, const char *label = 0);
~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:
void DoResizeCallback (void) { if (m_ResizeSpiralGUI) m_ResizeSpiralGUI(m_DeviceGUI); }
private:


+ 155
- 157
SpiralSound/Midi.C View File

@@ -14,7 +14,7 @@
* 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 "Midi.h"
#include "unistd.h"
@@ -25,7 +25,7 @@
static const int MIDI_SCANBUFSIZE=256;
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_ON = 0x90;
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 int NKEYS = 30;
MidiDevice *MidiDevice::m_Singleton;
string MidiDevice::m_AppName;

#ifdef OSS_MIDI
string MidiDevice::m_DeviceName;
string MidiDevice::m_AppName;
#endif

#if __APPLE__
#define read AppleRead
#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_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
snd_seq_close (seq_handle);
#else
Close();
seq_handle=AlsaOpen(t);
#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__
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 // !__APPLE__
m_Mutex = new pthread_mutex_t;
pthread_mutex_init(m_Mutex, NULL);
#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
}


// 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
MidiEvent MidiDevice::GetEvent(int Device)
{
@@ -146,7 +112,7 @@ MidiEvent MidiDevice::GetEvent(int Device)
pthread_mutex_unlock(m_Mutex);
return MidiEvent(MidiEvent::NONE,0,0);
}
MidiEvent event(m_EventVec[Device].front());
m_EventVec[Device].pop();
pthread_mutex_unlock(m_Mutex);
@@ -154,8 +120,7 @@ MidiEvent MidiDevice::GetEvent(int Device)
return event;
}

void MidiDevice::SendEvent(int Device,const MidiEvent &Event)
{
void MidiDevice::SendEvent (int Device, const MidiEvent &Event) {
#ifdef ALSA_MIDI
snd_seq_event_t ev;
snd_seq_ev_clear (&ev);
@@ -188,58 +153,82 @@ void MidiDevice::SendEvent(int Device,const MidiEvent &Event)
}

char message[3];
message[1]=Event.GetNote()+MIDI_KEYOFFSET;
message[2]=(char)Event.GetVolume();
if (Event.GetType()==MidiEvent::ON)
{
message[0]=STATUS_NOTE_ON+Device;
write(m_MidiWrFd,message,3);
//cerr<<"sending "<<message<<endl;
}
if (Event.GetType()==MidiEvent::OFF)
{
message[0]=STATUS_NOTE_OFF+Device;
write(m_MidiWrFd,message,3);
write(m_MidiWrFd,message,3);
//cerr<<"sending "<<message<<endl;
}
#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
void MidiDevice::ReadByte(unsigned char *c)
void MidiDevice::OssReadByte(unsigned char *c)
{
*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
void MidiDevice::CollectEvents()
{
unsigned char buf[1];

void MidiDevice::OssCollectEvents()
{
unsigned char buf[1];
int count,n,nn;
bool MessageSent;
unsigned char data[3],last=0;
// constantly scan for relevent input,
// 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
bool InSysex=false;
for(;;)
{
ReadByte(buf);
if (*buf==MIDI_CLOCK)
OssReadByte(buf);
if (*buf==MIDI_CLOCK)
{
m_ClockCount++;
if (m_ClockCount==6)
@@ -250,65 +239,65 @@ void MidiDevice::CollectEvents()
}
else
if (*buf>=STATUS_START) // we've got a status byte
{
{
if (*buf==SYSEX_TERMINATOR) InSysex=false;

// find out if it's an opcode
if(*buf>=STATUS_START && *buf<=STATUS_END)
{
if(*buf>=STATUS_START && *buf<=STATUS_END)
{
InSysex=false;
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;
}
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
{
{
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[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
}
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
void MidiDevice::AddEvent(unsigned char* midi)
{
void MidiDevice::OssAddEvent(unsigned char* midi)
{
MidiEvent::type MessageType=MidiEvent::NONE;
int Volume=0,Note=0,EventDevice=0;
int Volume=0,Note=0,EventDevice=0;
// 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;
Note=midi[1]-MIDI_KEYOFFSET;
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)
{
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.
if (Volume) MessageType=MidiEvent::ON;
else MessageType=MidiEvent::OFF;
@@ -328,15 +317,15 @@ void MidiDevice::AddEvent(unsigned char* midi)
}
// aftertouch
else if (midi[0] >= STATUS_AFTERTOUCH && midi[0] < STATUS_CONTROL_CHANGE)
{
{
MessageType=MidiEvent::AFTERTOUCH;
Note=midi[1]-MIDI_KEYOFFSET;
Volume=midi[2];
Note=midi[1]-MIDI_KEYOFFSET;
Volume=midi[2];
EventDevice=midi[0]-STATUS_AFTERTOUCH;
}
// parameter
else if (midi[0] >= STATUS_CONTROL_CHANGE && midi[0] < STATUS_PROG_CHANGE)
{
{
MessageType=MidiEvent::PARAMETER;
Note=midi[1];
Volume=midi[2];
@@ -344,20 +333,20 @@ void MidiDevice::AddEvent(unsigned char* midi)
}
// channel pressure
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;
}
// note pitchbend
else if (midi[0] >= STATUS_PITCH_WHEEL && midi[0] < STATUS_END)
{
{
MessageType=MidiEvent::PITCHBEND;
// should probably take the first byte into account too?
Volume=midi[2];
Volume=midi[2];
EventDevice=midi[0]-STATUS_PITCH_WHEEL;
}
if (EventDevice<0 || EventDevice>15)
{
cerr<<"Error - Midi device "<<EventDevice<<" ??"<<endl;
@@ -369,43 +358,50 @@ void MidiDevice::AddEvent(unsigned char* midi)
pthread_mutex_unlock(m_Mutex);
}

///////////////////////////////////////////////////////////////////////////////
#endif

//////////////////////////////////////////// Alsa Code Only ////////////////////////////////////////

#ifdef ALSA_MIDI

// 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;
struct pollfd *pfds;
seq_nfds = snd_seq_poll_descriptors_count(seq_handle, POLLIN);
pfds = (struct pollfd *)alloca(sizeof(struct pollfd) * seq_nfds);
snd_seq_poll_descriptors(seq_handle, pfds, seq_nfds, POLLIN);
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)
{
{
snd_seq_event_t *ev;
int l1;
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);

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) {
case SND_SEQ_EVENT_PITCHBEND:
MessageType=MidiEvent::CHANNELPRESSURE;
MessageType=MidiEvent::CHANNELPRESSURE;
Volume = (char)((ev->data.control.value / 8192.0)*256);
break;
case SND_SEQ_EVENT_CONTROLLER:
@@ -418,17 +414,17 @@ void MidiDevice::AlsaCollectEvents()
EventDevice = ev->data.control.channel;
Note = ev->data.note.note;
Volume = ev->data.note.velocity;
break;
break;
case SND_SEQ_EVENT_NOTEOFF:
MessageType=MidiEvent::ON;
EventDevice = ev->data.control.channel;
Note = ev->data.note.note;
break;
break;
}
pthread_mutex_lock(m_Mutex);
m_EventVec[EventDevice].push(MidiEvent(MessageType,Note,Volume));
pthread_mutex_unlock(m_Mutex);
snd_seq_free_event(ev);
} 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;
int client_id, port_id;
if (t==WRITE)
{
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

//////////////////////////////////////////// Apple Code Only /////////////////////////////////////////

#if __APPLE__

void MidiDevice::AppleOpen()
{
m_ReadFillIndex = m_ReadReadIndex = 0;
OSStatus err = 0;

mMIDISource = NULL;
mMIDIClient = NULL;
mMIDIDestination = NULL;
err = MIDIClientCreate(CFSTR("org.pawpal.ssm"), NULL, NULL, &mMIDIClient);
if (err) printf("MIDIClientCreate failed returned %d\n", err);
if (!err) {
err = MIDISourceCreate(mMIDIClient, CFSTR("SpiralSynth"), &mMIDISource);
if (err) printf("MIDIInputPortCreate failed returned %d\n", err);
}
if (!err) {
err = MIDIDestinationCreate(mMIDIClient, CFSTR("SpiralSynth"), sMIDIRead, this, &mMIDIDestination);
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)
{
MidiDevice & t = *((MidiDevice*)readProcRefCon);
const MIDIPacket *packet = &pktlist->packet[0];
for (int i = 0; i < (int)pktlist->numPackets; i++) {
const MIDIPacket & p = *packet;


+ 31
- 28
SpiralSound/Midi.h View File

@@ -30,7 +30,10 @@

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 OSS_MIDI

#ifdef ALSA_MIDI
#include <alsa/asoundlib.h>
@@ -46,9 +49,9 @@ public:
enum type{NONE,ON,OFF,AFTERTOUCH,PARAMETER,CHANNELPRESSURE,PITCHBEND};

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;}
type GetType() const {return m_Type;}
float GetVolume() const {return m_Volume;}
int GetNote() const {return m_Note;}
@@ -66,9 +69,13 @@ public:
enum Type{READ,WRITE};

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);
void SendEvent(int Device,const MidiEvent &Event);
@@ -76,47 +83,43 @@ public:
void SetPoly(int s) { m_Poly=s; }

float GetClock() { return m_Clock; }
private:
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;
float m_Clock;
int m_ClockCount;

queue<MidiEvent> m_EventVec[16];

static MidiDevice *m_Singleton;

pthread_t m_MidiReader;
pthread_mutex_t* m_Mutex;
static string m_AppName;

static string m_AppName;
#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 AlsaClose ();
snd_seq_t *seq_handle;
snd_seq_t *AlsaOpen(Type t);
#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__
MIDIClientRef mMIDIClient;
MIDIEndpointRef mMIDISource;
MIDIEndpointRef mMIDIDestination;
#define midi_ReadSize 4096
unsigned char m_ReadBuffer[midi_ReadSize];
volatile int m_ReadFillIndex;
@@ -126,10 +129,10 @@ private:
void MidiDevice::AppleClose();
int MidiDevice::AppleWrite(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);

#endif
#endif
};

#endif

+ 93
- 101
SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.C View File

@@ -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)
{
int num=*(int*)(v);

char temp[256];
sprintf(temp,"%s",m_GUIVec[num]->m_Title->value());
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)
{ ((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
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.resize(o.x(),o.y(),c*60,o.h());

o.resize (o.x(), o.y(), c*60, o.h());
return s;
}


// call for version >=3
// another version of the stream to fix the old style string streaming problem
void ControllerPluginGUI::StreamIn(istream &s)
@@ -358,13 +359,4 @@ void ControllerPluginGUI::StreamOut(ostream &s)
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";
}
*/

+ 40
- 56
SpiralSound/Plugins/ControllerPlugin/ControllerPluginGUI.h View File

@@ -31,63 +31,47 @@

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

+ 5
- 12
SpiralSound/Plugins/LADSPAPlugin/LADSPAPluginGUI.C View File

@@ -284,8 +284,6 @@ void LADSPAPluginGUI::Update(void)
m_BSlider->resize(x()+60, 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
@@ -513,7 +511,7 @@ void LADSPAPluginGUI::SetPage(int index)
m_SliderGroup->hide();
m_SetupGroup->show();

resize(x(), y(), 500, 320);
Resize(500, 320);

m_KnobGroup->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_BSlider->resize(x()+60, 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)
@@ -769,7 +765,7 @@ void LADSPAPluginGUI::UpdateKnobs(void)
height = 45+rows*80;
width = width < 170 ? 170 : width;
}
resize(x(), y(), width, height);
Resize (width, height);

// Resize all groups to fit
m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40);
@@ -817,8 +813,6 @@ void LADSPAPluginGUI::UpdateKnobs(void)
m_KnobLabels[p]->hide();
}
}
// Andy Preston bodged this bit in - might be better somewhere else
DoResizeCallback ();
}

// Rearrange sliders depending on connections
@@ -882,7 +876,7 @@ void LADSPAPluginGUI::UpdateSliders(void)
height = 45+rows*140;
width = width < 170 ? 170 : width;
}
resize(x(), y(), width, height);
Resize (width, height);

// Resize all groups to fit
m_KnobGroup->resize(x()+5, y()+35, w()-10, h()-40);
@@ -925,8 +919,6 @@ void LADSPAPluginGUI::UpdateSliders(void)
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)
@@ -1152,7 +1144,8 @@ inline void LADSPAPluginGUI::cb_Select_i(Fl_Choice* o)
m_GUICH->Wait();
}
SelectPlugin();
DoResizeCallback ();
// Make sure GUI frame can fit all the ports
Resize (w(), h());
}
void LADSPAPluginGUI::cb_Select(Fl_Choice* o)
{ // Group GUI


+ 1
- 1
SpiralSound/Plugins/LogicPlugin/LogicPluginGUI.C View File

@@ -136,7 +136,7 @@ inline void LogicPluginGUI::cb_Inputs_i (Fl_Counter* o, void* v) {
m_GUICH->Set ("Inputs", int (o->value ()));
m_GUICH->SetCommand (LogicPlugin::SETINPUTS);
m_GUICH->Wait ();
DoResizeCallback ();
Resize (w(), h());
}
}



+ 1
- 1
SpiralSound/Plugins/MidiPlugin/MidiPlugin.C View File

@@ -96,7 +96,7 @@ m_CurrentNote(0)

MidiPlugin::~MidiPlugin()
{
m_RefCount--;
m_RefCount--;
if (m_RefCount==0) MidiDevice::PackUpAndGoHome();
}



+ 68
- 63
SpiralSound/Plugins/MidiPlugin/MidiPluginGUI.C View File

@@ -128,17 +128,17 @@ inline void MidiPluginGUI::cb_DeviceNum_i(Fl_Counter* o, void* v)
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);}

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()); }
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);}

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()); }
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);}

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("1 Modulation Wheel (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("5 Portamento Time (coarse)");
List.push_back("6 Data Entry (coarse)");
List.push_back("7 Volume (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("11 Expression (coarse)");
List.push_back("12 Effect Control 1 (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("17 General Purpose Slider 2");
List.push_back("18 General Purpose Slider 3");
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("33 Modulation Wheel (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("37 Portamento Time (fine)");
List.push_back("38 Data Entry (fine)");
List.push_back("39 Volume (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("43 Expression (fine)");
List.push_back("44 Effect Control 1 (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("65 Portamento (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("82 General Purpose Button 3 (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("92 Tremulo 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("100 Registered Parameter (fine)");
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("108 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->SetCommand(MidiPlugin::ADDCONTROL);
m_GUICH->Wait ();
DoResizeCallback ();
// Make sure GUI frame can show all the ports
Resize (w(), h());
//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){
return string("")


+ 1
- 1
SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.C View File

@@ -59,7 +59,7 @@ inline void MixSwitchPluginGUI::cb_Chans_i (Fl_Counter* o, void* v) {
m_GUICH->Set ("Chans", int (o->value ()));
m_GUICH->SetCommand (MixSwitchPlugin::SETCHANS);
m_GUICH->Wait ();
DoResizeCallback ();
Resize (w(), h());
}
}



+ 2
- 6
SpiralSound/Plugins/MixerPlugin/MixerPluginGUI.C View File

@@ -83,9 +83,7 @@ void MixerPluginGUI::AddChan (bool SendData, bool ResizeIt) {
m_GUICH->SetCommand(MixerPlugin::SETCH);
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) {
@@ -100,9 +98,7 @@ void MixerPluginGUI::DeleteChan (bool SendData) {
m_GUICH->SetCommand (MixerPlugin::SETNUM);
m_GUICH->Wait ();
}
if (num > 2) {
resize (x(), y(), w()-20, h());
}
if (num > 2) Resize (w()-20, h());
}

void MixerPluginGUI::UpdateValues(SpiralPlugin *o) {


+ 3
- 3
SpiralSound/Plugins/SpiralPluginGUI.C View File

@@ -63,10 +63,10 @@ SpiralPluginGUI::~SpiralPluginGUI()
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);
SpiralGUIType::resize (newx, newy, neww, newh);
//DoResizeCallback ();
DoResizeCallback ();
}

void SpiralPluginGUI::Update()


+ 2
- 3
SpiralSound/Plugins/SpiralPluginGUI.h View File

@@ -32,10 +32,9 @@ class SpiralPluginGUI : public SpiralGUIType {
public:
SpiralPluginGUI (int w, int h, SpiralPlugin* o, ChannelHandler *ch);
~SpiralPluginGUI ();
virtual void resize (int x, int y, int w, int h);
void Resize (int neww, int newh);
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;
protected:
ChannelHandler *m_GUICH;


+ 1
- 1
SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPluginGUI.C View File

@@ -59,7 +59,7 @@ inline void SplitSwitchPluginGUI::cb_Chans_i (Fl_Counter* o, void* v) {
m_GUICH->Set ("Chans", int (o->value ()));
m_GUICH->SetCommand (SplitSwitchPlugin::SETCHANS);
m_GUICH->Wait ();
DoResizeCallback ();
Resize (w(), h());
}
}



Loading…
Cancel
Save