mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-06 01:21:38 -05:00
-Working on Jack quit code, cleanup, virtual destructors etc
This commit is contained in:
parent
fedf1925c1
commit
32b952800a
10 changed files with 146 additions and 9 deletions
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -39,6 +39,7 @@ class GridLogic : public TimeObserver
|
|||
};
|
||||
|
||||
GridLogic();
|
||||
~GridLogic(){};
|
||||
|
||||
/// button press / click event
|
||||
void pressed( int track, int scene );
|
||||
|
|
|
@ -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() );
|
||||
}
|
||||
|
|
29
src/gui.cxx
29
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 )
|
||||
|
|
56
src/jack.cxx
56
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)
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -15,6 +15,7 @@ class Metronome : public TimeObserver
|
|||
{
|
||||
public:
|
||||
Metronome();
|
||||
~Metronome(){};
|
||||
|
||||
void setActive(bool a);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -7,6 +7,7 @@ class TimeObserver
|
|||
public:
|
||||
/// registers with TimeManager
|
||||
TimeObserver();
|
||||
virtual ~TimeObserver(){};
|
||||
|
||||
virtual void setFpb(int fpb){};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue