-Fixed GridLogic, now sends proper feedback to APC / GUI.

This commit is contained in:
Harry van Haaren 2013-08-06 22:42:04 +01:00
parent 0012d3655d
commit 90edacad60
5 changed files with 62 additions and 86 deletions

View file

@ -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();

View file

@ -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:

View file

@ -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;

View file

@ -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 );
}

View file

@ -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