| @@ -40,6 +40,9 @@ Timeline::record ( void ) | |||||
| nframes_t frame = transport->frame; | nframes_t frame = transport->frame; | ||||
| if ( transport->punch_enabled() && frame < range_start() ) | |||||
| frame = range_start(); | |||||
| DMESSAGE( "Going to record starting at frame %lu", (unsigned long)frame ); | DMESSAGE( "Going to record starting at frame %lu", (unsigned long)frame ); | ||||
| for ( int i = tracks->children(); i-- ; ) | for ( int i = tracks->children(); i-- ; ) | ||||
| @@ -61,6 +64,9 @@ Timeline::stop ( void ) | |||||
| { | { | ||||
| nframes_t frame = transport->frame; | nframes_t frame = transport->frame; | ||||
| if ( transport->punch_enabled() && frame > range_end() ) | |||||
| frame = range_end(); | |||||
| for ( int i = tracks->children(); i-- ; ) | for ( int i = tracks->children(); i-- ; ) | ||||
| { | { | ||||
| Track *t = (Track*)tracks->child( i ); | Track *t = (Track*)tracks->child( i ); | ||||
| @@ -202,7 +202,7 @@ Track::process_output ( nframes_t nframes ) | |||||
| } | } | ||||
| /* FIXME: should we blank the control output here or leave it floating? */ | /* FIXME: should we blank the control output here or leave it floating? */ | ||||
| for ( int i = control->children(); i--; ) | |||||
| for ( int i = 0; i < control->children(); i++ ) | |||||
| ((Control_Sequence*)control->child( i ))->process( nframes ); | ((Control_Sequence*)control->child( i ))->process( nframes ); | ||||
| if ( playback_ds ) | if ( playback_ds ) | ||||
| @@ -855,7 +855,15 @@ if ( engine && engine->zombified() && ! zombie ) | |||||
| } | } | ||||
| solo_blinker->value( Track::soloing() ); | solo_blinker->value( Track::soloing() ); | ||||
| rec_blinker->value( transport->rolling && transport->rec_enabled() ); | |||||
| if ( transport->punch_enabled() ) | |||||
| rec_blinker->value( transport->rolling && | |||||
| transport->rec_enabled() && | |||||
| transport->frame >= timeline->range_start() && | |||||
| transport->frame <= timeline->range_end() ); | |||||
| else | |||||
| rec_blinker->value( transport->rolling && transport->rec_enabled() ); | |||||
| sm_blinker->value( timeline->session_manager_name() != NULL ); | sm_blinker->value( timeline->session_manager_name() != NULL ); | ||||
| sm_blinker->tooltip( timeline->session_manager_name() ); | sm_blinker->tooltip( timeline->session_manager_name() ); | ||||
| selected_blinker->value( timeline->nselected() ); | selected_blinker->value( timeline->nselected() ); | ||||
| @@ -1058,6 +1058,15 @@ Timeline::redraw_playhead ( void ) | |||||
| static nframes_t last_playhead = -1; | static nframes_t last_playhead = -1; | ||||
| static int last_playhead_x = -1; | static int last_playhead_x = -1; | ||||
| /* FIXME: kind of a hackish way to invoke punch stop from the UI thread... */ | |||||
| if ( transport->rolling && | |||||
| transport->rec_enabled() && | |||||
| transport->punch_enabled() && | |||||
| transport->frame > range_end() ) | |||||
| transport->stop(); | |||||
| int playhead_x = ts_to_x( transport->frame ); | int playhead_x = ts_to_x( transport->frame ); | ||||
| if ( last_playhead_x != playhead_x ) | if ( last_playhead_x != playhead_x ) | ||||
| @@ -45,7 +45,7 @@ Transport::Transport ( int X, int Y, int W, int H, const char *L ) | |||||
| frame_rate = 48000; | frame_rate = 48000; | ||||
| frame = 0; | frame = 0; | ||||
| const int bw = W / 3; | |||||
| const int bw = W / 5; | |||||
| type( HORIZONTAL ); | type( HORIZONTAL ); | ||||
| @@ -77,6 +77,16 @@ Transport::Transport ( int X, int Y, int W, int H, const char *L ) | |||||
| o->when( FL_WHEN_CHANGED ); | o->when( FL_WHEN_CHANGED ); | ||||
| o->box( FL_UP_BOX ); | o->box( FL_UP_BOX ); | ||||
| _punch_button = o = new Fl_Button( 0, 0, bw, 0, "Punch" ); | |||||
| o->type( FL_TOGGLE_BUTTON ); | |||||
| o->labelsize( 9 ); | |||||
| o->labeltype( FL_NORMAL_LABEL ); | |||||
| o->shortcut( 'P' ); | |||||
| o->callback( cb_button, this ); | |||||
| o->when( FL_WHEN_CHANGED ); | |||||
| o->color2( FL_GREEN ); | |||||
| o->box( FL_UP_BOX ); | |||||
| end(); | end(); | ||||
| } | } | ||||
| @@ -147,6 +157,12 @@ Transport::rec_enabled ( void ) const | |||||
| return _record_button->value(); | return _record_button->value(); | ||||
| } | } | ||||
| bool | |||||
| Transport::punch_enabled ( void ) const | |||||
| { | |||||
| return _punch_button->value(); | |||||
| } | |||||
| int | int | ||||
| Transport::handle ( int m ) | Transport::handle ( int m ) | ||||
| { | { | ||||
| @@ -23,8 +23,6 @@ | |||||
| #include <jack/transport.h> | #include <jack/transport.h> | ||||
| #include "types.h" | #include "types.h" | ||||
| #include "Timeline.H" | |||||
| #include <FL/Fl_Pack.H> | #include <FL/Fl_Pack.H> | ||||
| #include <FL/Fl_Button.H> | #include <FL/Fl_Button.H> | ||||
| @@ -48,6 +46,7 @@ private: | |||||
| Fl_Button *_end_button; | Fl_Button *_end_button; | ||||
| Fl_Button *_play_button; | Fl_Button *_play_button; | ||||
| Fl_Button *_record_button; | Fl_Button *_record_button; | ||||
| Fl_Button *_punch_button; | |||||
| void update_record_state ( void ); | void update_record_state ( void ); | ||||
| @@ -56,6 +55,7 @@ public: | |||||
| Transport ( int X, int Y, int W, int H, const char *L=0 ); | Transport ( int X, int Y, int W, int H, const char *L=0 ); | ||||
| bool rec_enabled ( void ) const; | bool rec_enabled ( void ) const; | ||||
| bool punch_enabled ( void ) const; | |||||
| void stop_disables_record ( bool b ) { _stop_disables_record = b; } | void stop_disables_record ( bool b ) { _stop_disables_record = b; } | ||||
| bool stop_disables_record ( void ) const { return _stop_disables_record; } | bool stop_disables_record ( void ) const { return _stop_disables_record; } | ||||