Browse Source

Add transport controls to the GUI.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
ce2b1e02ed
6 changed files with 89 additions and 19 deletions
  1. +3
    -3
      Timeline/Engine.C
  2. +12
    -10
      Timeline/Timeline.C
  3. +2
    -2
      Timeline/Track.C
  4. +1
    -1
      Timeline/Transport.C
  5. +63
    -2
      Timeline/Transport.H
  6. +8
    -1
      Timeline/main.C

+ 3
- 3
Timeline/Engine.C 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;



+ 12
- 10
Timeline/Timeline.C 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;


+ 2
- 2
Timeline/Track.C 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 )


+ 1
- 1
Timeline/Transport.C View File

@@ -20,7 +20,7 @@
#include "Transport.H"
#include "Engine.H"

Transport transport;
// Transport transport;

#define client engine->client()



+ 63
- 2
Timeline/Transport.H 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;

+ 8
- 1
Timeline/main.C 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();


Loading…
Cancel
Save