X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvirtualnode.C;fp=cinelerra-5.1%2Fcinelerra%2Fvirtualnode.C;h=92701bdd3b38056326224b0a704f7b3318210e4c;hp=f773d3eec24bf7a78259f1da0bda17a7d98e3af3;hb=9782ed720c4e992ed0427de68c6646720c9b44e4;hpb=255d67d0fcabfbcd208f2587a9a75697a15d6349 diff --git a/cinelerra-5.1/cinelerra/virtualnode.C b/cinelerra-5.1/cinelerra/virtualnode.C index f773d3ee..92701bdd 100644 --- a/cinelerra-5.1/cinelerra/virtualnode.C +++ b/cinelerra-5.1/cinelerra/virtualnode.C @@ -28,6 +28,7 @@ #include "floatautos.h" #include "intauto.h" #include "intautos.h" +#include "mainerror.h" #include "mwindow.h" #include "module.h" #include "panauto.h" @@ -286,29 +287,29 @@ int VirtualNode::expand_as_plugin(int duplicate) return 0; } -int VirtualNode::attach_virtual_module(Plugin *plugin, - int plugin_number, - int duplicate, - int64_t current_position) +int VirtualNode::check_circular(Track *track) { - if(plugin->on) - { - int real_module_number = plugin->shared_location.module; - Module *real_module = vconsole->module_number(real_module_number); -// If a track is deleted real_module is not found - if(!real_module) return 1; - - Track *track = real_module->track; + if( real_module && real_module->track == track ) return 1; + return !parent_node ? 0 : parent_node->check_circular(track); +} +int VirtualNode::attach_virtual_module(Plugin *plugin, int plugin_set_no, + int duplicate, int64_t current_position) +{ + if( plugin->on ) { + int shared_track_no = plugin->shared_location.module; + Module *real_module = vconsole->module_number(shared_track_no); +// If a track is deleted real_module is not found + if( !real_module ) return 1; + Track *real_track = real_module->track; // Switch off if circular reference. This happens if a track is deleted. - if(this->real_module && track == this->real_module->track) return 1; - - - - - VirtualNode *virtual_module = create_module(plugin, - real_module, - track); + if( check_circular(real_track) ) { + int plugin_track_no = plugin->track->get_item_number(); + eprintf("circular references, track %d, plugin_set %d, plugin %d\n", + plugin_track_no, plugin_set_no, plugin->get_item_number()); + return 1; + } + VirtualNode *virtual_module = create_module(plugin, real_module, real_track); subnodes.append(virtual_module); virtual_module->expand(duplicate, current_position);