From 90edacad600ca29577b2a42bd1f0694f2ee84b73 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Tue, 6 Aug 2013 22:42:04 +0100 Subject: [PATCH] -Fixed GridLogic, now sends proper feedback to APC / GUI. --- src/avtk/avtk_clip_selector.h | 84 ++--------------------------------- src/event.hxx | 17 +++++++ src/eventhandlerdsp.cxx | 12 +++++ src/gridlogic.cxx | 25 ++++++++--- src/gridlogic.hxx | 10 +++++ 5 files changed, 62 insertions(+), 86 deletions(-) diff --git a/src/avtk/avtk_clip_selector.h b/src/avtk/avtk_clip_selector.h index f66046f..3654926 100644 --- a/src/avtk/avtk_clip_selector.h +++ b/src/avtk/avtk_clip_selector.h @@ -371,87 +371,9 @@ class ClipSelector : public Fl_Button } else { - /* - // decide action to take based on current state of clip - if ( clips[clipNum].queued() ) - { - - } - else if ( clips[clipNum].playing() ) - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_STOP_QUEUED); - writeToDspRingbuffer( &e ); - clips[clipNum].stop(); - //clips[clipNum].stopQueue(); - printf("stopping clip now: playingClip == %i", clipNum ); - } - else if ( clips[clipNum].recording() ) - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_STOP_QUEUED); - writeToDspRingbuffer( &e ); - clips[clipNum].record(); - } - - else if ( clipNum == stopQueuedClip ) - { - playingClip = -1; - } - - else if ( clips[clipNum].loaded() ) - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_PLAY_QUEUED); - writeToDspRingbuffer( &e ); - //queuedClip = clipNum; - } - else if ( !clips[clipNum].loaded() ) - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_RECORD_QUEUED); - writeToDspRingbuffer( &e ); - } - else - { - printf("avtk clipSelector handle click: no state triggered"); - } - */ - - /* - switch( clips[clipNum].state ) - { - case ClipState::CLIP_EMPTY: - clips[clipNum].state = ClipState::CLIP_RECORDING; - { - } - break; - case ClipState::CLIP_LOADED: - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_PLAY_QUEUED); - writeToDspRingbuffer( &e ); - clips[clipNum].state = ClipState::CLIP_QUEUED; - } - break; - case ClipState::CLIP_QUEUED: - clips[clipNum].state = ClipState::CLIP_QUEUED; - break; - case ClipState::CLIP_PLAYING: - { - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_STOP_QUEUED); - writeToDspRingbuffer( &e ); - clips[clipNum].state = ClipState::CLIP_QUEUED; - } - break; - case ClipState::CLIP_RECORDING: { - clips[clipNum].state = ClipState::CLIP_QUEUED; - EventLooperState e = EventLooperState( ID, clipNum, Looper::STATE_STOP_QUEUED); - writeToDspRingbuffer( &e ); } - break; - case ClipState::CLIP_STOPPING: - clips[clipNum].state = ClipState::CLIP_QUEUED; - break; - default: - printf("Avtk::ClipSelector, warning: unknown clip type\n"); - - } - */ + // write "pressed" event for this track,scene + EventGridEvent e( ID, clipNum, true ); + writeToDspRingbuffer( &e ); } } redraw(); diff --git a/src/event.hxx b/src/event.hxx index ca069a9..1332e60 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -26,6 +26,9 @@ namespace Event MASTER_VOL, RECORD, + // press / release events + GRID_EVENT, + TRACK_SEND, TRACK_SIGNAL_LEVEL, TRACK_VOLUME, @@ -92,6 +95,20 @@ class EventTrackVol : public EventBase } }; +class EventGridEvent : public EventBase +{ + public: + int type() { return int(GRID_EVENT); } + uint32_t size() { return sizeof(EventGridEvent); } + + int track; + int scene; + bool pressed; + + EventGridEvent(){}; + EventGridEvent(int t, int s, bool p): track(t), scene(s), pressed(p) {} +}; + class EventFxReverb : public EventBase { public: diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index 80ba87a..62ee42b 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -40,6 +40,18 @@ void handleDspEvents() jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventMasterVol) ); //jack->masterVolume = ev.vol; } break; } + + // ========= GRID ===== + case Event::GRID_EVENT: { + if ( availableRead >= sizeof(EventGridEvent) ) { + EventGridEvent ev; + jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventGridEvent) ); + if ( ev.pressed ) + jack->getGridLogic()->pressed( ev.track, ev.scene ); + else + jack->getGridLogic()->released( ev.track, ev.scene ); + } break; } + case Event::LOOPER_LOAD: { if ( availableRead >= sizeof(EventLooperLoad) ) { EventLooperLoad ev; diff --git a/src/gridlogic.cxx b/src/gridlogic.cxx index 5ac3f48..0d5a344 100644 --- a/src/gridlogic.cxx +++ b/src/gridlogic.cxx @@ -13,8 +13,23 @@ GridLogic::GridLogic() void GridLogic::pressed( int track, int scene ) { - state[track*NTRACKS + scene] = STATE_PLAYING; - jack->getControllerUpdater()->setSceneState(track, scene, STATE_PLAY_QUEUED); + printf("before press state = %s\n", StateString[ int(state[track*NTRACKS + scene]) ] ); + + if ( state[track*NTRACKS + scene] == STATE_EMPTY ) + state[track*NTRACKS + scene] = STATE_RECORD_QUEUED; + + if ( state[track*NTRACKS + scene] == STATE_LOADED ) + state[track*NTRACKS + scene] = STATE_PLAY_QUEUED; + + if ( state[track*NTRACKS + scene] == STATE_PLAYING ) + state[track*NTRACKS + scene] = STATE_STOP_QUEUED; + + if ( state[track*NTRACKS + scene] == STATE_RECORDING ) + state[track*NTRACKS + scene] = STATE_STOP_QUEUED; + + printf("after press state = %s\n", StateString[ int(state[track*NTRACKS + scene]) ] ); + + jack->getControllerUpdater()->setSceneState(track, scene, state[track*NTRACKS + scene]); } @@ -26,7 +41,6 @@ void GridLogic::released( int track, int scene ) void GridLogic::updateState() { - } @@ -40,6 +54,7 @@ void GridLogic::bar() { printf("GridLogic::bar()\n" ); + /// iterate over all clips, if they're set to QUEUED, set to the next state for( int i = 0; i < NTRACKS*NSCENES; i++ ) { bool change = false; @@ -62,8 +77,8 @@ void GridLogic::bar() if ( change ) { - int scene = i % NTRACKS; - int track = i - scene; + int track = i / NTRACKS; + int scene = i - scene; updateState( track, scene ); printf("GridLogic::bar(), updated %i, %i\n", track, scene ); } diff --git a/src/gridlogic.hxx b/src/gridlogic.hxx index 1cc9225..b35adce 100644 --- a/src/gridlogic.hxx +++ b/src/gridlogic.hxx @@ -36,6 +36,16 @@ class GridLogic : public TimeObserver STATE_RECORD_QUEUED, }; + const char* StateString[8] = { + "empty", + "playing", + "play queued", + "loaded", + "stop queued", + "recording", + "record queued" + }; + GridLogic(); /// button press / click event