Add transport controls to the GUI.

This commit is contained in:
Jonathan Moore Liles 2008-04-21 21:47:29 -05:00
parent 0a6a6b4a0a
commit ce2b1e02ed
6 changed files with 89 additions and 19 deletions

View File

@ -92,7 +92,7 @@ Engine::sync ( jack_transport_state_t state, jack_position_t *pos )
/* FIXME: what's the right thing to do here? */
// request_locate( pos->frame );
return 1;
// return transport.frame == pos->frame;
// return transport->frame == pos->frame;
break;
default:
printf( "unknown transport state.\n" );
@ -105,9 +105,9 @@ Engine::sync ( jack_transport_state_t state, jack_position_t *pos )
int
Engine::process ( nframes_t nframes )
{
transport.poll();
transport->poll();
if ( ! transport.rolling )
if ( ! transport->rolling )
/* FIXME: fill all ports with silence */
return 0;

View File

@ -561,7 +561,7 @@ Timeline::draw ( void )
void
Timeline::draw_playhead ( void )
{
int x = ( ts_to_x( transport.frame ) - ts_to_x( xoffset ) ) + tracks->x() + Track::width();
int x = ( ts_to_x( transport->frame ) - ts_to_x( xoffset ) ) + tracks->x() + Track::width();
if ( x < tracks->x() + Track::width() || x > tracks->x() + tracks->w() )
return;
@ -590,10 +590,10 @@ Timeline::redraw_playhead ( void )
{
static nframes_t last_playhead = -1;
if ( last_playhead != transport.frame )
if ( last_playhead != transport->frame )
{
redraw_overlay();
last_playhead = transport.frame;
last_playhead = transport->frame;
}
}
@ -702,19 +702,21 @@ Timeline::handle ( int m )
return 1;
}
case FL_Home:
transport.locate( 0 );
return 1;
case ' ':
transport.toggle();
return 1;
/* case FL_Home: */
/* transport->locate( 0 ); */
/* return 1; */
/* case ' ': */
/* transport->toggle(); */
/* return 1; */
case 'p':
{
int X = Fl::event_x() - Track::width();
if ( X > 0 )
{
transport.locate( xoffset + x_to_ts( X ) );
transport->locate( xoffset + x_to_ts( X ) );
}
return 1;

View File

@ -62,9 +62,9 @@ Track::cb_button ( Fl_Widget *w )
{
/* FIXME: wrong place for this! */
if ( record_button->value() )
record_ds->start( transport.frame );
record_ds->start( transport->frame );
else
record_ds->stop( transport.frame );
record_ds->stop( transport->frame );
}
else
if ( w == take_menu )

View File

@ -20,7 +20,7 @@
#include "Transport.H"
#include "Engine.H"
Transport transport;
// Transport transport;
#define client engine->client()

View File

@ -22,8 +22,69 @@
#include <jack/transport.h>
#include "types.h"
struct Transport : public jack_position_t
#include <FL/Fl_Pack.H>
#include <FL/Fl_Button.H>
#include <stdio.h>
struct Transport : public jack_position_t, public Fl_Pack
{
private:
Fl_Button *_home_button;
Fl_Button *_play_button;
Fl_Button *_record_button;
static
void
cb_button ( Fl_Widget *w, void *v )
{
((Transport*)v)->cb_button( w );
}
void
cb_button ( Fl_Widget *w )
{
if ( w == _home_button )
locate( 0 );
else if ( w == _play_button )
toggle();
else if ( w == _record_button )
printf( "FIXME: record now\n" );
}
public:
Transport ( int X, int Y, int W, int H, const char *L=0 )
: Fl_Pack( X, Y, W, H, L )
{
const int bw = W / 3;
type( HORIZONTAL );
Fl_Button *o;
_home_button = o = new Fl_Button( 0, 0, bw, 0, "@<|" );
o->labeltype( FL_EMBOSSED_LABEL );
o->callback( cb_button, this );
o->shortcut( FL_Home );
o->box( FL_UP_BOX );
_play_button = o = new Fl_Button( 0, 0, bw, 0, "@>" );
o->labeltype( FL_EMBOSSED_LABEL );
o->callback( cb_button, this );
o->shortcut( ' ' );
o->box( FL_UP_BOX );
_record_button = o = new Fl_Button( 0, 0, bw, 0, "@circle" );
o->labeltype( FL_EMBOSSED_LABEL );
o->labelcolor( FL_RED );
o->shortcut( 'R' );
o->callback( cb_button, this );
o->box( FL_UP_BOX );
end();
}
bool rolling;
void poll ( void );
@ -33,4 +94,4 @@ struct Transport : public jack_position_t
void toggle ( void );
};
extern Transport transport;
extern Transport* transport;

View File

@ -47,14 +47,16 @@
#include "Time_Sequence.H"
#include "Control_Sequence.H"
#include "Transport.H"
#include "Loggable.H"
#include "Track.H"
// #include "const.h"
#include "Engine.H"
Engine *engine;
Timeline *timeline;
Transport *transport;
void cb_undo ( Fl_Widget *w, void *v )
{
@ -67,6 +69,7 @@ main ( int argc, char **argv )
Fl_Window *main_window = new Fl_Window( 0, 0, 1024, 768 );
Fl::visual( FL_RGB8 );
Fl::visible_focus( 0 );
Fl::get_system_colors();
Fl::scheme( "plastic" );
@ -83,6 +86,10 @@ main ( int argc, char **argv )
/* TODO: change to seesion dir */
transport = new Transport( 0, 0, 300, 24 );
main_window->add( transport );
/* we don't really need a pointer for this */
engine = new Engine;
engine->init();