X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftransportque.C;h=5048beaf73cc42520323514b38255f4b324bcf2e;hp=318b400bb892c2f0d42c60bdacd64a6c687ae625;hb=e9cdcb62fbd9794a368f11e7808c6ddf83fbd467;hpb=7773615d89c9da219d3ade11c265601bfbc07dc0 diff --git a/cinelerra-5.1/cinelerra/transportque.C b/cinelerra-5.1/cinelerra/transportque.C index 318b400b..5048beaf 100644 --- a/cinelerra-5.1/cinelerra/transportque.C +++ b/cinelerra-5.1/cinelerra/transportque.C @@ -26,10 +26,12 @@ #include "edlsession.h" #include "localsession.h" #include "playbackengine.h" +#include "preferences.h" #include "tracks.h" #include "transportque.h" -TransportCommand::TransportCommand() + +TransportCommand::TransportCommand(Preferences *preferences) { // In rendering we want a master EDL so settings don't get clobbered // in the middle of a job. @@ -37,6 +39,7 @@ TransportCommand::TransportCommand() edl->create_objects(); command = 0; change_type = 0; + this->preferences = preferences; reset(); } @@ -47,19 +50,19 @@ TransportCommand::~TransportCommand() void TransportCommand::reset() { + command = COMMAND_NONE; + change_type = 0; playbackstart = 0; start_position = 0; end_position = 0; infinite = 0; realtime = 0; resume = 0; + locked = 0; toggle_audio = 0; loop_play = 0; displacement = 0; speed = 0; -// Don't reset the change type for commands which don't perform the change - if(command != STOP) change_type = 0; - command = COMMAND_NONE; } EDL* TransportCommand::get_edl() @@ -90,6 +93,7 @@ void TransportCommand::copy_from(TransportCommand *command) this->playbackstart = command->playbackstart; this->realtime = command->realtime; this->resume = command->resume; + this->locked = command->locked; this->toggle_audio = command->toggle_audio; this->loop_play = command->loop_play; this->displacement = command->displacement; @@ -133,10 +137,16 @@ int TransportCommand::get_direction(int command) float TransportCommand::get_speed(int command, float speed) { +// fast = 2.0, slow = 0.5 +// float my_fast_speed = 2.0; +// float my_slow_speed = 0.5; +float my_fast_speed = preferences->fast_speed; +float my_slow_speed = preferences->slow_speed; + switch(command) { case SLOW_FWD: case SLOW_REWIND: - return speed ? speed : 0.5; + return speed ? speed : my_slow_speed; case NORMAL_FWD: case NORMAL_REWIND: @@ -148,7 +158,7 @@ float TransportCommand::get_speed(int command, float speed) case FAST_FWD: case FAST_REWIND: - return speed ? speed : 2.; + return speed ? speed : my_fast_speed; } return 0.; @@ -168,11 +178,19 @@ void TransportCommand::set_playback_range(EDL *edl, int use_inout, int do_displa end_position = use_inout && edl->local_session->outpoint_valid() ? edl->local_session->get_outpoint() : !loop_play ? edl->local_session->get_selectionend(1) : length; + if( start_position >= length ) + length = edl->tracks->total_length(); - if( !use_inout && EQUIV(start_position, end_position) ) { + if( command == REWIND ) { + start_position = end_position = 0; + command = CURRENT_FRAME; + } + else if( command == GOTO_END ) { + start_position = end_position = length; + command = LAST_FRAME; + } + else if( !use_inout && EQUIV(start_position, end_position) ) { // starting play at or past end_position, play to end_position of media (for mixers) - if( start_position >= length ) - length = edl->tracks->total_length(); switch( command ) { case SLOW_FWD: case FAST_FWD: @@ -183,6 +201,7 @@ void TransportCommand::set_playback_range(EDL *edl, int use_inout, int do_displa start_position > edl->local_session->loop_end ) { start_position = edl->local_session->loop_start; } + displacement = realtime && do_displacement ? frame_period : 0; break; } case SLOW_REWIND: @@ -196,9 +215,10 @@ void TransportCommand::set_playback_range(EDL *edl, int use_inout, int do_displa } break; + case SINGLE_FRAME_FWD: + displacement = realtime && do_displacement ? frame_period : 0; case CURRENT_FRAME: case LAST_FRAME: - case SINGLE_FRAME_FWD: end_position = start_position + frame_period; break; @@ -206,17 +226,9 @@ void TransportCommand::set_playback_range(EDL *edl, int use_inout, int do_displa start_position = end_position - frame_period; break; } - - if( realtime && do_displacement ) { - if( (command != CURRENT_FRAME && get_direction() == PLAY_FORWARD ) || - (command != LAST_FRAME && get_direction() == PLAY_REVERSE ) ) { - start_position += frame_period; - end_position += frame_period; - displacement = 1; - } - } + start_position += displacement; + end_position += displacement; } - // if( start_position < 0 ) // start_position = 0; // if( end_position > length )