p/s proxy icon, rework window locks, segv in close_mixers + exportedl, ffmpeg default...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index f49c67fb5da709cb365c436d876b68ce54f6b27a..7ea4759f49fdc36d402fc243b9a5529096a12a10 100644 (file)
@@ -552,6 +552,7 @@ void AssetPicon::create_objects()
                                        pixmap_w = pixmap_h * 16/9;
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
+                                       icon_vframe->clear_frame();
                                        { char string[BCTEXTLEN];
                                        sprintf(string, _("Reading %s"), name);
                                        mwindow->gui->lock_window("AssetPicon::create_objects 3");
@@ -650,7 +651,6 @@ void AssetPicon::create_objects()
                                        open_render_engine(edl, 0);
                                        render_video(0, gui->temp_picon);
                                        close_render_engine();
-                                       gui->lock_window("AssetPicon::create_objects 0");
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
                                        icon_vframe->transfer_from(gui->temp_picon);
@@ -660,6 +660,7 @@ void AssetPicon::create_objects()
                                        pixmap_w = icon_vframe->get_w();
                                        pixmap_h = icon_vframe->get_h();
                                }
+                               gui->lock_window("AssetPicon::create_objects 0");
                                icon = new BC_Pixmap(gui, pixmap_w, pixmap_h);
                                icon->draw_vframe(icon_vframe,
                                        0, 0, pixmap_w, pixmap_h, 0, 0);
@@ -684,6 +685,7 @@ void AssetPicon::create_objects()
                                        pixmap_w = pixmap_h * 16/9;
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
+                                       icon_vframe->clear_frame();
                                        char string[BCTEXTLEN];
                                        sprintf(string, _("Rendering %s"), name);
                                        mwindow->gui->lock_window("AssetPicon::create_objects 3");
@@ -845,6 +847,7 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
        vicon_audio = 0;
        vicon_drawing = 1;
        displayed_folder = AW_NO_FOLDER;
+       folder_lock = new Mutex("AWindowGUI::folder_lock");
 }
 
 AWindowGUI::~AWindowGUI()
@@ -887,6 +890,7 @@ AWindowGUI::~AWindowGUI()
        delete vtransition_vframe;      delete vtransition_icon;
        delete aeffect_vframe;          delete aeffect_icon;
        delete veffect_vframe;          delete veffect_icon;
+       delete folder_lock;
 }
 
 bool AWindowGUI::protected_pixmap(BC_Pixmap *icon)
@@ -996,7 +1000,7 @@ void AWindowGUI::create_objects()
        plugin_icon(ladspa_vframe, ladspa_icon, "lad_picon", lad_picon_png);
        plugin_icon(ff_aud_vframe, ff_aud_icon, "ff_audio",  ff_audio_png);
        plugin_icon(ff_vid_vframe, ff_vid_icon, "ff_video",  ff_video_png);
-
+       folder_lock->lock("AWindowGUI::create_objects");
 // Mandatory folders
        folders.append(new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER, 1));
        folders.append(new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER, 1));
@@ -1008,6 +1012,7 @@ void AWindowGUI::create_objects()
        folders.append(new AssetPicon(mwindow, this, AW_MEDIA_FOLDER, 1));
 
        create_label_folder();
+       folder_lock->unlock();
 
        mwindow->theme->get_awindow_sizes(this);
        load_defaults(mwindow->defaults);
@@ -1204,6 +1209,7 @@ AWindowRemovePluginGUI::
 
 void AWindowRemovePluginGUI::create_objects()
 {
+       lock_window("AWindowRemovePluginGUI::create_objects");
        BC_Button *ok_button = new BC_OKButton(this);
        add_subwindow(ok_button);
        BC_Button *cancel_button = new BC_CancelButton(this);
@@ -1217,6 +1223,7 @@ void AWindowRemovePluginGUI::create_objects()
                0, 0, 1, 0, 0, LISTBOX_SINGLE, ICON_LEFT, 0);
        add_subwindow(list);
        show_window();
+       unlock_window();
 }
 
 int AWindowRemovePlugin::remove_plugin(PluginServer *plugin, ArrayList<BC_ListBoxItem*> &folder)
@@ -1424,11 +1431,13 @@ void AWindowGUI::create_label_folder()
 
 void AWindowGUI::update_asset_list()
 {
+       ArrayList<AssetPicon *> new_assets;
        for( int i = 0; i < assets.total; i++ ) {
                AssetPicon *picon = (AssetPicon*)assets.values[i];
                picon->in_use = 0;
        }
 
+       mwindow->gui->lock_window("AWindowGUI::update_asset_list");
 // Synchronize EDL clips
        for( int i=0; i<mwindow->edl->clips.size(); ++i ) {
                int exists = 0;
@@ -1449,8 +1458,7 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, mwindow->edl->clips[i]);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
 
@@ -1473,15 +1481,10 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, current);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
 
-       mwindow->gui->lock_window("AWindowGUI::update_asset_list");
-       mwindow->gui->default_message();
-       mwindow->gui->unlock_window();
-
 // Synchronize nested EDLs
        for( int i=0; i<mwindow->edl->nested_edls.size(); ++i ) {
                int exists = 0;
@@ -1502,10 +1505,20 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, (Indexable*)nested_edl);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
+       mwindow->gui->unlock_window();
+
+       for( int i=0; i<new_assets.size(); ++i ) {
+               AssetPicon *picon = new_assets[i];
+               picon->create_objects();
+               assets.append(picon);
+       }
+
+       mwindow->gui->lock_window();
+       mwindow->gui->default_message();
+       mwindow->gui->unlock_window();
 
        for( int i = assets.size() - 1; i >= 0; i-- ) {
                AssetPicon *picon = (AssetPicon*)assets.get(i);
@@ -1545,6 +1558,7 @@ void AWindowGUI::update_picon(Indexable *indexable)
 
 void AWindowGUI::sort_assets(int use_mtime)
 {
+       folder_lock->lock("AWindowGUI::sort_assets");
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
                sort_picons(&aeffects);
@@ -1563,16 +1577,20 @@ void AWindowGUI::sort_assets(int use_mtime)
                break;
        default:
                sort_picons(&assets, use_mtime);
+               break;
        }
 // reset xyposition
        asset_list->update_format(asset_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
 void AWindowGUI::sort_folders()
 {
+       folder_lock->lock("AWindowGUI::update_assets");
        sort_picons(&folders);
        folder_list->update_format(folder_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
@@ -1658,7 +1676,7 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
                        if( picon->edl )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->edl->local_session->clip_notes));
                        else
-                       if( picon->label && picon->label->textstr )
+                       if( picon->label )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
                        else if( picon->mtime ) {
                                char date_time[BCSTRLEN];
@@ -1745,6 +1763,7 @@ void AWindowGUI::filter_displayed_assets()
 void AWindowGUI::update_assets()
 {
        stop_vicon_drawing();
+       folder_lock->lock("AWindowGUI::update_assets");
        update_folder_list();
        update_asset_list();
        labellist.remove_all_objects();
@@ -1753,6 +1772,7 @@ void AWindowGUI::update_assets()
        if( displayed_folder != mwindow->edl->session->awindow_folder )
                search_text->clear();
        filter_displayed_assets();
+       folder_lock->unlock();
 
        if( mwindow->edl->session->folderlist_format != folder_list->get_format() ) {
                folder_list->update_format(mwindow->edl->session->folderlist_format, 0);
@@ -2024,20 +2044,30 @@ int AWindowAssets::handle_event()
 {
        AssetPicon *asset_picon = (AssetPicon *)get_selection(0, 0);
        if( !asset_picon ) return 0;
+       Indexable *picon_idxbl = asset_picon->indexable;
+       EDL *picon_edl = asset_picon->edl;
+       int proxy = 0;
+       VWindow *vwindow = 0;
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
        case AW_VEFFECT_FOLDER:
        case AW_ATRANSITION_FOLDER:
        case AW_VTRANSITION_FOLDER: return 1;
+       case AW_PROXY_FOLDER:
+               proxy = 1; // fall thru
+       default:
+               if( mwindow->vwindows.size() > DEFAULT_VWINDOW )
+                       vwindow = mwindow->vwindows.get(DEFAULT_VWINDOW);
+               break;
        }
-       VWindow *vwindow = mwindow->vwindows.size() > DEFAULT_VWINDOW ?
-               mwindow->vwindows.get(DEFAULT_VWINDOW) : 0;
        if( !vwindow || !vwindow->is_running() ) return 1;
+       if( proxy && picon_idxbl ) {
+               picon_edl = gui->collect_proxy(picon_idxbl);
+               picon_idxbl = 0;
+       }
 
-       if( asset_picon->indexable )
-               vwindow->change_source(asset_picon->indexable);
-       else if( asset_picon->edl )
-               vwindow->change_source(asset_picon->edl);
+       if( picon_idxbl ) vwindow->change_source(picon_idxbl);
+       else if( picon_edl ) vwindow->change_source(picon_edl);
        return 1;
 }
 
@@ -2465,10 +2495,14 @@ AddTools::AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *
 void AddTools::create_objects()
 {
        uint64_t vis = 0;
-       add_item(new AddPluginItem(this, "ladspa", PLUGIN_LADSPA_ID));
-       vis |= 1 << PLUGIN_LADSPA_ID;
        add_item(new AddPluginItem(this, "ffmpeg", PLUGIN_FFMPEG_ID));
        vis |= 1 << PLUGIN_FFMPEG_ID;
+       add_item(new AddPluginItem(this, "ladspa", PLUGIN_LADSPA_ID));
+       vis |= 1 << PLUGIN_LADSPA_ID;
+#ifdef HAVE_LV2
+       add_item(new AddPluginItem(this, "lv2", PLUGIN_LV2_ID));
+       vis |= 1 << PLUGIN_LV2_ID;
+#endif
        for( int i=0; i<MWindow::plugindb->size(); ++i ) {
                PluginServer *plugin = MWindow::plugindb->get(i);
                if( !plugin->audio && !plugin->video ) continue;
@@ -2487,8 +2521,9 @@ void AddTools::create_objects()
 
 #if 0
 // plugin_dirs list from toplevel makefile include plugin_defs
-N_("ladspa")
 N_("ffmpeg")
+N_("ladspa")
+N_("lv2")
 N_("audio_tools")
 N_("audio_transitions")
 N_("blending")