| @@ -36,7 +36,7 @@ Timeline::record ( void ) | |||||
| { | { | ||||
| /* FIXME: right place for this? */ | /* FIXME: right place for this? */ | ||||
| if ( Timeline::automatically_create_takes && | |||||
| if ( transport->automatically_create_takes() && | |||||
| ! _created_new_takes ) | ! _created_new_takes ) | ||||
| { | { | ||||
| add_take_for_armed_tracks(); | add_take_for_armed_tracks(); | ||||
| @@ -249,11 +249,11 @@ Loggable::progress_callback( &TLE::progress_cb, this );} {} | |||||
| label {Non DAW : Timeline} | label {Non DAW : Timeline} | ||||
| callback {if ( Fl::event_key() != FL_Escape ) | callback {if ( Fl::event_key() != FL_Escape ) | ||||
| timeline->command_quit();} open | timeline->command_quit();} open | ||||
| xywh {262 208 1025 770} type Double resizable | |||||
| xywh {516 306 1025 770} type Double resizable | |||||
| class TLE_Window xclass Non_DAW size_range {900 300 0 0} visible | class TLE_Window xclass Non_DAW size_range {900 300 0 0} visible | ||||
| } { | } { | ||||
| Fl_Group {} { | |||||
| xywh {0 0 1025 73} box FLAT_BOX | |||||
| Fl_Group {} {open | |||||
| xywh {0 -53 1025 126} box FLAT_BOX | |||||
| } { | } { | ||||
| Fl_Menu_Bar menubar {open | Fl_Menu_Bar menubar {open | ||||
| private xywh {0 0 1025 25} | private xywh {0 0 1025 25} | ||||
| @@ -601,12 +601,12 @@ timeline->redraw();} | |||||
| } | } | ||||
| MenuItem {} { | MenuItem {} { | ||||
| label {Loop Playback} | label {Loop Playback} | ||||
| callback {timeline->loop_playback = ( ((Fl_Menu_*)o)->mvalue()->flags & FL_MENU_VALUE );} | |||||
| callback {transport->loop_enabled( ( ((Fl_Menu_*)o)->mvalue()->flags & FL_MENU_VALUE )) ;} | |||||
| xywh {10 10 40 25} type Toggle | xywh {10 10 40 25} type Toggle | ||||
| } | } | ||||
| MenuItem {} { | MenuItem {} { | ||||
| label {Automatically Create Takes} | label {Automatically Create Takes} | ||||
| callback {timeline->automatically_create_takes = ( ((Fl_Menu_*)o)->mvalue()->flags & FL_MENU_VALUE );} | |||||
| callback {transport->automatically_create_takes( ( ((Fl_Menu_*)o)->mvalue()->flags & FL_MENU_VALUE ));} | |||||
| xywh {10 10 40 25} type Toggle | xywh {10 10 40 25} type Toggle | ||||
| } | } | ||||
| } | } | ||||
| @@ -641,31 +641,30 @@ ab.run();} | |||||
| } | } | ||||
| } | } | ||||
| Fl_Pack {} {open | Fl_Pack {} {open | ||||
| xywh {3 28 477 44} type HORIZONTAL | |||||
| xywh {1 27 584 46} type HORIZONTAL | |||||
| code0 {o->spacing( 10 );} | code0 {o->spacing( 10 );} | ||||
| } { | } { | ||||
| Fl_Box {} { | Fl_Box {} { | ||||
| label {<Transport>} | label {<Transport>} | ||||
| xywh {5 30 185 37} color 30 | |||||
| xywh {5 28 290 44} color 30 | |||||
| code0 {transport = o;} | code0 {transport = o;} | ||||
| code1 {o->labeltype( FL_NO_LABEL );} | code1 {o->labeltype( FL_NO_LABEL );} | ||||
| code2 {o->spacing( 1 );} | |||||
| class Transport | class Transport | ||||
| } | } | ||||
| Fl_Pack clocks_pack {open | Fl_Pack clocks_pack {open | ||||
| private xywh {195 28 285 44} type HORIZONTAL | |||||
| private xywh {295 30 290 41} type HORIZONTAL | |||||
| code0 {o->spacing( 2 );} | code0 {o->spacing( 2 );} | ||||
| } { | } { | ||||
| Fl_Box {} { | Fl_Box {} { | ||||
| label PLAYHEAD | |||||
| private xywh {196 28 137 40} box BORDER_BOX color 40 | |||||
| label PLAYHEAD selected | |||||
| private xywh {301 30 137 41} box FLAT_BOX color 47 | |||||
| code0 {o->type( Clock::HMS );} | code0 {o->type( Clock::HMS );} | ||||
| code1 {o->run( &transport->frame );} | code1 {o->run( &transport->frame );} | ||||
| class Clock | class Clock | ||||
| } | } | ||||
| Fl_Box {} { | Fl_Box {} { | ||||
| label PLAYHEAD | |||||
| xywh {335 32 137 37} box BORDER_BOX color 40 | |||||
| label PLAYHEAD selected | |||||
| xywh {440 30 137 41} box FLAT_BOX color 47 | |||||
| code0 {o->type( Clock::BBT );} | code0 {o->type( Clock::BBT );} | ||||
| code1 {o->run( &transport->frame );} | code1 {o->run( &transport->frame );} | ||||
| class Clock | class Clock | ||||
| @@ -674,7 +673,7 @@ ab.run();} | |||||
| } | } | ||||
| Fl_Box {} { | Fl_Box {} { | ||||
| label {<empty>} | label {<empty>} | ||||
| xywh {475 32 265 40} resizable | |||||
| xywh {585 32 155 40} resizable | |||||
| code0 {o->labeltype( FL_NO_LABEL );} | code0 {o->labeltype( FL_NO_LABEL );} | ||||
| } | } | ||||
| Fl_Group {} {open | Fl_Group {} {open | ||||
| @@ -718,7 +717,7 @@ ab.run();} | |||||
| xywh {740 31 115 40} | xywh {740 31 115 40} | ||||
| } { | } { | ||||
| Fl_Button solo_blinker { | Fl_Button solo_blinker { | ||||
| label SOLO selected | |||||
| label SOLO | |||||
| xywh {800 33 50 15} box BORDER_BOX down_box BORDER_BOX color 74 selection_color 92 labelfont 1 labelsize 11 labelcolor 32 | xywh {800 33 50 15} box BORDER_BOX down_box BORDER_BOX color 74 selection_color 92 labelfont 1 labelsize 11 labelcolor 32 | ||||
| code0 {\#include "FL/Fl_Blink_Button.H"} | code0 {\#include "FL/Fl_Blink_Button.H"} | ||||
| code1 {o->box( FL_ASYM_BOX );} | code1 {o->box( FL_ASYM_BOX );} | ||||
| @@ -727,7 +726,7 @@ ab.run();} | |||||
| class Fl_Blink_Button | class Fl_Blink_Button | ||||
| } | } | ||||
| Fl_Button rec_blinker { | Fl_Button rec_blinker { | ||||
| label REC selected | |||||
| label REC | |||||
| xywh {800 53 50 15} box BORDER_BOX down_box BORDER_BOX color 72 selection_color 88 labelfont 1 labelsize 11 labelcolor 32 | xywh {800 53 50 15} box BORDER_BOX down_box BORDER_BOX color 72 selection_color 88 labelfont 1 labelsize 11 labelcolor 32 | ||||
| code0 {\#include "FL/Fl_Blink_Button.H"} | code0 {\#include "FL/Fl_Blink_Button.H"} | ||||
| code1 {o->box( FL_ASYM_BOX );} | code1 {o->box( FL_ASYM_BOX );} | ||||
| @@ -736,7 +735,7 @@ ab.run();} | |||||
| class Fl_Blink_Button | class Fl_Blink_Button | ||||
| } | } | ||||
| Fl_Button selected_blinker { | Fl_Button selected_blinker { | ||||
| label SEL selected | |||||
| label SEL | |||||
| xywh {745 53 50 15} box BORDER_BOX down_box BORDER_BOX color 13 selection_color 5 labelfont 1 labelsize 11 labelcolor 32 | xywh {745 53 50 15} box BORDER_BOX down_box BORDER_BOX color 13 selection_color 5 labelfont 1 labelsize 11 labelcolor 32 | ||||
| code0 {\#include "FL/Fl_Blink_Button.H"} | code0 {\#include "FL/Fl_Blink_Button.H"} | ||||
| code1 {o->box( FL_ASYM_BOX );} | code1 {o->box( FL_ASYM_BOX );} | ||||
| @@ -745,7 +744,7 @@ ab.run();} | |||||
| class Fl_Blink_Button | class Fl_Blink_Button | ||||
| } | } | ||||
| Fl_Button seek_blinker { | Fl_Button seek_blinker { | ||||
| label SEEK selected | |||||
| label SEEK | |||||
| xywh {745 33 50 15} box BORDER_BOX down_box BORDER_BOX color 10 selection_color 2 labelfont 1 labelsize 11 labelcolor 32 | xywh {745 33 50 15} box BORDER_BOX down_box BORDER_BOX color 10 selection_color 2 labelfont 1 labelsize 11 labelcolor 32 | ||||
| code0 {\#include "FL/Fl_Blink_Button.H"} | code0 {\#include "FL/Fl_Blink_Button.H"} | ||||
| code1 {o->box( FL_ASYM_BOX );} | code1 {o->box( FL_ASYM_BOX );} | ||||
| @@ -959,8 +958,7 @@ if ( p != oldp ) | |||||
| progress->redraw(); | progress->redraw(); | ||||
| Fl::check(); | Fl::check(); | ||||
| } | |||||
| } {} | |||||
| }} {} | |||||
| } | } | ||||
| Function {show_help_dialog( const char *file )} {open private return_type {static void} | Function {show_help_dialog( const char *file )} {open private return_type {static void} | ||||
| } { | } { | ||||
| @@ -1003,7 +1001,7 @@ if ( logo_box->image() ) | |||||
| ((Fl_Shared_Image*)logo_box->image())->release(); | ((Fl_Shared_Image*)logo_box->image())->release(); | ||||
| logo_box->image( NULL ); | logo_box->image( NULL ); | ||||
| }} open | }} open | ||||
| private xywh {1242 261 520 775} type Double modal visible | |||||
| private xywh {1398 301 520 775} type Double modal visible | |||||
| } { | } { | ||||
| Fl_Value_Output {} { | Fl_Value_Output {} { | ||||
| label {Sample Rate} | label {Sample Rate} | ||||
| @@ -87,8 +87,6 @@ bool Timeline::snapping_on_hold = false; | |||||
| bool Timeline::snap_magnetic = true; | bool Timeline::snap_magnetic = true; | ||||
| bool Timeline::follow_playhead = true; | bool Timeline::follow_playhead = true; | ||||
| bool Timeline::center_playhead = true; | bool Timeline::center_playhead = true; | ||||
| bool Timeline::loop_playback = false; | |||||
| bool Timeline::automatically_create_takes = false; | |||||
| const float UPDATE_FREQ = 1.0 / 18.0f; | const float UPDATE_FREQ = 1.0 / 18.0f; | ||||
| @@ -1447,7 +1445,7 @@ Timeline::redraw_playhead ( void ) | |||||
| { | { | ||||
| if ( play_cursor_track->active_cursor() ) | if ( play_cursor_track->active_cursor() ) | ||||
| { | { | ||||
| if ( Timeline::loop_playback ) | |||||
| if ( transport->loop_enabled() ) | |||||
| { | { | ||||
| if ( transport->frame > playback_end() ) | if ( transport->frame > playback_end() ) | ||||
| { | { | ||||
| @@ -167,11 +167,6 @@ public: | |||||
| static bool snap_magnetic; | static bool snap_magnetic; | ||||
| static bool follow_playhead; | static bool follow_playhead; | ||||
| static bool center_playhead; | static bool center_playhead; | ||||
| static bool loop_playback; | |||||
| static bool automatically_create_takes; | |||||
| Tempo_Sequence *tempo_track; | Tempo_Sequence *tempo_track; | ||||
| Time_Sequence *time_track; | Time_Sequence *time_track; | ||||
| @@ -246,7 +246,6 @@ Track::init ( void ) | |||||
| o->end(); | o->end(); | ||||
| } | } | ||||
| end(); | end(); | ||||
| } | } | ||||
| @@ -27,7 +27,7 @@ | |||||
| Transport::Transport ( int X, int Y, int W, int H, const char *L ) | Transport::Transport ( int X, int Y, int W, int H, const char *L ) | ||||
| : Fl_Pack( X, Y, W, H, L ) | |||||
| : Fl_Flowpack( X, Y, W, H, L ) | |||||
| { | { | ||||
| recording = false; | recording = false; | ||||
| rolling = false; | rolling = false; | ||||
| @@ -45,49 +45,71 @@ 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 / 5; | |||||
| type( HORIZONTAL ); | |||||
| { _home_button = new Fl_Button(5, 5, 40, 44, "@|<"); | |||||
| } // Fl_Button* _home_button | |||||
| { _end_button = new Fl_Button(45, 5, 40, 44, "@>|"); | |||||
| } // Fl_Button* _end_button | |||||
| { _play_button = new Fl_Button(85, 5, 40, 44, "@>"); | |||||
| } // Fl_Button* _play_button | |||||
| { _record_button = new Fl_Button(130, 5, 40, 44, "@circle"); | |||||
| } // Fl_Button* _record_button | |||||
| { _punch_button = new Fl_Button(175, 5, 38, 21, "Punch"); | |||||
| _punch_button->type(1); | |||||
| _punch_button->labelsize(10); | |||||
| } // Fl_Button* _punch_button | |||||
| { _loop_button = new Fl_Button(175, 20, 38, 21, "Loop"); | |||||
| _loop_button->type(1); | |||||
| _loop_button->labelsize(10); | |||||
| } // Fl_Button* _loop_button | |||||
| { _new_take_button = new Fl_Button(225, 5, 60, 21, "New Take"); | |||||
| _new_take_button->type(1); | |||||
| _new_take_button->labelsize(10); | |||||
| } // Fl_Button* _new_take_button | |||||
| end(); | |||||
| Fl_Button *o; | Fl_Button *o; | ||||
| _home_button = o = new Fl_Button( 0, 0, bw, 0, "@|<" ); | |||||
| o->labeltype( FL_EMBOSSED_LABEL ); | |||||
| o = _home_button; | |||||
| o->callback( cb_button, this ); | o->callback( cb_button, this ); | ||||
| o->shortcut( FL_Home ); | o->shortcut( FL_Home ); | ||||
| o->box( FL_UP_BOX ); | |||||
| _end_button = o = new Fl_Button( 0, 0, bw, 0, "@>|" ); | |||||
| o->labeltype( FL_EMBOSSED_LABEL ); | |||||
| o = _end_button; | |||||
| o->callback( cb_button, this ); | o->callback( cb_button, this ); | ||||
| o->shortcut( FL_End ); | o->shortcut( FL_End ); | ||||
| _play_button = o = new Fl_Button( 0, 0, bw, 0, "@>" ); | |||||
| o->labeltype( FL_EMBOSSED_LABEL ); | |||||
| o = _play_button; | |||||
| o->callback( cb_button, this ); | o->callback( cb_button, this ); | ||||
| o->shortcut( ' ' ); | o->shortcut( ' ' ); | ||||
| o->box( FL_UP_BOX ); | |||||
| _record_button = o = new Fl_Button( 0, 0, bw, 0, "@circle" ); | |||||
| o = _record_button; | |||||
| o->type( FL_TOGGLE_BUTTON ); | o->type( FL_TOGGLE_BUTTON ); | ||||
| o->labeltype( FL_EMBOSSED_LABEL ); | |||||
| o->labelcolor( fl_color_average( FL_RED, FL_WHITE, 0.25f ) ); | |||||
| o->shortcut( 'R' ); | o->shortcut( 'R' ); | ||||
| o->callback( cb_button, this ); | o->callback( cb_button, this ); | ||||
| o->when( FL_WHEN_CHANGED ); | o->when( FL_WHEN_CHANGED ); | ||||
| o->box( FL_UP_BOX ); | |||||
| _punch_button = o = new Fl_Button( 0, 0, bw, 0, "Punch" ); | |||||
| o = _punch_button; | |||||
| o->type( FL_TOGGLE_BUTTON ); | o->type( FL_TOGGLE_BUTTON ); | ||||
| o->labelsize( 9 ); | |||||
| o->labeltype( FL_NORMAL_LABEL ); | |||||
| o->shortcut( 'P' ); | o->shortcut( 'P' ); | ||||
| o->callback( cb_button, this ); | o->callback( cb_button, this ); | ||||
| o->when( FL_WHEN_CHANGED ); | o->when( FL_WHEN_CHANGED ); | ||||
| o->color2( FL_RED ); | |||||
| o->box( FL_UP_BOX ); | |||||
| o->color2( fl_color_average( FL_GRAY, FL_RED, 0.50 )); | |||||
| o->tooltip( "Toggle punch in/out recording mode" ); | |||||
| o = _loop_button; | |||||
| o->type( FL_TOGGLE_BUTTON ); | |||||
| o->shortcut( 'L' ); | |||||
| o->callback( cb_button, this ); | |||||
| o->when( FL_WHEN_CHANGED ); | |||||
| o->color2( fl_color_average( FL_GRAY, FL_GREEN, 0.50 )); | |||||
| o->tooltip( "Toggle looped playback" ); | |||||
| end(); | |||||
| o = _new_take_button; | |||||
| o->type( FL_TOGGLE_BUTTON ); | |||||
| o->shortcut( 'T' ); | |||||
| o->callback( cb_button, this ); | |||||
| o->when( FL_WHEN_CHANGED ); | |||||
| o->color2( fl_color_average( FL_GRAY, FL_YELLOW, 0.50 ) ); | |||||
| o->tooltip( "Toggle automatic creation of new takes for armed tracks" ); | |||||
| } | } | ||||
| @@ -165,6 +187,32 @@ Transport::punch_enabled ( void ) const | |||||
| return _punch_button->value(); | return _punch_button->value(); | ||||
| } | } | ||||
| bool | |||||
| Transport::loop_enabled ( void ) const | |||||
| { | |||||
| return _loop_button->value(); | |||||
| } | |||||
| void | |||||
| Transport::loop_enabled ( bool b ) | |||||
| { | |||||
| _loop_button->value( b ); | |||||
| } | |||||
| bool | |||||
| Transport::automatically_create_takes ( void ) const | |||||
| { | |||||
| return _new_take_button->value(); | |||||
| } | |||||
| void | |||||
| Transport::automatically_create_takes ( bool b ) | |||||
| { | |||||
| _new_take_button->value( b ); | |||||
| } | |||||
| int | int | ||||
| Transport::handle ( int m ) | Transport::handle ( int m ) | ||||
| { | { | ||||
| @@ -173,7 +221,7 @@ Transport::handle ( int m ) | |||||
| if ( m == FL_FOCUS ) | if ( m == FL_FOCUS ) | ||||
| return 0; | return 0; | ||||
| else | else | ||||
| return Fl_Pack::handle( m ); | |||||
| return Fl_Flowpack::handle( m ); | |||||
| } | } | ||||
| /***********/ | /***********/ | ||||
| @@ -27,8 +27,9 @@ | |||||
| #include <FL/Fl_Button.H> | #include <FL/Fl_Button.H> | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <FL/Fl_Flowpack.H> | |||||
| class Transport : public jack_position_t, public Fl_Pack | |||||
| class Transport : public jack_position_t, public Fl_Flowpack | |||||
| { | { | ||||
| private: | private: | ||||
| @@ -47,6 +48,8 @@ private: | |||||
| Fl_Button *_play_button; | Fl_Button *_play_button; | ||||
| Fl_Button *_record_button; | Fl_Button *_record_button; | ||||
| Fl_Button *_punch_button; | Fl_Button *_punch_button; | ||||
| Fl_Button *_loop_button; | |||||
| Fl_Button *_new_take_button; | |||||
| void update_record_state ( void ); | void update_record_state ( void ); | ||||
| @@ -56,6 +59,11 @@ public: | |||||
| bool rec_enabled ( void ) const; | bool rec_enabled ( void ) const; | ||||
| bool punch_enabled ( void ) const; | bool punch_enabled ( void ) const; | ||||
| bool loop_enabled ( void ) const; | |||||
| void loop_enabled ( bool b ); | |||||
| void automatically_create_takes ( bool b ); | |||||
| bool automatically_create_takes ( 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; } | ||||