add binfolder path relative filters, fix gbrp color model, vwdw timebar tweaks, title...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / playtransport.C
index 991adb9ada070efb187e43ecfbb42715a0a4d3fa..0165de6581390281b9ff4b505d5feea2f34b8639 100644 (file)
@@ -129,6 +129,11 @@ int PlayTransport::get_w()
        return end_button->get_x() + end_button->get_w() - rewind_button->get_x();
 }
 
+int PlayTransport::is_stopped()
+{
+       return engine->command->command == STOP ? 1 : 0;
+}
+
 int PlayTransport::flip_vertical(int vertical, int &x, int &y)
 {
        if(vertical)
@@ -179,8 +184,13 @@ int PlayTransport::flip_vertical(int vertical, int &x, int &y)
 
 int PlayTransport::keypress_event()
 {
-       int result = 1;
        int key = subwindow->get_keypress();
+       return do_keypress(key);
+}
+
+int PlayTransport::do_keypress(int key)
+{
+       int result = 1;
 // unqualified keys, still holding lock
        switch( key ) {
        case HOME:
@@ -190,15 +200,19 @@ int PlayTransport::keypress_event()
                goto_end();
                return result;
        }
-
-       int toggle_audio = subwindow->shift_down() ? 1 : 0;
-       int use_inout = subwindow->ctrl_down() ? 1 : 0;
+// as in play_command
+       int ctrl_key = subwindow->ctrl_down() ? 1 : 0;
+       int shft_key = subwindow->shift_down() ? 1 : 0;
+       int alt_key = subwindow->alt_down() ? 1 : 0;
+       int use_inout = ctrl_key;
+       int toggle_audio = shft_key & ~ctrl_key;
+       int loop_play = shft_key & ctrl_key;
        int command = -1, prev_command = engine->command->command;
        using_inout = use_inout;
        subwindow->unlock_window();
 
+       result = 0;
        switch( key ) {
-       case 'k':
        case KPINS:     command = STOP;                 break;
        case KPPLUS:    command = FAST_REWIND;          break;
        case KP6:       command = NORMAL_REWIND;        break;
@@ -212,6 +226,7 @@ int PlayTransport::keypress_event()
                switch( prev_command ) {
                case COMMAND_NONE:
                case CURRENT_FRAME:
+               case LAST_FRAME:
                case PAUSE:
                case STOP:
                        command = NORMAL_FWD;
@@ -221,12 +236,38 @@ int PlayTransport::keypress_event()
                        break;
                }
                break;
-       default:
-               result = 0;
+       case 'u': case 'U':
+               if( alt_key ) command = SINGLE_FRAME_REWIND;
+               break;
+       case 'i': case 'I':
+               if( alt_key ) command = SLOW_REWIND;
+               break;
+       case 'o': case 'O':
+               if( alt_key ) command = NORMAL_REWIND;
+               break;
+       case 'p': case 'P':
+               if( alt_key ) command = FAST_REWIND;
+               break;
+       case 'j': case 'J':
+               if( alt_key ) command = SINGLE_FRAME_FWD;
+               break;
+       case 'k': case 'K':
+               if( alt_key ) command = SLOW_FWD;
+               break;
+       case 'l': case 'L':
+               if( alt_key ) command = NORMAL_FWD;
+               break;
+       case ':': case ';':
+               if( alt_key ) command = FAST_FWD;
                break;
+       case 'm': case 'M':
+               if( alt_key ) command = STOP;
+               break;
+       }
+       if( command >= 0 ) {
+               handle_transport(command, 0, use_inout, 1, toggle_audio, loop_play);
+               result = 1;
        }
-       if( command >= 0 )
-               handle_transport(command, 0, use_inout, 1, toggle_audio);
 
        subwindow->lock_window("PlayTransport::keypress_event 5");
        return result;
@@ -245,81 +286,16 @@ void PlayTransport::goto_end()
 
 
 
-void PlayTransport::handle_transport(int command,
-       int wait_tracking, int use_inout, int update_refresh, int toggle_audio)
+void PlayTransport::handle_transport(int command, int wait_tracking, int use_inout,
+               int update_refresh, int toggle_audio, int loop_play)
 {
-       if( !get_edl() ) return;
-
-// Stop requires transferring the output buffer to a refresh buffer.
-       int do_stop = 0;
-       int resume = 0;
-//printf("PlayTransport::handle_transport 1 %d\n", command);
-       int prev_command = engine->command->command;
-       int prev_direction = engine->command->get_direction();
-       int prev_single_frame = engine->command->single_frame();
-
-// Dispatch command
-       switch(command) {
-       case FAST_REWIND:       // Commands that play back
-       case NORMAL_REWIND:
-       case SLOW_REWIND:
-       case SINGLE_FRAME_REWIND:
-       case SINGLE_FRAME_FWD:
-       case SLOW_FWD:
-       case NORMAL_FWD:
-       case FAST_FWD:
-               if( prev_command == command && !prev_single_frame ) {
-// Same direction pressed twice.  Stop
-                       do_stop = 1;
-                       break;
-               }
-// Resume or change direction
-               switch( prev_command ) {
-               default:
-                       engine->que->send_command(STOP, CHANGE_NONE, 0, 0, 0, 0);
-                       engine->interrupt_playback(wait_tracking);
-                       resume = 1;
-// fall through
-               case STOP:
-               case COMMAND_NONE:
-               case SINGLE_FRAME_FWD:
-               case SINGLE_FRAME_REWIND:
-// Start from scratch
-                       engine->que->send_command(command, CHANGE_NONE, get_edl(),
-                               1, resume, use_inout, toggle_audio);
-                       break;
-               }
-               break;
-
-// Commands that stop
-       case STOP:
-               do_stop = 1;
-               break;
-
-       case REWIND:
-       case GOTO_END:
-               engine->que->send_command(STOP, CHANGE_NONE, 0, 0, 0, 0);
-                       engine->interrupt_playback(wait_tracking);
-                       break;
-       }
-
-       if( do_stop ) {
-               engine->que->send_command(STOP, CHANGE_NONE, 0, 0, 0, 0);
-               engine->interrupt_playback(wait_tracking);
-// This is necessary to get an OpenGL output buffer
-// printf("PlayTransport::handle_transport 2 update_refresh=%d prev_command=%d prev_direction=%d\n",
-// update_refresh, prev_command, prev_direction);
-               if( !prev_single_frame && update_refresh &&
-                   prev_command != STOP && prev_command != COMMAND_NONE ) {
-                       int command = (prev_direction == PLAY_FORWARD) ?
-                                       SINGLE_FRAME_REWIND : SINGLE_FRAME_FWD;
-                       engine->que->send_command(command,
-                               CHANGE_NONE, get_edl(), 1, 0, 0);
-               }
-       }
+       EDL *edl = get_edl();
+       if( !edl ) return;
+       if( !is_vwindow() )
+               mwindow->queue_mixers(edl, command, wait_tracking, use_inout, update_refresh, toggle_audio, 0);
+       engine->issue_command(edl, command, wait_tracking, use_inout, update_refresh, toggle_audio, loop_play);
 }
 
-
 EDL* PlayTransport::get_edl()
 {
        return mwindow->edl;
@@ -360,6 +336,19 @@ int PTransportButton::set_mode(int mode)
        return 0;
 }
 
+int PTransportButton::play_command(const char *lock_msg, int command)
+{
+       int ctrl_key = transport->subwindow->ctrl_down() ? 1 : 0;
+       int shft_key = transport->subwindow->shift_down() ? 1 : 0;
+       int use_inout = ctrl_key;
+       int toggle_audio = shft_key & ~ctrl_key;
+       int loop_play = shft_key & ctrl_key;
+       unlock_window();
+       transport->handle_transport(command, 0, use_inout, 0, toggle_audio, loop_play);
+       lock_window(lock_msg);
+       return 1;
+}
+
 
 RewindButton::RewindButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("rewind"))
@@ -377,14 +366,11 @@ int RewindButton::handle_event()
 FastReverseButton::FastReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("fastrev"))
 {
-       set_tooltip(_("Fast reverse ( + )"));
+       set_tooltip(_("Fast reverse ( + or Alt-p )"));
 }
 int FastReverseButton::handle_event()
 {
-       unlock_window();
-       transport->handle_transport(FAST_REWIND, 0, ctrl_down());
-       lock_window("FastReverseButton::handle_event");
-       return 1;
+       return play_command("FastReverseButton::handle_event", FAST_REWIND);
 }
 
 // Reverse playback normal speed
@@ -392,14 +378,11 @@ int FastReverseButton::handle_event()
 ReverseButton::ReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("reverse"))
 {
-       set_tooltip(_("Normal reverse ( 6 )"));
+       set_tooltip(_("Normal reverse ( 6 or Alt-o )"));
 }
 int ReverseButton::handle_event()
 {
-       unlock_window();
-       transport->handle_transport(NORMAL_REWIND, 0, ctrl_down());
-       lock_window("ReverseButton::handle_event");
-       return 1;
+       return play_command("ReverseButton::handle_event", NORMAL_REWIND);
 }
 
 // Reverse playback one frame
@@ -407,7 +390,7 @@ int ReverseButton::handle_event()
 FrameReverseButton::FrameReverseButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("framerev"))
 {
-       set_tooltip(_("Frame reverse ( 4 )"));
+       set_tooltip(_("Frame reverse ( 4 or Alt-u )"));
 }
 int FrameReverseButton::handle_event()
 {
@@ -422,14 +405,11 @@ int FrameReverseButton::handle_event()
 PlayButton::PlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("play"))
 {
-       set_tooltip(_("Normal forward ( 3 )"));
+       set_tooltip(_("Normal forward ( 3 or Alt-l )"));
 }
 int PlayButton::handle_event()
 {
-       unlock_window();
-       transport->handle_transport(NORMAL_FWD, 0, ctrl_down());
-       lock_window("PlayButton::handle_event");
-       return 1;
+       return play_command("PlayButton::handle_event", NORMAL_FWD);
 }
 
 
@@ -439,7 +419,7 @@ int PlayButton::handle_event()
 FramePlayButton::FramePlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("framefwd"))
 {
-       set_tooltip(_("Frame forward ( 1 )"));
+       set_tooltip(_("Frame forward ( 1 or Alt-j )"));
 }
 int FramePlayButton::handle_event()
 {
@@ -454,14 +434,11 @@ int FramePlayButton::handle_event()
 FastPlayButton::FastPlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("fastfwd"))
 {
-       set_tooltip(_("Fast forward ( Enter )"));
+       set_tooltip(_("Fast forward ( Enter or Alt-; )"));
 }
 int FastPlayButton::handle_event()
 {
-       unlock_window();
-       transport->handle_transport(FAST_FWD, 0, ctrl_down());
-       lock_window("FastPlayButton::handle_event");
-       return 1;
+       return play_command("FastPlayButton::handle_event", FAST_FWD);
 }
 
 EndButton::EndButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
@@ -480,7 +457,7 @@ int EndButton::handle_event()
 StopButton::StopButton(MWindow *mwindow, PlayTransport *transport, int x, int y)
  : PTransportButton(mwindow, transport, x, y, mwindow->theme->get_image_set("stop"))
 {
-       set_tooltip(_("Stop ( 0 )"));
+       set_tooltip(_("Stop ( 0 or Alt-m )"));
 }
 int StopButton::handle_event()
 {
@@ -494,13 +471,12 @@ int StopButton::handle_event()
 
 void PlayTransport::change_position(double position)
 {
-       EDL *edl = get_edl();
-       if( !edl ) return;
+       if( !get_edl() ) return;
        int prev_command = engine->command->command;
 // stop transport
        if( prev_command != STOP && prev_command != COMMAND_NONE &&
            prev_command != SINGLE_FRAME_FWD && prev_command != SINGLE_FRAME_REWIND ) {
-               engine->que->send_command(STOP, CHANGE_NONE, 0, 0, 0, 0);
+               engine->que->send_command(STOP, CHANGE_NONE, 0, 0);
                engine->interrupt_playback(0);
        }
        mwindow->gui->lock_window("PlayTransport::change_position");
@@ -515,7 +491,7 @@ void PlayTransport::change_position(double position)
        case NORMAL_FWD:
        case FAST_FWD:
                engine->que->send_command(prev_command, CHANGE_NONE,
-                               get_edl(), 1, 1, using_inout);
+                               get_edl(), 1, 1, using_inout, 0);
        }
 }