X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaybackengine.C;h=b59e609b189c4e28f63b6078033953f344f8dc0d;hb=4742c7a3793e92da3e3e46a32e1a4aa4d4c6b366;hp=364b8c9ed243d25427caca1e3f0710773eb992b1;hpb=253199c03ee8a0247e1ee7f9ba063c320f705aea;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/playbackengine.C b/cinelerra-5.1/cinelerra/playbackengine.C index 364b8c9e..b59e609b 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.C +++ b/cinelerra-5.1/cinelerra/playbackengine.C @@ -22,6 +22,7 @@ #include "bchash.h" #include "bcsignals.h" #include "cache.h" +#include "canvas.h" #include "condition.h" #include "edl.h" #include "edlsession.h" @@ -129,7 +130,11 @@ int PlaybackEngine::create_render_engine() void PlaybackEngine::delete_render_engine() { renderengine_lock->lock("PlaybackEngine::delete_render_engine"); - delete render_engine; render_engine = 0; + if( render_engine ) { + render_engine->interrupt_playback(); + render_engine->wait_done(); + delete render_engine; render_engine = 0; + } renderengine_lock->unlock(); } @@ -406,7 +411,8 @@ void PlaybackEngine::run() // Start tracking after arming so the tracking position doesn't change. // The tracking for a single frame command occurs during PAUSE init_tracking(); - + if( !command->single_frame() ) + clear_output(); // Dispatch the command start_render_engine(); break; @@ -415,6 +421,14 @@ void PlaybackEngine::run() } } +void PlaybackEngine::clear_output() +{ + BC_WindowBase *cwdw = output->get_canvas(); + if( !cwdw ) return; + cwdw->lock_window("PlaybackEngine::clear_output"); + output->clear(); + cwdw->unlock_window(); +} void PlaybackEngine::stop_playback(int wait_tracking) { @@ -433,7 +447,7 @@ void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int //printf("PlaybackEngine::send_command 1 %d\n", command); // Stop requires transferring the output buffer to a refresh buffer. int do_stop = 0; - int curr_command = this->command->command; + int curr_command = is_playing_back ? this->command->command : STOP; int curr_single_frame = TransportCommand::single_frame(curr_command); int curr_audio = this->command->toggle_audio ? !curr_single_frame : curr_single_frame; @@ -525,15 +539,10 @@ int PlaybackEngine::transport_command(int command, int change_type, EDL *new_edl // Just change the EDL if the change requires it because renderengine // structures won't point to the new EDL otherwise and because copying the // EDL for every cursor movement is slow. - switch( change_type ) { - case CHANGE_EDL: - case CHANGE_ALL: + if( change_type & CHANGE_EDL ) next_command->get_edl()->copy_all(new_edl); - break; - case CHANGE_PARAMS: + else if( change_type & CHANGE_PARAMS ) next_command->get_edl()->synchronize_params(new_edl); - break; - } next_command->set_playback_range(new_edl, use_inout, preferences->forward_render_displacement); }