From bb91ac0e5888aea96ff2903b4f294188bc878ec8 Mon Sep 17 00:00:00 2001 From: Gerald Date: Sat, 19 Nov 2016 00:35:43 +0100 Subject: [PATCH] MAJOR change: send/returns are always there. New feature: per track output (optional, use enablePerTrackOutput in luppp.prfs) --- src/buffers.hxx | 9 +++++++ src/diskreader.cxx | 23 ++++++++++++++---- src/diskwriter.cxx | 3 +++ src/gtrack.cxx | 10 ++++++++ src/gtrack.hxx | 4 +++- src/gui.cxx | 2 +- src/gui.hxx | 2 +- src/jack.cxx | 58 +++++++++++++++++++++++++++++++-------------- src/jack.hxx | 3 ++- src/trackoutput.cxx | 6 ++++- 10 files changed, 92 insertions(+), 28 deletions(-) diff --git a/src/buffers.hxx b/src/buffers.hxx index c5196d3..0469263 100644 --- a/src/buffers.hxx +++ b/src/buffers.hxx @@ -80,6 +80,15 @@ class Buffers RETURN_TRACK_6, RETURN_TRACK_7, + JACK_TRACK_0, + JACK_TRACK_1, + JACK_TRACK_2, + JACK_TRACK_3, + JACK_TRACK_4, + JACK_TRACK_5, + JACK_TRACK_6, + JACK_TRACK_7, + BUFFER_COUNT, }; diff --git a/src/diskreader.cxx b/src/diskreader.cxx index 9dbb257..cfe9cca 100644 --- a/src/diskreader.cxx +++ b/src/diskreader.cxx @@ -103,12 +103,12 @@ int DiskReader::loadPreferences() } //Enable per track send and resturn jack ports? - cJSON* jackSendReturns=cJSON_GetObjectItem(preferencesJson,"enablePerTrackSendReturns"); - if(jackSendReturns) + cJSON* jackPerTrackOutput=cJSON_GetObjectItem(preferencesJson,"enablePerTrackOutput"); + if(jackPerTrackOutput) { - gui->enableJackSendReturns=jackSendReturns->valueint; - if(gui->enableJackSendReturns) - LUPPP_NOTE("Enabling per track send and return ports"); + gui->enablePerTrackOutput=jackPerTrackOutput->valueint; + if(gui->enablePerTrackOutput) + LUPPP_NOTE("Enabling per track output ports"); } @@ -638,6 +638,19 @@ int DiskReader::readTracks() writeToDspRingbuffer( &e2 ); writeToDspRingbuffer( &e3 ); } + + cJSON* jacksend = cJSON_GetObjectItem( track, "jacksendAmount"); + cJSON* jacksendActive = cJSON_GetObjectItem( track, "jacksendActive"); + if(jacksend) + { + EventTrackJackSend ev(t,jacksend->valuedouble); + writeToDspRingbuffer(&ev); + } + if(jacksendActive) + { + EventTrackJackSendActivate ev(t,jacksendActive->valueint); + writeToDspRingbuffer(&ev); + } } }// if track } // nTracks loop diff --git a/src/diskwriter.cxx b/src/diskwriter.cxx index e17cdd9..690dc7c 100644 --- a/src/diskwriter.cxx +++ b/src/diskwriter.cxx @@ -431,6 +431,9 @@ int DiskWriter::writeSession() cJSON_AddNumberToObject( track, "sendAmount" , gui->getTrack(t)->getSend() ); cJSON_AddNumberToObject( track, "sendActive" , gui->getTrack(t)->getSendActive() ); + + cJSON_AddNumberToObject( track, "jacksendAmount" , gui->getTrack(t)->getJackSend() ); + cJSON_AddNumberToObject( track, "jacksendActive" , gui->getTrack(t)->getJackSendActivate() ); cJSON_AddNumberToObject( track, "xsideAmount", gui->getTrack(t)->getXSide() ); cJSON_AddNumberToObject( track, "keyActive" , gui->getTrack(t)->getKeyActive() ); diff --git a/src/gtrack.cxx b/src/gtrack.cxx index ad09901..be1a809 100644 --- a/src/gtrack.cxx +++ b/src/gtrack.cxx @@ -109,6 +109,16 @@ void GTrack::setJackSendActivate(bool a) jackSendActivate.value(a); } +float GTrack::getJackSend() +{ + return jackSendDial.value(); +} + +bool GTrack::getJackSendActivate() +{ + return jackSendActivate.value(); +} + void gtrack_sendDial_cb(Fl_Widget *w, void *data) { GTrack* track = (GTrack*) data; diff --git a/src/gtrack.hxx b/src/gtrack.hxx index 016424d..a1ac8c1 100644 --- a/src/gtrack.hxx +++ b/src/gtrack.hxx @@ -85,7 +85,9 @@ class GTrack : public Fl_Group Avtk::Volume volume; - private: + float getJackSend(); + bool getJackSendActivate(); +private: Avtk::Box jackSendBox; Avtk::Dial jackSendDial; Avtk::LightButton jackSendActivate; diff --git a/src/gui.cxx b/src/gui.cxx index 6f8bd2e..6e9c89e 100644 --- a/src/gui.cxx +++ b/src/gui.cxx @@ -363,7 +363,7 @@ static int cb_nsm_save ( char **out_msg, void *userdata ) Gui::Gui(const char* argZero) : samplerate( 0 ), window(1110,700), - enableJackSendReturns(false), + enablePerTrackOutput(false), diskReader( new DiskReader() ), diskWriter( new DiskWriter() ) { diff --git a/src/gui.hxx b/src/gui.hxx index 30b36e2..9a49fd1 100644 --- a/src/gui.hxx +++ b/src/gui.hxx @@ -86,7 +86,7 @@ class Gui int samplerate; ////Enable per track send and resturn jack ports - bool enableJackSendReturns; + bool enablePerTrackOutput; int getWindowWidth(){return window.w();} diff --git a/src/jack.cxx b/src/jack.cxx index 41318f3..23a010d 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -204,22 +204,28 @@ Jack::Jack( std::string name ) : **/ loopers.push_back( new Looper(i) ); - if(gui->enableJackSendReturns) - { - tracksendreturns.push_back(new JackSendReturn(i,loopers.back(),client)); - trackOutputs.push_back( new TrackOutput(i, tracksendreturns.back() ) ); - } - else - trackOutputs.push_back( new TrackOutput(i, loopers.back() ) ); + tracksendreturns.push_back(new JackSendReturn(i,loopers.back(),client)); + trackOutputs.push_back( new TrackOutput(i, tracksendreturns.back() ) ); + buffers.audio[Buffers::TRACK_0 + i] = new float[ buffers.nframes ]; buffers.audio[Buffers::SEND_TRACK_0+i]=new float[buffers.nframes]; - if(gui->enableJackSendReturns) - buffers.audio[Buffers::RETURN_TRACK_0+i]=new float[buffers.nframes]; - else - buffers.audio[Buffers::RETURN_TRACK_0+i]=buffers.audio[Buffers::SEND_TRACK_0+i]; + buffers.audio[Buffers::RETURN_TRACK_0+i]=new float[buffers.nframes]; + + timeManager->registerObserver( loopers.back() ); + if(gui->enablePerTrackOutput) + { + char name[50]; + sprintf(name,"track_%d\0",i); + trackJackOutputPorts[i]=jack_port_register( client, + name, + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); + + } } /// setup DSP instances @@ -282,11 +288,8 @@ Jack::~Jack() { delete [] buffers.audio[Buffers::TRACK_0+i]; delete [] buffers.audio[Buffers::SEND_TRACK_0+i]; - if(gui->enableJackSendReturns) - { - delete [] buffers.audio[Buffers::RETURN_TRACK_0+i]; - delete tracksendreturns[i]; - } + delete [] buffers.audio[Buffers::RETURN_TRACK_0+i]; + delete tracksendreturns[i]; delete loopers[i]; delete trackOutputs[i]; } @@ -393,6 +396,12 @@ int Jack::process (jack_nframes_t nframes) buffers.audio[Buffers::JACK_MASTER_OUT_R] = (float*)jack_port_get_buffer( masterOutputR , nframes ); buffers.audio[Buffers::JACK_SIDECHAIN_KEY] = (float*)jack_port_get_buffer(sidechainKeyOutput,nframes); buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL]=(float*)jack_port_get_buffer(sidechainSignalOutput,nframes); + if(gui->enablePerTrackOutput) + { + for(int t=0;tenablePerTrackOutput) + { + for(int t=0;tenablePerTrackOutput) + { + for(int t=0;tenableJackSendReturns) - memset(buffers.audio[Buffers::RETURN_TRACK_0 + i],0,sizeof(float)*nframes); + + memset(buffers.audio[Buffers::RETURN_TRACK_0 + i],0,sizeof(float)*nframes); } } diff --git a/src/jack.hxx b/src/jack.hxx index f0796fa..050052e 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -157,6 +157,7 @@ private: jack_port_t* masterInput; jack_port_t* masterOutputL; jack_port_t* masterOutputR; + jack_port_t* masterReturnL; jack_port_t* masterReturnR; jack_port_t* headphonesPort; @@ -167,7 +168,7 @@ private: jack_port_t* masterMidiInput; - vector trackJackOutputPorts; + jack_port_t* trackJackOutputPorts[NTRACKS]; // JACK callback int process (jack_nframes_t); diff --git a/src/trackoutput.cxx b/src/trackoutput.cxx index 549bfbd..424c554 100644 --- a/src/trackoutput.cxx +++ b/src/trackoutput.cxx @@ -135,6 +135,9 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) float* masterL = buffers->audio[Buffers::MASTER_OUT_L]; float* masterR = buffers->audio[Buffers::MASTER_OUT_R]; + + + float* jackoutput = buffers->audio[Buffers::JACK_TRACK_0+track]; for(unsigned int i = 0; i < nframes; i++) { @@ -144,7 +147,8 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) // post-sidechain *moves* signal between "before/after" ducking, not add! masterL[i] += tmp * _toMasterLag * (1-_toPostSidechain); masterR[i] += tmp * _toMasterLag * (1-_toPostSidechain); - + if(jackoutput) + jackoutput[i] = tmp * _toMasterLag * (1-_toPostSidechain); if ( _toPostfaderActive ) reverb[i] += tmp * _toReverb * _toMasterLag;