From d210216c727754016041787f6502f49fbce818f0 Mon Sep 17 00:00:00 2001 From: Georg Krause Date: Sat, 15 Jun 2019 10:24:13 +0200 Subject: [PATCH] Disable Free Mode if >= 1 Clip is recorded --- src/event.hxx | 10 +++++++++- src/eventhandlerdsp.cxx | 4 +++- src/eventhandlergui.cxx | 12 ++++++------ src/gmastertrack.cxx | 8 ++++++++ src/gmastertrack.hxx | 1 + src/gridlogic.cxx | 2 +- src/jack.cxx | 20 +++++++++++++++++++- src/jack.hxx | 9 +++++++++ src/looperclip.cxx | 6 +++++- 9 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/event.hxx b/src/event.hxx index 0ef8531..cff280d 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -896,6 +896,7 @@ public: class EventFreeRecordMode : public EventBase { public: static const char *prettyName; + bool active; bool enable; const char *name() { @@ -911,10 +912,17 @@ public: } EventFreeRecordMode() { + active = true; enable = true; } - EventFreeRecordMode(bool e) { + EventFreeRecordMode(bool a) { + active = a; + enable = true; + } + + EventFreeRecordMode ( bool a, bool e ) { + active = a; enable = e; } }; diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index df0c550..b35cd3f 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -294,7 +294,9 @@ void handleDspEvents() jack_ringbuffer_read(rbToDsp, (char *)&e, sizeof(EventFreeRecordMode)); - jack->setFreeRecMode(e.enable); + if(jack->getRecordedClips() == 0) + jack->setFreeRecMode ( + e.active ); } break; } diff --git a/src/eventhandlergui.cxx b/src/eventhandlergui.cxx index c53ae1c..4fb0b89 100644 --- a/src/eventhandlergui.cxx +++ b/src/eventhandlergui.cxx @@ -143,12 +143,12 @@ void handleGuiEvents() sizeof(EventFreeRecordMode)); GMasterTrack *gm = gui->getMasterTrack(); - gm->setFreeRecMode( - e.enable); - gm->metronomeEnable(!e.enable); - gm->tapEnable(!e.enable); - gm->beatLightEnable(!e.enable); - gm->tempoDialEnable(!e.enable); + gm->setFreeRecMode ( e.active ); + gm->metronomeEnable ( !e.active ); + gm->tapEnable ( !e.active ); + gm->beatLightEnable ( !e.active ); + gm->tempoDialEnable ( !e.active ); + gm->enableFreeRecMode ( e.enable ); } break; } diff --git a/src/gmastertrack.cxx b/src/gmastertrack.cxx index 516547e..1440fde 100644 --- a/src/gmastertrack.cxx +++ b/src/gmastertrack.cxx @@ -422,6 +422,14 @@ void GMasterTrack::setFreeRecMode(bool e) { freeRec.value(e); } +void GMasterTrack::enableFreeRecMode ( bool e ) { + if ( e ) { + freeRec.activate (); + } else { + freeRec.deactivate (); + } +} + float GMasterTrack::getBpm() { return bpm; diff --git a/src/gmastertrack.hxx b/src/gmastertrack.hxx index b9dafbd..a3158b5 100644 --- a/src/gmastertrack.hxx +++ b/src/gmastertrack.hxx @@ -66,6 +66,7 @@ public: void tapEnable(bool b); void beatLightEnable(bool b); void tempoDialEnable(bool b); + void enableFreeRecMode ( bool e ); Avtk::Volume *getInputVolume(); Avtk::Volume* getVolume(); diff --git a/src/gridlogic.cxx b/src/gridlogic.cxx index d9750eb..ea24cae 100644 --- a/src/gridlogic.cxx +++ b/src/gridlogic.cxx @@ -222,7 +222,7 @@ void GridLogic::pressed( int track, int scene ) void GridLogic::clear( int track, int scene ) { - jack->getLooper( track )->getClip( scene )->init(); + jack->getLooper( track )->getClip( scene )->reset(); } void GridLogic::released( int track, int scene ) diff --git a/src/jack.cxx b/src/jack.cxx index f1495b1..063fe48 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -311,6 +311,7 @@ Jack::Jack( std::string name ) : // call into the GUI, telling it to register default controllers gui->setupMidiControllers(); + recordedClips = 0; } Jack::~Jack() @@ -792,4 +793,21 @@ void Jack::setFreeRecMode(bool e) writeToGuiRingbuffer(&ev); if(e) getLogic()->metronomeEnable(false); -} \ No newline at end of file +} + +void Jack::addRecordedClip () { + recordedClips++; + cout << "Recorded Clips: " << recordedClips << "\n"; + if ( recordedClips > 0 ) { + EventFreeRecordMode e = EventFreeRecordMode ( false, false ); + writeToGuiRingbuffer ( &e ); + } +}; +void Jack::subRecordedClip () { + recordedClips--; + cout << "Recorded Clips: " << recordedClips << "\n"; + if ( recordedClips == 0 ) { + EventFreeRecordMode e = EventFreeRecordMode ( false, true ); + writeToGuiRingbuffer ( &e ); + } +}; \ No newline at end of file diff --git a/src/jack.hxx b/src/jack.hxx index f4fa563..6d614c5 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -149,6 +149,14 @@ public: JackSendReturn *getJackSendReturn(int t); float smoothing_value; + + // Functions to count number of clips + int getRecordedClips () { + return recordedClips; + }; + void addRecordedClip (); + void subRecordedClip (); + private: int lastnframes; jack_client_t* client; @@ -163,6 +171,7 @@ private: int clipLength; bool freeRecMode; + unsigned int recordedClips; vector loopers; vector tracksendreturns; diff --git a/src/looperclip.cxx b/src/looperclip.cxx index 8971c5a..a4343b3 100644 --- a/src/looperclip.cxx +++ b/src/looperclip.cxx @@ -94,7 +94,10 @@ void LooperClip::save() void LooperClip::reset() { - init(); + if(_loaded) { + jack->subRecordedClip (); + } + init (); } /// loads a sample: eg from disk, unloading current sample if necessary @@ -374,6 +377,7 @@ void LooperClip::setRecording() } jack->getControllerUpdater()->setSceneState(track, scene, getState()); + jack->addRecordedClip (); } void LooperClip::setPlaying()