X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaytransport.C;h=c7334213e7f3c13e68463cfa668faba41041c460;hb=7920493569041de2d8c991eb4b04b33d41b70d57;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..c7334213 100644 --- a/cinelerra-5.1/cinelerra/playtransport.C +++ b/cinelerra-5.1/cinelerra/playtransport.C @@ -178,76 +178,89 @@ int PlayTransport::flip_vertical(int vertical, int &x, int &y) } int PlayTransport::keypress_event() +{ + int key = subwindow->get_keypress(); + return do_keypress(key); +} + +int PlayTransport::do_keypress(int key) { 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; - } +// 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,113 +278,13 @@ 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; - -// Stop requires transferring the output buffer to a refresh buffer. - int do_stop = 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) - { -// 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 -// 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 -// Start from scratch - { - engine->que->send_command(command, - CHANGE_NONE, - get_edl(), - 1, - 0, - use_inout); - } - 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) - { - engine->que->send_command( - (prev_direction == PLAY_FORWARD) ? SINGLE_FRAME_REWIND : SINGLE_FRAME_FWD, - 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); + engine->issue_command(edl, command, wait_tracking, use_inout, update_refresh, toggle_audio); } EDL* PlayTransport::get_edl() @@ -548,13 +461,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"); @@ -569,7 +481,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); } }