| @@ -21,7 +21,7 @@ | |||||
| #include "Sequence.H" | #include "Sequence.H" | ||||
| #include "Region.H" | #include "Region.H" | ||||
| #include "Track.H" | |||||
| #include <FL/Fl_Input.H> | #include <FL/Fl_Input.H> | ||||
| @@ -30,15 +30,49 @@ class Audio_Sequence : public Sequence | |||||
| protected: | protected: | ||||
| void | |||||
| get ( Log_Entry &e ) | |||||
| { | |||||
| Sequence::get( e ); | |||||
| e.add( ":t", _track ); | |||||
| } | |||||
| void | |||||
| set ( Log_Entry &e ) | |||||
| { | |||||
| Sequence::set( e ); | |||||
| for ( int i = 0; i < e.size(); ++i ) | |||||
| { | |||||
| const char *s, *v; | |||||
| e.get( i, &s, &v ); | |||||
| if ( ! strcmp( ":t", s ) ) | |||||
| { | |||||
| int i; | |||||
| sscanf( v, "%X", &i ); | |||||
| Track *t = (Track*)Loggable::find( i ); | |||||
| assert( t ); | |||||
| t->track( this ); | |||||
| } | |||||
| } | |||||
| } | |||||
| Audio_Sequence ( ) : Sequence( 0, 0, 0, 0 ) | Audio_Sequence ( ) : Sequence( 0, 0, 0, 0 ) | ||||
| { | { | ||||
| } | } | ||||
| public: | public: | ||||
| LOG_CREATE_FUNC( Audio_Sequence ); | LOG_CREATE_FUNC( Audio_Sequence ); | ||||
| Audio_Sequence ( int X, int Y, int W, int H ) : Sequence( X, Y, W, H ) | |||||
| Audio_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0, track ) | |||||
| { | { | ||||
| log_create(); | log_create(); | ||||
| } | } | ||||
| @@ -51,7 +85,7 @@ public: | |||||
| Sequence * clone_empty ( void ) | Sequence * clone_empty ( void ) | ||||
| { | { | ||||
| Audio_Sequence *t = new Audio_Sequence( x(), y(), w(), h() ); | |||||
| Audio_Sequence *t = new Audio_Sequence( track() ); | |||||
| return t; | return t; | ||||
| } | } | ||||
| @@ -0,0 +1,135 @@ | |||||
| /*******************************************************************************/ | |||||
| /* Copyright (C) 2008 Jonathan Moore Liles */ | |||||
| /* */ | |||||
| /* This program is free software; you can redistribute it and/or modify it */ | |||||
| /* under the terms of the GNU General Public License as published by the */ | |||||
| /* Free Software Foundation; either version 2 of the License, or (at your */ | |||||
| /* option) any later version. */ | |||||
| /* */ | |||||
| /* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||||
| /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||||
| /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||||
| /* more details. */ | |||||
| /* */ | |||||
| /* You should have received a copy of the GNU General Public License along */ | |||||
| /* with This program; see the file COPYING. If not,write to the Free Software */ | |||||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||||
| /*******************************************************************************/ | |||||
| #include "Control_Sequence.H" | |||||
| #include "Track.H" | |||||
| void | |||||
| Control_Sequence::get ( Log_Entry &e ) | |||||
| { | |||||
| Sequence::get( e ); | |||||
| e.add( ":t", _track ); | |||||
| } | |||||
| void | |||||
| Control_Sequence::set ( Log_Entry &e ) | |||||
| { | |||||
| Sequence::set( e ); | |||||
| for ( int i = 0; i < e.size(); ++i ) | |||||
| { | |||||
| const char *s, *v; | |||||
| e.get( i, &s, &v ); | |||||
| if ( ! strcmp( ":t", s ) ) | |||||
| { | |||||
| int i; | |||||
| sscanf( v, "%X", &i ); | |||||
| Track *t = (Track*)Loggable::find( i ); | |||||
| assert( t ); | |||||
| t->add( this ); | |||||
| } | |||||
| } | |||||
| } | |||||
| void | |||||
| Control_Sequence::draw ( void ) | |||||
| { | |||||
| if ( ! fl_not_clipped( x(), y(), w(), h() ) ) | |||||
| return; | |||||
| fl_push_clip( x(), y(), w(), h() ); | |||||
| draw_box(); | |||||
| int X, Y, W, H; | |||||
| fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); | |||||
| fl_line_style( FL_SOLID, 4 ); | |||||
| fl_color( fl_color_average( selection_color(), color(), 0.90f ) ); | |||||
| fl_begin_complex_polygon(); | |||||
| list <Sequence_Widget *>::const_iterator e = _widgets.end(); | |||||
| e--; | |||||
| if ( _widgets.size() ) | |||||
| for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); ; r++ ) | |||||
| { | |||||
| if ( r == _widgets.begin() ) | |||||
| { | |||||
| fl_vertex( x(), y() + h() ); | |||||
| fl_vertex( x(), (*r)->y() ); | |||||
| } | |||||
| fl_vertex( (*r)->x(), (*r)->y() ); | |||||
| if ( r == e ) | |||||
| { | |||||
| fl_vertex( x() + w(), (*r)->y() ); | |||||
| fl_vertex( x() + w(), y() + h() ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| fl_end_complex_polygon(); | |||||
| fl_line_style( FL_SOLID, 0 ); | |||||
| timeline->draw_measure_lines( x(), y(), w(), h(), color() ); | |||||
| for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) | |||||
| (*r)->draw_box(); | |||||
| fl_pop_clip(); | |||||
| } | |||||
| int | |||||
| Control_Sequence::handle ( int m ) | |||||
| { | |||||
| int r = Sequence::handle( m ); | |||||
| if ( r ) | |||||
| return r; | |||||
| switch ( m ) | |||||
| { | |||||
| case FL_PUSH: | |||||
| { | |||||
| if ( Fl::event_button1() ) | |||||
| { | |||||
| Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ), (float)(Fl::event_y() - y()) / h() ); | |||||
| add( r ); | |||||
| } | |||||
| return 1; | |||||
| } | |||||
| default: | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| @@ -25,6 +25,12 @@ | |||||
| class Control_Sequence : public Sequence | class Control_Sequence : public Sequence | ||||
| { | { | ||||
| protected: | |||||
| void get ( Log_Entry &e ); | |||||
| void set ( Log_Entry &e ); | |||||
| Control_Sequence ( ) : Sequence( 0, 0, 1, 1 ) | Control_Sequence ( ) : Sequence( 0, 0, 1, 1 ) | ||||
| { | { | ||||
| @@ -34,7 +40,7 @@ public: | |||||
| LOG_CREATE_FUNC( Control_Sequence ); | LOG_CREATE_FUNC( Control_Sequence ); | ||||
| Control_Sequence ( int X, int Y, int W, int H ) : Sequence( X, Y, W, H ) | |||||
| Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0, track ) | |||||
| { | { | ||||
| color( fl_darker( FL_GREEN ) ); | color( fl_darker( FL_GREEN ) ); | ||||
| @@ -48,85 +54,7 @@ public: | |||||
| const char *class_name ( void ) { return "Control_Sequence"; } | const char *class_name ( void ) { return "Control_Sequence"; } | ||||
| void | |||||
| draw ( void ) | |||||
| { | |||||
| if ( ! fl_not_clipped( x(), y(), w(), h() ) ) | |||||
| return; | |||||
| fl_push_clip( x(), y(), w(), h() ); | |||||
| draw_box(); | |||||
| int X, Y, W, H; | |||||
| fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); | |||||
| fl_line_style( FL_SOLID, 4 ); | |||||
| fl_color( fl_color_average( selection_color(), color(), 0.90f ) ); | |||||
| fl_begin_complex_polygon(); | |||||
| list <Sequence_Widget *>::const_iterator e = _widgets.end(); | |||||
| e--; | |||||
| void draw ( void ); | |||||
| int handle ( int m ); | |||||
| if ( _widgets.size() ) | |||||
| for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); ; r++ ) | |||||
| { | |||||
| if ( r == _widgets.begin() ) | |||||
| { | |||||
| fl_vertex( x(), y() + h() ); | |||||
| fl_vertex( x(), (*r)->y() ); | |||||
| } | |||||
| fl_vertex( (*r)->x(), (*r)->y() ); | |||||
| if ( r == e ) | |||||
| { | |||||
| fl_vertex( x() + w(), (*r)->y() ); | |||||
| fl_vertex( x() + w(), y() + h() ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| fl_end_complex_polygon(); | |||||
| fl_line_style( FL_SOLID, 0 ); | |||||
| timeline->draw_measure_lines( x(), y(), w(), h(), color() ); | |||||
| for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) | |||||
| (*r)->draw_box(); | |||||
| fl_pop_clip(); | |||||
| } | |||||
| int | |||||
| handle ( int m ) | |||||
| { | |||||
| int r = Sequence::handle( m ); | |||||
| if ( r ) | |||||
| return r; | |||||
| switch ( m ) | |||||
| { | |||||
| case FL_PUSH: | |||||
| { | |||||
| if ( Fl::event_button1() ) | |||||
| { | |||||
| Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ), (float)(Fl::event_y() - y()) / h() ); | |||||
| add( r ); | |||||
| } | |||||
| return 1; | |||||
| } | |||||
| default: | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| }; | }; | ||||
| @@ -46,15 +46,20 @@ Loggable::open ( const char *filename ) | |||||
| return false; | return false; | ||||
| } | } | ||||
| /* TODO: replay log here */ | |||||
| /* FIXME: handle transactions!!! */ | |||||
| /* replay log */ | |||||
| { | { | ||||
| char buf[BUFSIZ]; | char buf[BUFSIZ]; | ||||
| while ( fscanf( fp, "%[^\n]\n", buf ) == 1 ) | while ( fscanf( fp, "%[^\n]\n", buf ) == 1 ) | ||||
| { | { | ||||
| do_this( buf, false ); | |||||
| if ( ! ( ! strcmp( buf, "{" ) || ! strcmp( buf, "}" ) ) ) | |||||
| { | |||||
| if ( *buf == '\t' ) | |||||
| do_this( buf + 1, false ); | |||||
| else | |||||
| do_this( buf, false ); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -113,8 +118,10 @@ parse_alist( const char *s ) | |||||
| if ( *v == '"' ) | if ( *v == '"' ) | ||||
| { | { | ||||
| v++; | |||||
| // v++; | |||||
| v[ strlen( v ) - 2 ] = '\0'; | v[ strlen( v ) - 2 ] = '\0'; | ||||
| memmove( v, v + 1, strlen( v ) + 1 ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -191,13 +198,19 @@ Loggable::do_this ( const char *s, bool reverse ) | |||||
| } | } | ||||
| else if ( ! strcmp( command, create ) ) | else if ( ! strcmp( command, create ) ) | ||||
| { | { | ||||
| char **sa = parse_alist( arguments ); | |||||
| char **sa = NULL; | |||||
| if ( arguments ) | |||||
| sa = parse_alist( arguments ); | |||||
| Log_Entry e( sa ); | Log_Entry e( sa ); | ||||
| if ( ! _class_map[ string( classname ) ] ) | |||||
| printf( "error class %s is unregistered!\n", classname ); | |||||
| else | |||||
| assert( _class_map[ string( classname ) ] ); | |||||
| /* if ( ! _class_map[ string( classname ) ] ) */ | |||||
| /* printf( "error class %s is unregistered!\n", classname ); */ | |||||
| /* else */ | |||||
| { | { | ||||
| /* create */ | /* create */ | ||||
| Loggable *l = _class_map[ string( classname ) ]( e ); | Loggable *l = _class_map[ string( classname ) ]( e ); | ||||
| @@ -136,9 +136,11 @@ public: | |||||
| { | { | ||||
| assert( _id == _log_id ); | assert( _id == _log_id ); | ||||
| assert( _loggables[ _id - 1 ] == this ); | |||||
| _loggables[ _id - 1 ] = NULL; | _loggables[ _id - 1 ] = NULL; | ||||
| --_log_id; | |||||
| // --_log_id; | |||||
| _id = id; | _id = id; | ||||
| @@ -250,6 +252,7 @@ public: | |||||
| if ( _sa ) | if ( _sa ) | ||||
| while ( _sa[ _i ] ) ++_i; | while ( _sa[ _i ] ) ++_i; | ||||
| } | } | ||||
| ~Log_Entry ( ) | ~Log_Entry ( ) | ||||
| @@ -5,6 +5,7 @@ SRCS= \ | |||||
| main.C \ | main.C \ | ||||
| Sequence.C \ | Sequence.C \ | ||||
| Audio_Sequence.C \ | Audio_Sequence.C \ | ||||
| Control_Sequence.C \ | |||||
| Timeline.C \ | Timeline.C \ | ||||
| Track.C \ | Track.C \ | ||||
| Sequence_Widget.C \ | Sequence_Widget.C \ | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include <FL/fl_draw.H> | #include <FL/fl_draw.H> | ||||
| #include "Track.H" | |||||
| queue <Sequence_Widget *> Sequence::_delete_queue; | queue <Sequence_Widget *> Sequence::_delete_queue; | ||||
| @@ -32,6 +33,9 @@ Sequence::Sequence ( int X, int Y, int W, int H, Track *track ) : Fl_Widget( X, | |||||
| _name = NULL; | _name = NULL; | ||||
| _track = track; | _track = track; | ||||
| if ( track ) | |||||
| track->add( this ); | |||||
| box( FL_DOWN_BOX ); | box( FL_DOWN_BOX ); | ||||
| color( fl_darker( FL_GRAY ) ); | color( fl_darker( FL_GRAY ) ); | ||||
| align( FL_ALIGN_LEFT ); | align( FL_ALIGN_LEFT ); | ||||
| @@ -43,24 +43,40 @@ class Sequence_Widget; | |||||
| class Sequence : public Fl_Widget, public Loggable | class Sequence : public Fl_Widget, public Loggable | ||||
| { | { | ||||
| Track *_track; /* track this sequence belongs to */ | |||||
| char *_name; | |||||
| static queue <Sequence_Widget *> _delete_queue; | static queue <Sequence_Widget *> _delete_queue; | ||||
| protected: | protected: | ||||
| Track *_track; /* track this sequence belongs to */ | |||||
| char *_name; | |||||
| std::list <Sequence_Widget *> _widgets; | std::list <Sequence_Widget *> _widgets; | ||||
| Sequence_Widget *event_widget ( void ); | Sequence_Widget *event_widget ( void ); | ||||
| virtual const char *class_name ( void ) { return "Sequence"; } | virtual const char *class_name ( void ) { return "Sequence"; } | ||||
| virtual void set ( Log_Entry &e ) { return; } | |||||
| virtual void set ( Log_Entry &e ) | |||||
| { | |||||
| for ( int i = 0; i < e.size(); ++i ) | |||||
| { | |||||
| const char *s, *v; | |||||
| e.get( i, &s, &v ); | |||||
| if ( ! strcmp( ":n", s ) ) | |||||
| { | |||||
| name( strdup( v ) ); | |||||
| } | |||||
| } | |||||
| } | |||||
| virtual void get ( Log_Entry &e ) | virtual void get ( Log_Entry &e ) | ||||
| { | { | ||||
| e.add( ":n", name() ); | |||||
| // e.add( ":t", _track ); | |||||
| /* s += sprintf( s, ":items " ); */ | /* s += sprintf( s, ":items " ); */ | ||||
| /* for ( list <Sequence_Widget *>::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) */ | /* for ( list <Sequence_Widget *>::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) */ | ||||
| @@ -81,10 +97,18 @@ public: | |||||
| virtual ~Sequence ( ); | virtual ~Sequence ( ); | ||||
| const char * name ( void ) const { return _name; } | const char * name ( void ) const { return _name; } | ||||
| void name ( char *s ) { if ( _name ) free( _name ); _name = s; label( _name ); } | |||||
| void name ( const char *s ) | |||||
| { | |||||
| if ( _name ) free( _name ); | |||||
| _name = strdup( s ); | |||||
| label( _name ); | |||||
| } | |||||
| void sort ( void ); | void sort ( void ); | ||||
| Track *track ( void ) const { return _track; } | |||||
| void track ( Track *t ) { _track = t; } | |||||
| void remove ( Sequence_Widget *r ); | void remove ( Sequence_Widget *r ); | ||||
| void add ( Sequence_Widget *r ); | void add ( Sequence_Widget *r ); | ||||
| @@ -109,7 +109,7 @@ protected: | |||||
| else | else | ||||
| deselect(); | deselect(); | ||||
| } | } | ||||
| else if ( ! strcmp( s, ":track" ) ) | |||||
| else if ( ! strcmp( s, ":t" ) ) | |||||
| { | { | ||||
| int i; | int i; | ||||
| sscanf( v, "%X", &i ); | sscanf( v, "%X", &i ); | ||||
| @@ -115,8 +115,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||||
| o->color( FL_RED ); | o->color( FL_RED ); | ||||
| o->add( new Tempo_Point( 0, 120 ) ); | |||||
| o->add( new Tempo_Point( 56000, 250 ) ); | |||||
| /* o->add( new Tempo_Point( 0, 120 ) ); */ | |||||
| /* o->add( new Tempo_Point( 56000, 250 ) ); */ | |||||
| o->label( "Tempo" ); | o->label( "Tempo" ); | ||||
| o->align( FL_ALIGN_LEFT ); | o->align( FL_ALIGN_LEFT ); | ||||
| @@ -131,8 +131,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi | |||||
| o->color( fl_color_average( FL_RED, FL_WHITE, 0.50f ) ); | o->color( fl_color_average( FL_RED, FL_WHITE, 0.50f ) ); | ||||
| o->add( new Time_Point( 0, 4, 4 ) ); | |||||
| o->add( new Time_Point( 345344, 6, 8 ) ); | |||||
| /* o->add( new Time_Point( 0, 4, 4 ) ); */ | |||||
| /* o->add( new Time_Point( 345344, 6, 8 ) ); */ | |||||
| o->label( "Time" ); | o->label( "Time" ); | ||||
| o->align( FL_ALIGN_LEFT ); | o->align( FL_ALIGN_LEFT ); | ||||
| @@ -748,21 +748,25 @@ Timeline::handle ( int m ) | |||||
| { | { | ||||
| /* FIXME: prompt for I/O config? */ | /* FIXME: prompt for I/O config? */ | ||||
| Loggable::block_start(); | |||||
| /* add audio track */ | /* add audio track */ | ||||
| char *name = get_unique_track_name( "Audio" ); | char *name = get_unique_track_name( "Audio" ); | ||||
| Track *t = new Track( 0, 0, tracks->w(), 30, name ); | |||||
| Track *t = new Track( name ); | |||||
| add_track( t ); | add_track( t ); | ||||
| Sequence *o = new Audio_Sequence( 0, 0, 1, 100 ); | |||||
| Sequence *o = new Audio_Sequence( t ); | |||||
| new Control_Sequence( t ); | |||||
| t->track( o ); | t->track( o ); | ||||
| // t->add( new Audio_Sequence( 0, 0, 1, 100 ) ); | |||||
| // t->add( new Audio_Sequence( 0, 0, 1, 100 ) ); | |||||
| t->add_control( new Control_Sequence( 0, 0, 1, 100 ) ); | |||||
| /* t->add( new Control_Sequence( t ); */ | |||||
| t->color( (Fl_Color)rand() ); | t->color( (Fl_Color)rand() ); | ||||
| Loggable::block_end(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -809,18 +813,18 @@ Timeline::handle ( int m ) | |||||
| bool | |||||
| Timeline::track_name_exists ( const char *name ) | |||||
| Track * | |||||
| Timeline::track_by_name ( const char *name ) | |||||
| { | { | ||||
| for ( int i = tracks->children(); i-- ; ) | for ( int i = tracks->children(); i-- ; ) | ||||
| { | { | ||||
| Track *t = (Track*)tracks->child( i ); | Track *t = (Track*)tracks->child( i ); | ||||
| if ( ! strcmp( name, t->name() ) ) | if ( ! strcmp( name, t->name() ) ) | ||||
| return true; | |||||
| return t; | |||||
| } | } | ||||
| return false; | |||||
| return NULL; | |||||
| } | } | ||||
| char * | char * | ||||
| @@ -830,7 +834,7 @@ Timeline::get_unique_track_name ( const char *name ) | |||||
| strcpy( pat, name ); | strcpy( pat, name ); | ||||
| for ( int i = 1; track_name_exists( pat ); ++i ) | |||||
| for ( int i = 1; track_by_name( pat ); ++i ) | |||||
| snprintf( pat, sizeof( pat ), "%s.%d", name, i ); | snprintf( pat, sizeof( pat ), "%s.%d", name, i ); | ||||
| return strdup( pat ); | return strdup( pat ); | ||||
| @@ -157,7 +157,7 @@ private: | |||||
| friend class Engine; // FIXME: only Engine::process() needs to be friended.x | friend class Engine; // FIXME: only Engine::process() needs to be friended.x | ||||
| bool track_name_exists ( const char *name ); | |||||
| Track * track_by_name ( const char *name ); | |||||
| char * get_unique_track_name ( const char *name ); | char * get_unique_track_name ( const char *name ); | ||||
| /* Engine */ | /* Engine */ | ||||
| @@ -96,8 +96,8 @@ Track::cb_button ( Fl_Widget *w ) | |||||
| } | } | ||||
| } | } | ||||
| Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||||
| Fl_Group ( X, Y, W, H, L ) | |||||
| void | |||||
| Track::init ( void ) | |||||
| { | { | ||||
| _capture = NULL; | _capture = NULL; | ||||
| _track = NULL; | _track = NULL; | ||||
| @@ -108,8 +108,7 @@ Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||||
| labeltype( FL_NO_LABEL ); | labeltype( FL_NO_LABEL ); | ||||
| Fl_Group::size( w(), height() ); | |||||
| Fl_Group::size( timeline->w(), height() ); | |||||
| Track *o = this; | Track *o = this; | ||||
| o->box( FL_THIN_UP_BOX ); | o->box( FL_THIN_UP_BOX ); | ||||
| @@ -204,15 +203,23 @@ Track::Track ( int X, int Y, int W, int H, const char *L ) : | |||||
| } | } | ||||
| end(); | end(); | ||||
| if ( L ) | |||||
| name( L ); | |||||
| /* FIXME: should be configurable, but where? */ | /* FIXME: should be configurable, but where? */ | ||||
| create_outputs( 2 ); | create_outputs( 2 ); | ||||
| create_inputs( 2 ); | create_inputs( 2 ); | ||||
| playback_ds = new Playback_DS( this, engine->frame_rate(), engine->nframes(), output.size() ); | playback_ds = new Playback_DS( this, engine->frame_rate(), engine->nframes(), output.size() ); | ||||
| record_ds = new Record_DS( this, engine->frame_rate(), engine->nframes(), input.size() ); | record_ds = new Record_DS( this, engine->frame_rate(), engine->nframes(), input.size() ); | ||||
| } | |||||
| Track::Track ( const char *L ) : | |||||
| Fl_Group ( 0, 0, 0, 0, L ) | |||||
| { | |||||
| init(); | |||||
| if ( L ) | |||||
| name( L ); | |||||
| log_create(); | log_create(); | ||||
| } | } | ||||
| @@ -278,14 +285,13 @@ Track::size ( int v ) | |||||
| } | } | ||||
| void | void | ||||
| Track::track( Sequence * t ) | |||||
| Track::track ( Sequence * t ) | |||||
| { | { | ||||
| // t->size( 1, h() ); | |||||
| t->track( this ); | |||||
| if ( track() ) | if ( track() ) | ||||
| add( track() ); | add( track() ); | ||||
| // takes->insert( *track(), 0 ); | |||||
| _track = t; | _track = t; | ||||
| pack->insert( *t, 0 ); | pack->insert( *t, 0 ); | ||||
| @@ -293,14 +299,71 @@ Track::track( Sequence * t ) | |||||
| } | } | ||||
| void | void | ||||
| Track::add_control( Sequence *t ) | |||||
| Track::add ( Control_Sequence *t ) | |||||
| { | { | ||||
| t->track( this ); | |||||
| control->add( t ); | control->add( t ); | ||||
| resize(); | resize(); | ||||
| } | } | ||||
| void | |||||
| Track::draw ( void ) | |||||
| { | |||||
| if ( _selected ) | |||||
| { | |||||
| Fl_Color c = color(); | |||||
| color( FL_RED ); | |||||
| Fl_Group::draw(); | |||||
| color( c ); | |||||
| } | |||||
| else | |||||
| Fl_Group::draw(); | |||||
| if ( ! name_field->visible() ) | |||||
| { | |||||
| fl_color( FL_WHITE ); | |||||
| fl_font( FL_HELVETICA, 14 ); | |||||
| fl_draw( name_field->value(), name_field->x(), name_field->y(), name_field->w(), name_field->h(), FL_ALIGN_CENTER ); | |||||
| } | |||||
| } | |||||
| int | |||||
| Track::handle ( int m ) | |||||
| { | |||||
| Logger log( this ); | |||||
| switch ( m ) | |||||
| { | |||||
| case FL_MOUSEWHEEL: | |||||
| { | |||||
| if ( ! Fl::event_shift() ) | |||||
| return 0; | |||||
| int d = Fl::event_dy(); | |||||
| printf( "%d\n", d ); | |||||
| if ( d < 0 ) | |||||
| size( size() - 1 ); | |||||
| else | |||||
| size( size() + 1 ); | |||||
| return 1; | |||||
| } | |||||
| default: | |||||
| return Fl_Group::handle( m ); | |||||
| } | |||||
| } | |||||
| /**********/ | /**********/ | ||||
| /* Engine */ | /* Engine */ | ||||
| /**********/ | /**********/ | ||||
| @@ -38,6 +38,9 @@ using std::vector; | |||||
| #include "Port.H" | #include "Port.H" | ||||
| #include "Timeline.H" | |||||
| #include "Control_Sequence.H" | |||||
| class Playback_DS; | class Playback_DS; | ||||
| class Record_DS; | class Record_DS; | ||||
| class Port; | class Port; | ||||
| @@ -48,7 +51,7 @@ class Track : public Fl_Group, public Loggable | |||||
| public: | public: | ||||
| Track ( int X, int Y, int W, int H, const char *L = 0 ); | |||||
| Track ( const char *L ); | |||||
| ~Track ( ); | ~Track ( ); | ||||
| private: | private: | ||||
| @@ -75,34 +78,38 @@ private: | |||||
| Track ( ) : Fl_Group( 0, 0, 1, 1 ) | Track ( ) : Fl_Group( 0, 0, 1, 1 ) | ||||
| { | { | ||||
| init(); | |||||
| timeline->add_track( this ); | |||||
| } | } | ||||
| void init ( void ); | |||||
| public: | public: | ||||
| Fl_Input * name_field; | |||||
| Fl_Button *record_button; | |||||
| Fl_Button *mute_button; | |||||
| Fl_Button *solo_button; | |||||
| Fl_Input *name_field; | |||||
| Fl_Button *record_button; | |||||
| Fl_Button *mute_button; | |||||
| Fl_Button *solo_button; | |||||
| Fl_Menu_Button *take_menu; | Fl_Menu_Button *take_menu; | ||||
| Fl_Group *controls; | |||||
| Fl_Group *controls; | |||||
| Fl_Pack *pack; | |||||
| Fl_Pack *control; | |||||
| Fl_Pack *takes; | |||||
| Fl_Pack *pack; | |||||
| Fl_Pack *control; | |||||
| Fl_Pack *takes; | |||||
| vector <Port> input; | |||||
| vector <Port> output; /* output ports... */ | |||||
| vector<Port> input; /* input ports... */ | |||||
| vector<Port> output; /* output ports... */ | |||||
| Playback_DS *playback_ds; | |||||
| Record_DS *record_ds; | |||||
| Playback_DS *playback_ds; | |||||
| Record_DS *record_ds; | |||||
| const char *class_name ( void ) { return "Track"; } | const char *class_name ( void ) { return "Track"; } | ||||
| void | void | ||||
| set ( Log_Entry &e ) | set ( Log_Entry &e ) | ||||
| { | { | ||||
| for ( int i = 0; e.size(); ++i ) | |||||
| for ( int i = 0; i < e.size(); ++i ) | |||||
| { | { | ||||
| const char *s, *v; | const char *s, *v; | ||||
| @@ -120,7 +127,9 @@ public: | |||||
| else if ( ! strcmp( s, ":n" ) ) | else if ( ! strcmp( s, ":n" ) ) | ||||
| { | { | ||||
| _name = strdup( v ); | _name = strdup( v ); | ||||
| name_field->value( _name ); | |||||
| /* FIXME: bogus */ | |||||
| if ( name_field ) | |||||
| name_field->value( _name ); | |||||
| } | } | ||||
| else if ( ! strcmp( s, ":t" ) ) | else if ( ! strcmp( s, ":t" ) ) | ||||
| { | { | ||||
| @@ -152,31 +161,7 @@ public: | |||||
| /* for loggable */ | /* for loggable */ | ||||
| LOG_CREATE_FUNC( Track ); | LOG_CREATE_FUNC( Track ); | ||||
| void | |||||
| draw ( void ) | |||||
| { | |||||
| if ( _selected ) | |||||
| { | |||||
| Fl_Color c = color(); | |||||
| color( FL_RED ); | |||||
| Fl_Group::draw(); | |||||
| color( c ); | |||||
| } | |||||
| else | |||||
| Fl_Group::draw(); | |||||
| if ( ! name_field->visible() ) | |||||
| { | |||||
| fl_color( FL_WHITE ); | |||||
| fl_font( FL_HELVETICA, 14 ); | |||||
| fl_draw( name_field->value(), name_field->x(), name_field->y(), name_field->w(), name_field->h(), FL_ALIGN_CENTER ); | |||||
| } | |||||
| } | |||||
| void add_control( Sequence *t ); | |||||
| void add ( Control_Sequence *t ); | |||||
| int size ( void ) const { return _size; } | int size ( void ) const { return _size; } | ||||
| @@ -239,32 +224,9 @@ public: | |||||
| // take_menu->remove( t->name() ); | // take_menu->remove( t->name() ); | ||||
| } | } | ||||
| int handle ( int m ) | |||||
| { | |||||
| switch ( m ) | |||||
| { | |||||
| case FL_MOUSEWHEEL: | |||||
| { | |||||
| if ( ! Fl::event_shift() ) | |||||
| return 0; | |||||
| int d = Fl::event_dy(); | |||||
| printf( "%d\n", d ); | |||||
| if ( d < 0 ) | |||||
| size( size() - 1 ); | |||||
| else | |||||
| size( size() + 1 ); | |||||
| return 1; | |||||
| } | |||||
| default: | |||||
| return Fl_Group::handle( m ); | |||||
| } | |||||
| } | |||||
| void draw ( void ); | |||||
| int handle ( int m ); | |||||
| /* Engine */ | /* Engine */ | ||||
| nframes_t process ( nframes_t nframes ); | nframes_t process ( nframes_t nframes ); | ||||