-Working on Jack quit code, cleanup, virtual destructors etc

This commit is contained in:
Harry van Haaren 2013-09-20 23:28:59 +01:00
parent fedf1925c1
commit 32b952800a
10 changed files with 146 additions and 9 deletions

View file

@ -78,6 +78,8 @@ namespace Event
LOOPER_REQUEST_BUFFER,
DEALLOCATE_BUFFER,
QUIT,
};
};
@ -94,6 +96,14 @@ class EventBase
virtual uint32_t size() = 0;
};
class EventQuit : public EventBase
{
public:
int type() { return int(QUIT); }
uint32_t size() { return sizeof(EventQuit); }
EventQuit(){}
};
class EventMasterInputTo : public EventBase
{
public:

View file

@ -34,6 +34,14 @@ void handleDspEvents()
{
switch ( e->type() )
{
case Event::QUIT: {
if ( availableRead >= sizeof(EventQuit) ) {
EventQuit ev;
jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventQuit) );
jack->quit();
} break; }
// ========= SAVE =====
case Event::STATE_SAVE: {
if ( availableRead >= sizeof(EventStateSave) ) {
EventStateSave ev;

View file

@ -39,6 +39,7 @@ class GridLogic : public TimeObserver
};
GridLogic();
~GridLogic(){};
/// button press / click event
void pressed( int track, int scene );

View file

@ -6,6 +6,8 @@ static void gtrack_vol_cb(Fl_Widget *w, void *data);
static void gtrack_side_cb(Fl_Widget *w, void *data);
static void gtrack_post_cb(Fl_Widget *w, void *data);
static void gtrack_reverb_cb(Fl_Widget *w, void *data);
static void gtrack_active_cb(Fl_Widget *w, void *data);
static void gtrack_record_cb(Fl_Widget *w, void *data);
GTrack::GTrack(int x, int y, int w, int h, const char* l ) :
@ -26,7 +28,6 @@ GTrack::GTrack(int x, int y, int w, int h, const char* l ) :
side (x+11, y +430 + 101, 50, 25, "Key"),
recEnable(x+11, y +430 + 132, 50, 25, "Rec") // record
{
ID = privateID++;
@ -36,7 +37,9 @@ GTrack::GTrack(int x, int y, int w, int h, const char* l ) :
side.setColor( 0, 0.6, 1 );
active.setColor( 0, 1.0, 0.0 );
active.callback( gtrack_active_cb, this );
recEnable.setColor( 1, 0.0, 0.0 );
recEnable.callback( gtrack_record_cb, this );
rev.callback( gtrack_reverb_cb, this );
post.callback( gtrack_post_cb, this );
@ -64,11 +67,7 @@ void gtrack_reverb_cb(Fl_Widget *w, void *data)
void gtrack_side_cb(Fl_Widget *w, void *data)
{
GTrack* track = (GTrack*) data;
Avtk::LightButton* d = (Avtk::LightButton*)w;
//d->value( d->value() );
bool b = d->value();
if ( b < 0.5 )
{
@ -80,10 +79,7 @@ void gtrack_side_cb(Fl_Widget *w, void *data)
EventTrackSend e( track->ID, SEND_SIDE, 0.0f );
writeToDspRingbuffer( &e );
}
printf("track %i post send %s\n", track->ID, b ? "true" : "false" );
}
@ -101,3 +97,33 @@ void gtrack_vol_cb(Fl_Widget *w, void *data)
writeToDspRingbuffer( &e );
printf("track %i vol %f\n", track->ID, ((Avtk::Dial*)w)->value() );
}
void gtrack_active_cb(Fl_Widget *w, void *data)
{
GTrack* track = (GTrack*) data;
Avtk::LightButton* d = (Avtk::LightButton*)w;
bool b = d->value();
d->value( !b );
/*
if ( b < 0.5 )
{
EventTrackSend e( track->ID, SEND_SIDE, 1.0f );
writeToDspRingbuffer( &e );
}
else
{
EventTrackSend e( track->ID, SEND_SIDE, 0.0f );
writeToDspRingbuffer( &e );
}
printf("track %i post send %s\n", track->ID, b ? "true" : "false" );
*/
}
void gtrack_record_cb(Fl_Widget *w, void *data)
{
GTrack* track = (GTrack*) data;
Avtk::LightButton* d = (Avtk::LightButton*)w;
bool b = d->value();
d->value( !b );
//EventTrackVol e( track->ID, ((Avtk::Volume*)w)->value() );
//writeToDspRingbuffer( &e );
//printf("track %i vol %f\n", track->ID, ((Avtk::Dial*)w)->value() );
}

View file

@ -97,6 +97,35 @@ static void gui_header_callback(Fl_Widget *w, void *data)
writeToDspRingbuffer( &e );
}
}
else if ( strcmp(m->label(), "Quit") == 0 )
{
int choice = fl_choice("Really Quit?","Cancel","Just Quit","Save & Quit",0);
//cout << choice << endl;
if ( choice == 2 ) // SAVE & QUIT
{
const char* name = fl_input( "Save session as", gui->getDiskWriter()->getLastSaveName().c_str() );
if ( name )
{
cout << "Save clicked, name = " << name << endl;
gui->getDiskWriter()->initialize( getenv("HOME"), name );
EventStateSave e;
writeToDspRingbuffer( &e );
}
else
{
return;
}
}
else if ( choice == 1 ) // JUST QUIT
{
EventQuit e;
writeToDspRingbuffer( &e );
}
else
{
return;
}
}
}
void Gui::selectLoadSample( int track, int scene )

View file

@ -115,6 +115,8 @@ Jack::Jack() :
}
/// setup DSP instances
inputVol = 1.0f;
masterVol = 0.75f;
masterMeter = new DBMeter( buffers.samplerate );
inputMeter = new DBMeter( buffers.samplerate );
@ -135,6 +137,20 @@ Jack::Jack() :
}
}
Jack::~Jack()
{
jack_client_close(client);
delete timeManager;
delete metronome;
delete state;
delete logic;
delete gridLogic;
delete controllerUpdater;
delete inputMeter;
delete masterMeter;
}
void Jack::activate()
{
@ -152,6 +168,23 @@ void Jack::activate()
jack_transport_start(client);
}
void Jack::quit()
{
// turn off process()
jack_deactivate( client );
// unregister JACK ports
for(unsigned int i = 0; i < midiObservers.size(); i++)
{
unregisterMidiObserver( midiObservers.at(i) );
}
LUPPP_NOTE("%s","Quit JACK graph.");
// ping UI that JACK thread is finished shutting down
EventQuit e;
writeToGuiRingbuffer( &e );
}
TrackOutput* Jack::getTrackOutput(int t)
{
@ -185,7 +218,7 @@ Looper* Jack::getLooper(int t)
void Jack::registerMidiObserver( MidiObserver* mo, std::string name )
{
cout << "Jack::registerMidiObserver() " << name << endl;
LUPPP_NOTE("%s: %s","Jack::registerMidiObserver() ", name.c_str() );
// register the observer
midiObservers.push_back( mo );
@ -217,6 +250,27 @@ void Jack::registerMidiObserver( MidiObserver* mo, std::string name )
midiObserverOutputPorts.push_back( tmp );
}
void Jack::unregisterMidiObserver( MidiObserver* mo )
{
cout << "Jack::unregisterMidiObserver()" << endl;
// remove MIDI I/O ports
jack_port_unregister(client, midiObserverInputPorts .at( mo->port() ) );
jack_port_unregister(client, midiObserverOutputPorts.at( mo->port() ) );
/* // indeces for other instances can't change!
midiObserverInputBuffers.push_back( 0 );
midiObserverInputPorts.push_back( tmp );
midiObserverOutputBuffers.push_back( 0 );
midiObserverOutputPorts.push_back( tmp );
*/
// unregister the observer
midiObservers.push_back( mo );
}
int Jack::process (jack_nframes_t nframes)
{

View file

@ -36,8 +36,12 @@ class Jack
{
public:
Jack();
~Jack();
void activate();
/// quits the JACK client, destroying ports etc. Call only on exit of Luppp.
void quit();
int getBuffersize();
int getSamplerate();
@ -55,6 +59,8 @@ class Jack
/// register MIDI observers: they're called when a MIDI message arrives on
/// a port they're watching
void registerMidiObserver( MidiObserver* mo, std::string name );
/// remove a MidiObserver, deregistering ports
void unregisterMidiObserver( MidiObserver* mo );
/// writes MIDI messages to a MidiObserver's port
void midiObserverWriteMIDI( int portIndex, unsigned char* data );

View file

@ -15,6 +15,7 @@ class Metronome : public TimeObserver
{
public:
Metronome();
~Metronome(){};
void setActive(bool a);

View file

@ -16,6 +16,7 @@ class MidiObserver
public:
/// registers class with jack's MIDI handling, with MIDI port name
MidiObserver( std::string portName );
virtual ~MidiObserver(){};
/// name string to show in UI
virtual std::string getName() = 0;

View file

@ -7,6 +7,7 @@ class TimeObserver
public:
/// registers with TimeManager
TimeObserver();
virtual ~TimeObserver(){};
virtual void setFpb(int fpb){};