X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindow.C;h=b0f829bbd7adaeac2f738600d7bb63c74126930c;hb=b9f98da8f1cd8b7b31ead02fa41f299b56cac3da;hp=2e590c668f376c244c2d46fd6af4f7693962888c;hpb=08284a3a20b2cc8606dd90c3c147e2c31d301a61;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C index 2e590c66..b0f829bb 100644 --- a/cinelerra-5.1/cinelerra/mwindow.C +++ b/cinelerra-5.1/cinelerra/mwindow.C @@ -142,6 +142,7 @@ #include #include #include +#include #include #include @@ -523,12 +524,11 @@ void MWindow::get_plugin_path(char *path, const char *plug_dir, const char *fs_p delete [] base_path; } -int MWindow::load_plugin_index(MWindow *mwindow, const char *index_path, const char *plugin_dir) +int MWindow::load_plugin_index(MWindow *mwindow, FILE *fp, const char *plugin_dir) { -// load index - FILE *fp = fopen(index_path, "r"); if( !fp ) return -1; - +// load index + fseek(fp, 0, SEEK_SET); int ret = 0; char index_line[BCTEXTLEN]; int index_version = -1, len = strlen(plugin_dir); @@ -576,7 +576,6 @@ int MWindow::load_plugin_index(MWindow *mwindow, const char *index_path, const c ret = 1; continue; } } - fclose(fp); if( !ret ) ret = check_plugin_index(plugins, plugin_dir, "."); @@ -623,21 +622,36 @@ int MWindow::init_plugins(MWindow *mwindow, Preferences *preferences) create_defaults_path(index_path, PLUGIN_FILE); char *plugin_dir = FileSystem::basepath(preferences->plugin_dir); strcpy(plugin_path, plugin_dir); delete [] plugin_dir; - if( !load_plugin_index(mwindow, index_path, plugin_path) ) return 1; - printf("init plugin index: %s\n", plugin_path); - FILE *fp = fopen(index_path,"w"); + FILE *fp = fopen(index_path,"a+"); if( !fp ) { fprintf(stderr,_("MWindow::init_plugins: " - "can't create plugin index: %s\n"), index_path); - return 1; + "can't open plugin index: %s\n"), index_path); + return -1; + } + int fd = fileno(fp), ret = -1; + if( !flock(fd, LOCK_EX) ) { + fseek(fp, 0, SEEK_SET); + ret = load_plugin_index(mwindow, fp, plugin_path); + } + if( ret > 0 ) { + ftruncate(fd, 0); + fseek(fp, 0, SEEK_SET); + printf("init plugin index: %s\n", plugin_path); + fprintf(fp, "%d\n", PLUGIN_FILE_VERSION); + fprintf(fp, "%s\n", plugin_path); + init_plugin_index(mwindow, preferences, fp, plugin_path); + init_ffmpeg_index(mwindow, preferences, fp); + init_lv2_index(mwindow, preferences, fp); + fseek(fp, 0, SEEK_SET); + ret = load_plugin_index(mwindow, fp, plugin_path); + } + if( ret ) { + fprintf(stderr,_("MWindow::init_plugins: " + "can't %s plugin index: %s\n"), + ret>0 ? _("create") : _("lock"), index_path); } - fprintf(fp, "%d\n", PLUGIN_FILE_VERSION); - fprintf(fp, "%s\n", plugin_path); - init_plugin_index(mwindow, preferences, fp, plugin_path); - init_ffmpeg_index(mwindow, preferences, fp); - init_lv2_index(mwindow, preferences, fp); fclose(fp); - return load_plugin_index(mwindow, index_path, plugin_path); + return ret; } int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences) @@ -661,9 +675,30 @@ int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences) for( char *bp=plugin_path; *bp!=0; ++bp ) *cp++ = *bp=='/' ? '_' : *bp; *cp = 0; - if( !load_plugin_index(mwindow, index_path, plugin_path) ) continue; - if( init_ladspa_index(mwindow, preferences, index_path, plugin_path) ) continue; - load_plugin_index(mwindow, index_path, plugin_path); + FILE *fp = fopen(index_path,"a+"); + if( !fp ) { + fprintf(stderr,_("MWindow::init_ladspa_plugins: " + "can't open ladspa plugin index: %s\n"), index_path); + continue; + } + int fd = fileno(fp), ret = -1; + if( !flock(fd, LOCK_EX) ) { + fseek(fp, 0, SEEK_SET); + ret = load_plugin_index(mwindow, fp, plugin_path); + } + if( ret > 0 ) { + ftruncate(fd, 0); + fseek(fp, 0, SEEK_SET); + init_ladspa_index(mwindow, preferences, fp, plugin_path); + fseek(fp, 0, SEEK_SET); + ret = load_plugin_index(mwindow, fp, plugin_path); + } + if( ret ) { + fprintf(stderr,_("MWindow::init_ladspa_plugins: " + "can't %s ladspa plugin index: %s\n"), + ret>0 ? _("create") : _("lock"), index_path); + } + fclose(fp); } return 1; } @@ -1272,6 +1307,7 @@ void MWindow::stop_mixers() void MWindow::close_mixers(int destroy) { + ArrayList closed; zwindows_lock->lock("MWindow::close_mixers"); for( int i=zwindows.size(); --i>=0; ) { ZWindow *zwindow = zwindows[i]; @@ -1281,12 +1317,12 @@ void MWindow::close_mixers(int destroy) zgui->lock_window("MWindow::select_zwindow 0"); zgui->set_done(0); zgui->unlock_window(); + closed.append(zwindow); } zwindows_lock->unlock(); - for( int i=0; iidx < 0 ) continue; - zwindow->close_window(); + for( int i=0; ijoin(); } } @@ -1519,9 +1555,7 @@ void MWindow::init_indexes() void MWindow::init_gui() { gui = new MWindowGUI(this); - gui->lock_window("MWindow::init_gui"); gui->create_objects(); - gui->unlock_window(); gui->load_defaults(defaults); } @@ -2260,11 +2294,12 @@ int MWindow::enable_proxy() if( edl->session->proxy_scale == 1 && edl->session->proxy_disabled_scale != 1 ) { int new_scale = edl->session->proxy_disabled_scale; + int new_use_scaler = edl->session->proxy_use_scaler; edl->session->proxy_disabled_scale = 1; Asset *asset = new Asset; asset->format = FILE_FFMPEG; asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0); - ret = to_proxy(asset, new_scale); + ret = to_proxy(asset, new_scale, new_use_scaler); asset->remove_user(); if( ret > 0 ) beep(2000., 1.5, 0.5); @@ -2276,17 +2311,19 @@ int MWindow::disable_proxy() { if( edl->session->proxy_scale != 1 && edl->session->proxy_disabled_scale == 1 ) { + int new_scale = 1; + int new_use_scaler = edl->session->proxy_use_scaler; edl->session->proxy_disabled_scale = edl->session->proxy_scale; Asset *asset = new Asset; asset->format = FILE_FFMPEG; asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0); - to_proxy(asset, 1); + to_proxy(asset, new_scale, new_use_scaler); asset->remove_user(); } return 1; } -int MWindow::to_proxy(Asset *asset, int new_scale) +int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler) { ArrayList orig_idxbls; ArrayList proxy_assets; @@ -2299,7 +2336,6 @@ int MWindow::to_proxy(Asset *asset, int new_scale) // revert project to original size from current size // remove all session proxy assets at the at the current proxy_scale int proxy_scale = edl->session->proxy_scale; - int proxy_use_scaler = edl->session->proxy_use_scaler; if( proxy_scale > 1 ) { Asset *orig_asset = edl->assets->first; @@ -2404,7 +2440,7 @@ int MWindow::to_proxy(Asset *asset, int new_scale) result = proxy_render.create_needed_proxies(new_scale); if( !result ) // resize project - edl->set_proxy(new_scale, proxy_use_scaler, + edl->set_proxy(new_scale, new_use_scaler, &proxy_render.orig_idxbls, &proxy_render.orig_proxies); undo->update_undo_after(_("proxy"), LOAD_ALL); @@ -2515,14 +2551,14 @@ void MWindow::create_objects(int want_gui, check_language(); init_preferences(); if(splash_window) - splash_window->operation->update(_("Initializing Plugins")); + splash_window->update_status(_("Initializing Plugins")); init_plugins(this, preferences); if(debug) PRINT_TRACE init_ladspa_plugins(this, preferences); if(debug) PRINT_TRACE init_plugin_tips(*plugindb, cin_lang); if(splash_window) - splash_window->operation->update(_("Initializing GUI")); + splash_window->update_status(_("Initializing GUI")); if(debug) PRINT_TRACE init_theme(); @@ -2530,7 +2566,7 @@ void MWindow::create_objects(int want_gui, init_error(); if(splash_window) - splash_window->operation->update(_("Initializing Fonts")); + splash_window->update_status(_("Initializing Fonts")); char string[BCTEXTLEN]; strcpy(string, preferences->plugin_dir); strcat(string, "/" FONT_SEARCHPATH);