X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaybackengine.C;h=815e506fa9dd684eb2e13427b2baf3fb3098739a;hp=8ce98234c3ffc7ed2b0ed6e4c00b4f6e3fa749ee;hb=refs%2Fheads%2Fmaster;hpb=f1fc28e0bbb5a7c0e153ef9c1abdbfb1186e1acc diff --git a/cinelerra-5.1/cinelerra/playbackengine.C b/cinelerra-5.1/cinelerra/playbackengine.C index 8ce98234..815e506f 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.C +++ b/cinelerra-5.1/cinelerra/playbackengine.C @@ -56,14 +56,14 @@ PlaybackEngine::PlaybackEngine(MWindow *mwindow, Canvas *output) tracking_active = 0; audio_cache = 0; video_cache = 0; - command = new TransportCommand(); + command = new TransportCommand(mwindow->preferences); command->command = STOP; - next_command = new TransportCommand(); + next_command = new TransportCommand(mwindow->preferences); next_command->change_type = CHANGE_ALL; - stop_command = new TransportCommand(); + stop_command = new TransportCommand(mwindow->preferences); stop_command->command = STOP; stop_command->realtime = 1; - sent_command = new TransportCommand(); + sent_command = new TransportCommand(mwindow->preferences); sent_command->command = -1; send_active = 0; tracking_lock = new Mutex("PlaybackEngine::tracking_lock"); @@ -71,6 +71,7 @@ PlaybackEngine::PlaybackEngine(MWindow *mwindow, Canvas *output) tracking_done = new Condition(1, "PlaybackEngine::tracking_done"); pause_lock = new Condition(0, "PlaybackEngine::pause_lock"); start_lock = new Condition(0, "PlaybackEngine::start_lock"); + cache_lock = new Mutex("PlaybackEngine::cache_lock"); input_lock = new Condition(1, "PlaybackEngine::input_lock"); output_lock = new Condition(0, "PlaybackEngine::output_lock", 1); @@ -83,14 +84,17 @@ PlaybackEngine::~PlaybackEngine() done = 1; output_lock->unlock(); Thread::join(); - delete preferences; delete_render_engine(); - delete audio_cache; - delete video_cache; + delete preferences; + if( audio_cache ) + audio_cache->remove_user(); + if( video_cache ) + video_cache->remove_user(); delete tracking_lock; delete tracking_done; delete pause_lock; delete start_lock; + delete cache_lock; delete renderengine_lock; delete command; delete next_command; @@ -143,14 +147,18 @@ void PlaybackEngine::delete_render_engine() void PlaybackEngine::arm_render_engine() { + renderengine_lock->lock("PlaybackEngine::arm_render_engine"); if( render_engine ) render_engine->arm_command(command); + renderengine_lock->unlock(); } void PlaybackEngine::start_render_engine() { + renderengine_lock->lock("PlaybackEngine::start_render_engine"); if( render_engine ) render_engine->start_command(); + renderengine_lock->unlock(); } void PlaybackEngine::wait_render_engine() @@ -162,24 +170,35 @@ void PlaybackEngine::wait_render_engine() void PlaybackEngine::create_cache() { - if(audio_cache) { delete audio_cache; audio_cache = 0; } - if(video_cache) { delete video_cache; video_cache = 0; } - if(!audio_cache) audio_cache = new CICache(preferences); - if(!video_cache) video_cache = new CICache(preferences); + cache_lock->lock("PlaybackEngine::create_cache"); + if( audio_cache ) + audio_cache->remove_user(); + if( video_cache ) + video_cache->remove_user(); + audio_cache = new CICache(preferences); + video_cache = new CICache(preferences); + cache_lock->unlock(); } void PlaybackEngine::perform_change() { switch( command->change_type ) { - case CHANGE_ALL: - create_cache(); - case CHANGE_EDL: - create_render_engine(); - break; - case CHANGE_PARAMS: - render_engine->get_edl()->synchronize_params(command->get_edl()); - case CHANGE_NONE: + case CHANGE_ALL: + create_cache(); + case CHANGE_EDL: + create_render_engine(); + break; + case CHANGE_PARAMS: { + renderengine_lock->lock("PlaybackEngine::perform_change"); + EDL *edl = render_engine ? render_engine->get_edl() : 0; + if( edl ) edl->add_user(); + renderengine_lock->unlock(); + if( !edl ) break; + edl->synchronize_params(command->get_edl()); + edl->remove_user(); + } + case CHANGE_NONE: break; } } @@ -458,6 +477,12 @@ int PlaybackEngine::get_direction() return TransportCommand::get_direction(curr_command); } +void PlaybackEngine::update_preferences(Preferences *prefs) +{ + preferences->copy_from(prefs); + create_render_engine(); +} + void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int use_inout) { //printf("PlaybackEngine::send_command 1 %d\n", command);