X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaytransport.C;h=8caf4678bb3493ff5b7e0326ab6d82c5bf5d8d3e;hb=166867a58d74619aa11aeb562a994cc364d62231;hp=0165de6581390281b9ff4b505d5feea2f34b8639;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/playtransport.C b/cinelerra-5.1/cinelerra/playtransport.C index 0165de65..8caf4678 100644 --- a/cinelerra-5.1/cinelerra/playtransport.C +++ b/cinelerra-5.1/cinelerra/playtransport.C @@ -28,7 +28,9 @@ #include "playbackengine.h" #include "playtransport.h" #include "preferences.h" +#include "shuttle.h" #include "theme.h" +#include "tracks.h" #include "transportque.h" #include "vframe.h" @@ -131,7 +133,7 @@ int PlayTransport::get_w() int PlayTransport::is_stopped() { - return engine->command->command == STOP ? 1 : 0; + return engine->is_playing_back ? 0 : 1; } int PlayTransport::flip_vertical(int vertical, int &x, int &y) @@ -200,19 +202,39 @@ int PlayTransport::do_keypress(int key) goto_end(); return result; } -// 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; + float speed = 0; + int command = -1; + int curr_command = engine->is_playing_back ? engine->command->command : STOP; subwindow->unlock_window(); result = 0; - switch( key ) { + + if( key >= SKEY_MIN && key <= SKEY_MAX ) { + speed = SHUTTLE_MAX_SPEED * + (key - (SKEY_MAX + SKEY_MIN)/2.f) / + ((SKEY_MAX - SKEY_MIN) / 2.f); + if( speed < 0 ) { + speed = -speed; + command = speed < 1 ? SLOW_REWIND : + speed > 1 ? FAST_REWIND : NORMAL_REWIND; + } + else if( speed > 0 ) { + command = speed < 1 ? SLOW_FWD : + speed > 1 ? FAST_FWD : NORMAL_FWD; + } + else + command = STOP; + use_inout = 0; + loop_play = 0; + } + else switch( key ) { case KPINS: command = STOP; break; case KPPLUS: command = FAST_REWIND; break; case KP6: command = NORMAL_REWIND; break; @@ -222,8 +244,9 @@ int PlayTransport::do_keypress(int key) case KP2: command = SLOW_FWD; break; case KP3: command = NORMAL_FWD; break; case KPENTER: command = FAST_FWD; break; + case ' ': - switch( prev_command ) { + switch( curr_command ) { case COMMAND_NONE: case CURRENT_FRAME: case LAST_FRAME: @@ -265,7 +288,7 @@ int PlayTransport::do_keypress(int key) break; } if( command >= 0 ) { - handle_transport(command, 0, use_inout, 1, toggle_audio, loop_play); + handle_transport(command, 0, use_inout, toggle_audio, loop_play, speed); result = 1; } @@ -276,24 +299,30 @@ int PlayTransport::do_keypress(int key) void PlayTransport::goto_start() { - handle_transport(REWIND, 1, 0); + handle_transport(REWIND, 1); } void PlayTransport::goto_end() { - handle_transport(GOTO_END, 1, 0); + handle_transport(GOTO_END, 1); } -void PlayTransport::handle_transport(int command, int wait_tracking, int use_inout, - int update_refresh, int toggle_audio, int loop_play) +void PlayTransport::handle_transport(int command, int wait_tracking, + int use_inout, int toggle_audio, int loop_play, float speed) { 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); + using_inout = use_inout; + + if( use_mixers() ) + mwindow->handle_mixers(edl, command, wait_tracking, + use_inout, toggle_audio, 0, speed); + engine->next_command->toggle_audio = toggle_audio; + engine->next_command->loop_play = loop_play; + engine->next_command->speed = speed; + engine->send_command(command, edl, wait_tracking, use_inout); } EDL* PlayTransport::get_edl() @@ -301,21 +330,14 @@ EDL* PlayTransport::get_edl() return mwindow->edl; } -int PlayTransport::pause_transport() +int PlayTransport::set_transport(int mode) { - if(active_button) active_button->set_mode(PLAY_MODE); - return 0; -} - - -int PlayTransport::reset_transport() -{ - fast_reverse->set_mode(PLAY_MODE); - reverse_play->set_mode(PLAY_MODE); - forward_play->set_mode(PLAY_MODE); - frame_reverse_play->set_mode(PLAY_MODE); - frame_forward_play->set_mode(PLAY_MODE); - fast_play->set_mode(PLAY_MODE); + fast_reverse->set_mode(mode); + reverse_play->set_mode(mode); + forward_play->set_mode(mode); + frame_reverse_play->set_mode(mode); + frame_forward_play->set_mode(mode); + fast_play->set_mode(mode); return 0; } @@ -330,10 +352,29 @@ PTransportButton::~PTransportButton() { } -int PTransportButton::set_mode(int mode) +void PTransportButton::set_mode(int mode) { this->mode = mode; - return 0; +} + +void PTransportButton::loop_mode(int dir) +{ + if( mode != LOOP_MODE ) return; + EDL *edl = transport->get_edl(); + if( !edl ) return; + PlaybackEngine *engine = transport->engine; + if( !engine || engine->is_playing_back ) return; + double position = engine->get_tracking_position(); + switch( dir ) { + case PLAY_FORWARD: + if( position >= edl->tracks->total_playable_length() ) + transport->goto_start(); + break; + case PLAY_REVERSE: + if( position <= 0 ) + transport->goto_end(); + break; + } } int PTransportButton::play_command(const char *lock_msg, int command) @@ -344,7 +385,7 @@ int PTransportButton::play_command(const char *lock_msg, int command) 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); + transport->handle_transport(command, 0, use_inout, toggle_audio, loop_play, 0); lock_window(lock_msg); return 1; } @@ -370,6 +411,7 @@ FastReverseButton::FastReverseButton(MWindow *mwindow, PlayTransport *transport, } int FastReverseButton::handle_event() { + loop_mode(PLAY_REVERSE); return play_command("FastReverseButton::handle_event", FAST_REWIND); } @@ -382,6 +424,7 @@ ReverseButton::ReverseButton(MWindow *mwindow, PlayTransport *transport, int x, } int ReverseButton::handle_event() { + loop_mode(PLAY_REVERSE); return play_command("ReverseButton::handle_event", NORMAL_REWIND); } @@ -409,6 +452,7 @@ PlayButton::PlayButton(MWindow *mwindow, PlayTransport *transport, int x, int y) } int PlayButton::handle_event() { + loop_mode(PLAY_FORWARD); return play_command("PlayButton::handle_event", NORMAL_FWD); } @@ -438,6 +482,7 @@ FastPlayButton::FastPlayButton(MWindow *mwindow, PlayTransport *transport, int x } int FastPlayButton::handle_event() { + loop_mode(PLAY_FORWARD); return play_command("FastPlayButton::handle_event", FAST_FWD); } @@ -462,7 +507,7 @@ StopButton::StopButton(MWindow *mwindow, PlayTransport *transport, int x, int y) int StopButton::handle_event() { unlock_window(); - transport->handle_transport(STOP, 0, 0); + transport->handle_transport(STOP); lock_window("StopButton::handle_event"); return 1; } @@ -472,26 +517,23 @@ int StopButton::handle_event() void PlayTransport::change_position(double position) { if( !get_edl() ) return; - int prev_command = engine->command->command; + int 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); - engine->interrupt_playback(0); - } + engine->stop_playback(0); mwindow->gui->lock_window("PlayTransport::change_position"); mwindow->goto_position(position); mwindow->gui->unlock_window(); // restart command - switch(prev_command) { + switch( command ) { case FAST_REWIND: case NORMAL_REWIND: case SLOW_REWIND: case SLOW_FWD: case NORMAL_FWD: case FAST_FWD: - engine->que->send_command(prev_command, CHANGE_NONE, - get_edl(), 1, 1, using_inout, 0); + engine->next_command->realtime = 1; + engine->next_command->resume = 1; + engine->transport_command(command, CHANGE_NONE, get_edl(), using_inout); } }