X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplaybackengine.C;h=571afe2a83a174a3eaeeab536182258131839d2b;hp=83bd3efa9027cbc000f2436c9f86d4d381a58682;hb=45a8ba3455cf252332c03533a7590df5267ce9aa;hpb=f377b3322b0c0cdf4b39abadac9ff528fa6ff70c diff --git a/cinelerra-5.1/cinelerra/playbackengine.C b/cinelerra-5.1/cinelerra/playbackengine.C index 83bd3efa..571afe2a 100644 --- a/cinelerra-5.1/cinelerra/playbackengine.C +++ b/cinelerra-5.1/cinelerra/playbackengine.C @@ -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); @@ -85,12 +86,15 @@ PlaybackEngine::~PlaybackEngine() Thread::join(); delete preferences; delete_render_engine(); - delete audio_cache; - delete video_cache; + 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; @@ -162,10 +166,14 @@ 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(); } @@ -258,8 +266,9 @@ void PlaybackEngine::init_tracking() init_meters(); } -void PlaybackEngine::stop_tracking() +void PlaybackEngine::stop_tracking(double position) { + tracking_position = position; tracking_active = 0; stop_cursor(); tracking_done->unlock(); @@ -457,6 +466,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); @@ -468,7 +483,6 @@ void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int int single_frame = TransportCommand::single_frame(command); int next_audio = next_command->toggle_audio ? !single_frame : single_frame; float next_speed = next_command->speed; - int cmd = -1; // Dispatch command switch( command ) { case STOP: @@ -510,17 +524,16 @@ void PlaybackEngine::send_command(int command, EDL *edl, int wait_tracking, int break; } next_command->realtime = 1; - cmd = command; + transport_command(command, CHANGE_NONE, edl, use_inout); break; case REWIND: case GOTO_END: transport_stop(1); next_command->realtime = 1; - cmd = command; + transport_command(command, CHANGE_NONE, edl, use_inout); + stop_tracking(this->command->playbackstart); break; } - if( cmd >= 0 ) - transport_command(cmd, CHANGE_NONE, edl, use_inout); } int PlaybackEngine::put_command(TransportCommand *command, int reset)