From 6dfe954672baf5bf886f2a3abc1e2be80f63d6b9 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Sat, 16 Apr 2005 19:50:33 +0000 Subject: [PATCH] r551: Fixed references of shared effects when a track is deleted. Shared effects that reference the deleted track are also deleted. --- cinelerra/mwindowedit.C | 14 ++-------- cinelerra/track.C | 58 ++++++++++++++++++++++------------------- cinelerra/track.h | 3 +-- cinelerra/tracks.C | 29 ++++++++++++++------- cinelerra/tracks.h | 4 +-- cinelerra/tracksedit.C | 69 ++++++++----------------------------------------- 6 files changed, 66 insertions(+), 111 deletions(-) diff --git a/cinelerra/mwindowedit.C b/cinelerra/mwindowedit.C index 190ff611..dd30d963 100644 --- a/cinelerra/mwindowedit.C +++ b/cinelerra/mwindowedit.C @@ -424,18 +424,8 @@ void MWindow::delete_outpoint() void MWindow::delete_track() { - undo->update_undo_before(_("delete track"), LOAD_ALL); - edl->tracks->delete_track(); - undo->update_undo_after(); - save_backup(); - - restart_brender(); - update_plugin_states(); - gui->update(1, 1, 1, 0, 1, 0, 0); - cwindow->playback_engine->que->send_command(CURRENT_FRAME, - CHANGE_EDL, - edl, - 1); + if (edl->tracks->last) + delete_track(edl->tracks->last); } void MWindow::delete_tracks() diff --git a/cinelerra/track.C b/cinelerra/track.C index 1f99150c..d92e2fe7 100644 --- a/cinelerra/track.C +++ b/cinelerra/track.C @@ -626,6 +626,38 @@ void Track::detach_effect(Plugin *plugin) } } +void Track::detach_shared_effects(int module) +{ +repeat: + for(int i = 0; i < plugin_set.total; i++) + { + PluginSet *plugin_set = this->plugin_set.values[i]; + for(Plugin *dest = (Plugin*)plugin_set->first; + dest; + dest = (Plugin*)dest->next) + { + if ((dest->plugin_type == PLUGIN_SHAREDPLUGIN || + dest->plugin_type == PLUGIN_SHAREDMODULE) + && + dest->shared_location.module == module) + { + int64_t start = dest->startproject; + int64_t end = dest->startproject + dest->length; + + plugin_set->clear(start, end); + plugin_set->paste_silence(start, end); + +// Delete 0 length pluginsets + plugin_set->optimize(); + if(!plugin_set->length()) { + this->plugin_set.remove_object_number(i); + --i; + } + } + } + } +} + void Track::resample(double old_rate, double new_rate) { edits->resample(old_rate, new_rate); @@ -1226,32 +1258,6 @@ void Track::change_modules(int old_location, int new_location, int do_swap) } -int Track::delete_module_pointers(int deleted_track) -{ - for(int i = 0; i < plugin_set.total; i++) - { - for(Plugin *plugin = (Plugin*)plugin_set.values[i]->first; - plugin; - plugin = (Plugin*)plugin->next) - { - if(plugin->plugin_type == PLUGIN_SHAREDPLUGIN || - plugin->plugin_type == PLUGIN_SHAREDMODULE) - { - if(plugin->shared_location.module == deleted_track) - { - plugin->on = 0; - } - else - { - plugin->shared_location.module--; - } - } - } - } - - return 0; -} - int Track::playable_edit(int64_t position, int direction) { int result = 0; diff --git a/cinelerra/track.h b/cinelerra/track.h index 7a831213..a7513c1c 100644 --- a/cinelerra/track.h +++ b/cinelerra/track.h @@ -78,6 +78,7 @@ public: int plugin_type); void insert_plugin_set(Track *track, double position); void detach_effect(Plugin *plugin); + void detach_shared_effects(int module); // detach shared effects referencing module // Insert a track from another EDL void insert_track(Track *track, double position, @@ -148,7 +149,6 @@ public: void change_modules(int old_location, int new_location, int do_swap); - int delete_module_pointers(int deleted_track); EDL *edl; Tracks *tracks; @@ -299,7 +299,6 @@ public: virtual int reset_translation(int64_t start, int64_t end) { return 0; }; int feather_edits(int64_t start, int64_t end, int64_t units); int64_t get_feather(int64_t selectionstart, int64_t selectionend); - int shift_module_pointers(int deleted_track); // Absolute number of this track diff --git a/cinelerra/tracks.C b/cinelerra/tracks.C index 9f00a467..d45a8556 100644 --- a/cinelerra/tracks.C +++ b/cinelerra/tracks.C @@ -263,19 +263,18 @@ Track* Tracks::add_video_track(int above, Track *dst_track) } -int Tracks::delete_track() -{ - delete_track(last); - return 0; -} - int Tracks::delete_track(Track *track) { + if (!track) + return 0; + int old_location = number_of(track); -// Shift effects referenced below the deleted track - for(Track *current = last; - current && current != track; - current = PREVIOUS) + detach_shared_effects(old_location); + +// Shift effects referencing effects below the deleted track + for(Track *current = track; + current; + current = NEXT) { change_modules(number_of(current), number_of(current) - 1, 0); } @@ -284,6 +283,16 @@ int Tracks::delete_track(Track *track) return 0; } +int Tracks::detach_shared_effects(int module) +{ + for(Track *current = first; current; current = NEXT) + { + current->detach_shared_effects(module); + } + + return 0; +} + int Tracks::total_of(int type) { int result = 0; diff --git a/cinelerra/tracks.h b/cinelerra/tracks.h index 3c45b6a6..a3acbd9d 100644 --- a/cinelerra/tracks.h +++ b/cinelerra/tracks.h @@ -74,7 +74,6 @@ public: Track* add_video_track(int above, Track *dst_track); // Track* add_audio_track(int to_end = 1); // Track* add_video_track(int to_end = 1); - int delete_track(); // delete last track int delete_track(Track* track); // delete any track EDL *edl; @@ -116,8 +115,7 @@ public: // Change references to shared plugins in all tracks void change_plugins(SharedLocation &old_location, SharedLocation &new_location, int do_swap); - int delete_audio_track(); // delete the last audio track - int delete_video_track(); // delete the last video track + int detach_shared_effects(int module); // detach shared effects referencing module int delete_tracks(); // delete all the recordable tracks int delete_all_tracks(); // delete just the tracks diff --git a/cinelerra/tracksedit.C b/cinelerra/tracksedit.C index b5fb8e17..5928a5fd 100644 --- a/cinelerra/tracksedit.C +++ b/cinelerra/tracksedit.C @@ -143,44 +143,21 @@ int Tracks::copy_default_keyframe(FileXML *file) int Tracks::delete_tracks() { - int result = 1, total_deleted = 0; - Track *track, *next_track, *shifted_track; - int deleted_number; - - while(result) + int total_deleted = 0; +repeat: + for (Track* current = first; + current; + current = NEXT) { -// keep deleting until all the recordable tracks are gone - result = 0; - -//printf("Tracks::delete_tracks 1\n"); -// Stop when first recordable track is reached - for(track = first; - track && !result; - track = next_track) + if(current->record) { -//printf("Tracks::delete_tracks 2\n"); - next_track = track->next; - - if(track->record) - { - deleted_number = number_of(track); -// Delete the track. - delete track; - -// Shift all the plugin pointers. - for(shifted_track = next_track; - shifted_track; - shifted_track = shifted_track->next) - { - shifted_track->delete_module_pointers(deleted_number); - } - result = 1; - total_deleted++; - } + delete_track(current); + total_deleted++; + // this has garbled the linked list + // scan the shorter list again + goto repeat; } -//printf("Tracks::delete_tracks 3\n"); } -//printf("Tracks::delete_tracks 4\n"); return total_deleted; } @@ -461,30 +438,6 @@ int Tracks::concatenate_tracks(int edit_plugins) return result; } -int Tracks::delete_audio_track() -{ - Track *current; - - for(current = last; current && current->data_type != TRACK_AUDIO; current = PREVIOUS) - { - ; - } - - if(current) delete_track(current); -} - -int Tracks::delete_video_track() -{ - Track *current; - - for(current = last; current && current->data_type != TRACK_VIDEO; current = PREVIOUS) - { - ; - } - - if(current) delete_track(current); -} - int Tracks::delete_all_tracks() { while(last) delete last; -- 2.11.4.GIT