X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaytransport.C;h=6fc55d63d376f12fefd1d68dff011764b8344e2f;hb=38cb4182e11e57fc426bede3825e825e9d61433b;hp=d8f0cbf5886414657b4eb47ca1dff1d6e85c9fbd;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/playtransport.C b/cinelerra-5.1/cinelerra/playtransport.C index d8f0cbf5..6fc55d63 100644 --- a/cinelerra-5.1/cinelerra/playtransport.C +++ b/cinelerra-5.1/cinelerra/playtransport.C @@ -180,74 +180,82 @@ int PlayTransport::flip_vertical(int vertical, int &x, int &y) int PlayTransport::keypress_event() { int result = 1; - if(subwindow->shift_down()) - { - switch(subwindow->get_keypress()) - { - case END: - subwindow->lock_window("PlayTransport::keypress_event 1"); - goto_end(); - subwindow->unlock_window(); - break; - case HOME: - subwindow->lock_window("PlayTransport::keypress_event 2"); - goto_start(); - subwindow->unlock_window(); - break; - default: - result = 0; - break; - } + int key = subwindow->get_keypress(); +// unqualified keys, still holding lock + switch( key ) { + case HOME: + goto_start(); + return result; + case END: + goto_end(); return result; } -// Set playback range to in/out points if CTRL is down - int use_inout = 0; - if(subwindow->ctrl_down()) - { - use_inout = 1; - } + int toggle_audio = subwindow->shift_down() ? 1 : 0; + int use_inout = subwindow->ctrl_down() ? 1 : 0; + int alt_key = subwindow->alt_down() ? 1 : 0; + int command = -1, prev_command = engine->command->command; using_inout = use_inout; subwindow->unlock_window(); - - switch(subwindow->get_keypress()) - { - case KPPLUS: handle_transport(FAST_REWIND, 0, use_inout); break; - case KP6: handle_transport(NORMAL_REWIND, 0, use_inout); break; - case KP5: handle_transport(SLOW_REWIND, 0, use_inout); break; - case KP4: handle_transport(SINGLE_FRAME_REWIND, 0, use_inout); break; - case KP1: handle_transport(SINGLE_FRAME_FWD, 0, use_inout); break; - case KP2: handle_transport(SLOW_FWD, 0, use_inout); break; - case KP3: handle_transport(NORMAL_FWD, 0, use_inout); break; - case KPENTER: handle_transport(FAST_FWD, 0, use_inout); break; - case KPINS: handle_transport(STOP, 0, use_inout); break; - case ' ': { - int prev_command = engine->command->command; - int new_command = prev_command == COMMAND_NONE || - prev_command == CURRENT_FRAME || - prev_command == PAUSE || - prev_command == STOP ? NORMAL_FWD : STOP; - handle_transport(new_command, 0, use_inout); break; - } - case 'k': handle_transport(STOP, 0, use_inout); break; - case END: - subwindow->lock_window("PlayTransport::keypress_event 3"); - goto_end(); - subwindow->unlock_window(); - break; - case HOME: - subwindow->lock_window("PlayTransport::keypress_event 4"); - goto_start(); - subwindow->unlock_window(); + result = 0; + switch( key ) { + case KPINS: command = STOP; break; + case KPPLUS: command = FAST_REWIND; break; + case KP6: command = NORMAL_REWIND; break; + case KP5: command = SLOW_REWIND; break; + case KP4: command = SINGLE_FRAME_REWIND; break; + case KP1: command = SINGLE_FRAME_FWD; break; + case KP2: command = SLOW_FWD; break; + case KP3: command = NORMAL_FWD; break; + case KPENTER: command = FAST_FWD; break; + case ' ': + switch( prev_command ) { + case COMMAND_NONE: + case CURRENT_FRAME: + case PAUSE: + case STOP: + command = NORMAL_FWD; break; default: - result = 0; + command = STOP; break; + } + break; + 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); + result = 1; } subwindow->lock_window("PlayTransport::keypress_event 5"); - return result; } @@ -265,115 +273,73 @@ void PlayTransport::goto_end() void PlayTransport::handle_transport(int command, - int wait_tracking, - int use_inout, - int update_refresh) + int wait_tracking, int use_inout, int update_refresh, int toggle_audio) { - if(!get_edl()) return; + 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(); + int prev_audio = engine->command->audio_toggle ? + !prev_single_frame : prev_single_frame; + int cur_single_frame = TransportCommand::single_frame(command); + int cur_audio = toggle_audio ? + !cur_single_frame : cur_single_frame; // Dispatch command - switch(command) - { -// Commands that play back - case FAST_REWIND: - case NORMAL_REWIND: - case SLOW_REWIND: - case SINGLE_FRAME_REWIND: - case SINGLE_FRAME_FWD: - case SLOW_FWD: - case NORMAL_FWD: - case FAST_FWD: -// Same direction pressed twice. Stop - if(prev_command == command && - !prev_single_frame) - { - do_stop = 1; - } - else + 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_single_frame && + prev_command == command && + cur_audio == prev_audio ) { +// Same direction pressed twice and no change in audio state, Stop + do_stop = 1; + break; + } // Resume or change direction - 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->interrupt_playback(wait_tracking); - engine->que->send_command(command, - CHANGE_NONE, - get_edl(), - 1, - 1, - use_inout); - } - else + switch( prev_command ) { + default: + engine->que->send_command(STOP, CHANGE_NONE, 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, - 0, - use_inout); - } + engine->que->send_command(command, CHANGE_NONE, get_edl(), + 1, resume, use_inout, toggle_audio, + mwindow->preferences->forward_render_displacement); 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; + case STOP: + case REWIND: + case GOTO_END: + do_stop = 1; + break; } - if(do_stop) - { - engine->que->send_command(STOP, - CHANGE_NONE, - 0, - 0, - 0, - 0); + if( do_stop ) { + engine->que->send_command(STOP, CHANGE_NONE, 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) - { - engine->que->send_command( - (prev_direction == PLAY_FORWARD) ? SINGLE_FRAME_REWIND : SINGLE_FRAME_FWD, - CHANGE_NONE, - get_edl(), - 1, - 0, - 0); - } } } + EDL* PlayTransport::get_edl() { return mwindow->edl; @@ -554,7 +520,7 @@ void PlayTransport::change_position(double position) // 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"); @@ -569,7 +535,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); } }