X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaybackengine.C;h=f95f57581b0dcf7f3ee025d5620912069624d8ca;hb=b32cf83f55420546cdab0ee4b30a7a5638f63f33;hp=71126cf82810c6fce05b7c2a1aa9dae7ce4c273b;hpb=aa9374b902768107ebda0cffe739325ffed372f6;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/playbackengine.C b/cinelerra-5.1/cinelerra/playbackengine.C index 71126cf8..f95f5758 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.C +++ b/cinelerra-5.1/cinelerra/playbackengine.C @@ -33,6 +33,7 @@ #include "mwindowgui.h" #include "patchbay.h" #include "tracking.h" +#include "tracks.h" #include "playbackengine.h" #include "playtransport.h" #include "preferences.h" @@ -40,6 +41,8 @@ #include "mainsession.h" #include "trackcanvas.h" #include "transportque.h" +#include "videodevice.h" +#include "vdevicex11.h" #include "vrender.h" @@ -130,7 +133,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(); } @@ -407,7 +414,7 @@ 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(); - clear_output(); + clear_borders(); // Dispatch the command start_render_engine(); break; @@ -416,13 +423,22 @@ void PlaybackEngine::run() } } -void PlaybackEngine::clear_output() +void PlaybackEngine::clear_borders() { - BC_WindowBase *cwdw = output->get_canvas(); - if( !cwdw ) return; - cwdw->lock_window("PlaybackEngine::clear_output"); - output->clear(); - cwdw->unlock_window(); + EDL *edl = command->get_edl(); + PlaybackConfig *config = edl->session->playback_config; + if( config->vconfig->driver == PLAYBACK_X11_GL ) { + if( render_engine && render_engine->video ) { + VDeviceBase *vdriver = render_engine->video->get_output_base(); + ((VDeviceX11*)vdriver)->clear_output(); + return; + } + } + BC_WindowBase *window = output->get_canvas(); + if( !window ) return; + window->lock_window("PlaybackEngine::clear_output"); + output->clear_borders(edl); + window->unlock_window(); } void PlaybackEngine::stop_playback(int wait_tracking) @@ -436,6 +452,11 @@ void PlaybackEngine::stop_playback(int wait_tracking) renderengine_lock->unlock(); } +int PlaybackEngine::get_direction() +{ + int curr_command = is_playing_back ? this->command->command : STOP; + return TransportCommand::get_direction(curr_command); +} void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int use_inout) { @@ -534,9 +555,9 @@ 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. - if( change_type & CHANGE_EDL ) + if( change_type == CHANGE_EDL || change_type == CHANGE_ALL ) next_command->get_edl()->copy_all(new_edl); - else if( change_type & CHANGE_PARAMS ) + else if( change_type == CHANGE_PARAMS ) next_command->get_edl()->synchronize_params(new_edl); next_command->set_playback_range(new_edl, use_inout, preferences->forward_render_displacement);