-Updated ClipSelector code, working on LaunchScene support

This commit is contained in:
Harry van Haaren 2013-08-22 05:48:59 +01:00
parent a641fcd8d3
commit 6ad3a0e11b
8 changed files with 68 additions and 7 deletions

View file

@ -79,7 +79,7 @@ class ClipSelector : public Fl_Button
public: public:
ClipSelector(int _x, int _y, int _w, int _h, const char *_label): ClipSelector(int _x, int _y, int _w, int _h, const char *_label, bool master = false):
Fl_Button(_x, _y, _w, _h, _label) Fl_Button(_x, _y, _w, _h, _label)
{ {
x = _x; x = _x;
@ -88,6 +88,7 @@ class ClipSelector : public Fl_Button
h = _h; h = _h;
label = _label; label = _label;
_master = master;
highlight = false; highlight = false;
mouseOver = false; mouseOver = false;
@ -99,6 +100,7 @@ class ClipSelector : public Fl_Button
static const int numClips = 10; static const int numClips = 10;
ClipState clips[numClips]; ClipState clips[numClips];
bool _master;
bool mouseOver; bool mouseOver;
bool highlight; bool highlight;
int x, y, w, h; int x, y, w, h;
@ -121,7 +123,7 @@ class ClipSelector : public Fl_Button
clips[clipNum].setName(); clips[clipNum].setName();
break; break;
case GridLogic::STATE_STOPPED: case GridLogic::STATE_STOPPED:
clips[clipNum].setName(); //clips[clipNum].setName();
break; break;
case GridLogic::STATE_EMPTY: case GridLogic::STATE_EMPTY:
case GridLogic::STATE_PLAYING: case GridLogic::STATE_PLAYING:
@ -285,6 +287,14 @@ class ClipSelector : public Fl_Button
// handle right clicks: popup menu // handle right clicks: popup menu
if ( Fl::event_state(FL_BUTTON3) ) if ( Fl::event_state(FL_BUTTON3) )
{ {
if ( _master )
{
redraw();
return 1;
}
Fl_Menu_Item rclick_menu[] = Fl_Menu_Item rclick_menu[] =
{ {
{ "Load" }, { "Load" },
@ -353,6 +363,14 @@ class ClipSelector : public Fl_Button
} }
else else
{ {
if ( _master )
{
EventGridLaunchScene e( clipNum );
writeToDspRingbuffer( &e );
redraw();
return 1;
}
// write "pressed" event for this track,scene // write "pressed" event for this track,scene
EventGridEvent e( ID, clipNum, true ); EventGridEvent e( ID, clipNum, true );
writeToDspRingbuffer( &e ); writeToDspRingbuffer( &e );

View file

@ -32,6 +32,7 @@ namespace Event
GRID_EVENT, // press / release events GRID_EVENT, // press / release events
GRID_STATE, // state of one block GRID_STATE, // state of one block
GRID_LAUNCH_SCENE,
TRACK_SEND, TRACK_SEND,
TRACK_SIGNAL_LEVEL, TRACK_SIGNAL_LEVEL,
@ -129,6 +130,18 @@ class EventGridState : public EventBase
EventGridState(int t, int s, GridLogic::State st): track(t), scene(s), state(st) {} EventGridState(int t, int s, GridLogic::State st): track(t), scene(s), state(st) {}
}; };
class EventGridLaunchScene : public EventBase
{
public:
int type() { return int(GRID_LAUNCH_SCENE); }
uint32_t size() { return sizeof(EventGridLaunchScene); }
int scene;
EventGridLaunchScene(){};
EventGridLaunchScene(int s): scene(s){}
};
class EventFxReverb : public EventBase class EventFxReverb : public EventBase
{ {
public: public:

View file

@ -52,6 +52,12 @@ void handleDspEvents()
jack->getGridLogic()->released( ev.track, ev.scene ); jack->getGridLogic()->released( ev.track, ev.scene );
} break; } } break; }
case Event::GRID_LAUNCH_SCENE: {
EventGridLaunchScene ev;
jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventGridLaunchScene) );
jack->getGridLogic()->launchScene( ev.scene );
break; }
case Event::LOOPER_LOAD: { case Event::LOOPER_LOAD: {
if ( availableRead >= sizeof(EventLooperLoad) ) { if ( availableRead >= sizeof(EventLooperLoad) ) {
EventLooperLoad ev; EventLooperLoad ev;

View file

@ -26,6 +26,30 @@ GridLogic::GridLogic()
} }
void GridLogic::launchScene( int scene )
{
for(unsigned int t = 0; t < NTRACKS; t++ )
{
for(unsigned int s = 0; s < NSCENES; s++ )
{
LooperClip* lc = jack->getLooper( t )->getClip( s );
if ( s == scene )
lc->queuePlay();
//else
//lc->queueStop();
}
}
/*
for(unsigned int s = 0; s < NSCENES; s++ )
{
jack->getControllerUpdater()->setSceneState( -1, s, s );
}
*/
}
void GridLogic::pressed( int track, int scene ) void GridLogic::pressed( int track, int scene )
{ {
LooperClip* lc = jack->getLooper( track )->getClip( scene ); LooperClip* lc = jack->getLooper( track )->getClip( scene );

View file

@ -46,6 +46,9 @@ class GridLogic : public TimeObserver
/// button release / click-release event /// button release / click-release event
void released( int track, int scene ); void released( int track, int scene );
/// master controls, launches a horizontal scene with one event
void launchScene( int scene );
/// GUI load event /// GUI load event
void load(int track, int scene, AudioBuffer* ab); void load(int track, int scene, AudioBuffer* ab);

View file

@ -282,7 +282,7 @@ void Jack::writeApcOutput( unsigned char* data )
} }
else else
{ {
EventGuiPrint e( "__FILE__ __LINE__ Buffer not valid" ); EventGuiPrint e( "Jack::writeApcOutput(): Buffer full!" );
writeToGuiRingbuffer( &e ); writeToGuiRingbuffer( &e );
} }
} }

View file

@ -181,13 +181,12 @@ void LooperClip::queuePlay()
{ {
_queuePlay = true; _queuePlay = true;
_queueStop = false; _queueStop = false;
_queueRecord = false;
} }
void LooperClip::queueStop() void LooperClip::queueStop()
{ {
_queueStop = true; _queueStop = true;
_queuePlay = false; _queuePlay = false;
_queueRecord = false;
} }
void LooperClip::queueRecord() void LooperClip::queueRecord()

View file

@ -20,8 +20,6 @@ TimeManager::TimeManager():
tapTempo[0] = 0; tapTempo[0] = 0;
tapTempo[1] = 0; tapTempo[1] = 0;
tapTempo[2] = 0; tapTempo[2] = 0;
cout << "TimeManager() done" << endl;
} }