X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaytransport.C;h=0165de6581390281b9ff4b505d5feea2f34b8639;hp=85fe95a446a9252cd6d5bd935b8cfffc99c6cb0b;hb=7e5a0760f40ff787cc3d93cb7768a901ebe52809;hpb=d66e2dde00fcfbe27c461a9956e66753faa62c95 diff --git a/cinelerra-5.1/cinelerra/playtransport.C b/cinelerra-5.1/cinelerra/playtransport.C index 85fe95a4..0165de65 100644 --- a/cinelerra-5.1/cinelerra/playtransport.C +++ b/cinelerra-5.1/cinelerra/playtransport.C @@ -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,18 +226,48 @@ int PlayTransport::keypress_event() switch( prev_command ) { case COMMAND_NONE: case CURRENT_FRAME: + case LAST_FRAME: case PAUSE: case STOP: command = NORMAL_FWD; break; + default: + command = STOP; + 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); + if( command >= 0 ) { + handle_transport(command, 0, use_inout, 1, toggle_audio, loop_play); + result = 1; + } subwindow->lock_window("PlayTransport::keypress_event 5"); return result; @@ -242,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; @@ -357,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")) @@ -374,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 @@ -389,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 @@ -404,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() { @@ -419,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); } @@ -436,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() { @@ -451,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) @@ -477,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() { @@ -491,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"); @@ -512,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); } }