Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / playbackengine.C
index 8ce98234c3ffc7ed2b0ed6e4c00b4f6e3fa749ee..815e506fa9dd684eb2e13427b2baf3fb3098739a 100644 (file)
@@ -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);