From 32b952800ab2ba452ef98877740cde4acd150669 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Fri, 20 Sep 2013 23:28:59 +0100 Subject: [PATCH] -Working on Jack quit code, cleanup, virtual destructors etc --- src/event.hxx | 10 ++++++++ src/eventhandlerdsp.cxx | 8 ++++++ src/gridlogic.hxx | 1 + src/gtrack.cxx | 42 +++++++++++++++++++++++++------ src/gui.cxx | 29 +++++++++++++++++++++ src/jack.cxx | 56 ++++++++++++++++++++++++++++++++++++++++- src/jack.hxx | 6 +++++ src/metronome.hxx | 1 + src/observer/midi.hxx | 1 + src/observer/time.hxx | 1 + 10 files changed, 146 insertions(+), 9 deletions(-) diff --git a/src/event.hxx b/src/event.hxx index 5f40470..5e23ea1 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -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: diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index 8259b9b..833cd4d 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -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; diff --git a/src/gridlogic.hxx b/src/gridlogic.hxx index ebc1c11..66b7ff4 100644 --- a/src/gridlogic.hxx +++ b/src/gridlogic.hxx @@ -39,6 +39,7 @@ class GridLogic : public TimeObserver }; GridLogic(); + ~GridLogic(){}; /// button press / click event void pressed( int track, int scene ); diff --git a/src/gtrack.cxx b/src/gtrack.cxx index 9fa5a36..a0c2338 100644 --- a/src/gtrack.cxx +++ b/src/gtrack.cxx @@ -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() ); +} diff --git a/src/gui.cxx b/src/gui.cxx index 7b3f70a..dafec8b 100644 --- a/src/gui.cxx +++ b/src/gui.cxx @@ -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 ) diff --git a/src/jack.cxx b/src/jack.cxx index 4135cb4..e6378db 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -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) { diff --git a/src/jack.hxx b/src/jack.hxx index 0a3d606..b47065e 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -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 ); diff --git a/src/metronome.hxx b/src/metronome.hxx index 8b6c112..1e53f7f 100644 --- a/src/metronome.hxx +++ b/src/metronome.hxx @@ -15,6 +15,7 @@ class Metronome : public TimeObserver { public: Metronome(); + ~Metronome(){}; void setActive(bool a); diff --git a/src/observer/midi.hxx b/src/observer/midi.hxx index e710122..31baccf 100644 --- a/src/observer/midi.hxx +++ b/src/observer/midi.hxx @@ -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; diff --git a/src/observer/time.hxx b/src/observer/time.hxx index 031ada8..86d4b8c 100644 --- a/src/observer/time.hxx +++ b/src/observer/time.hxx @@ -7,6 +7,7 @@ class TimeObserver public: /// registers with TimeManager TimeObserver(); + virtual ~TimeObserver(){}; virtual void setFpb(int fpb){};