port 7.2 mods: align_edits foreground plugin refresh_frame tweak, rework soundlevel...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / plugin.C
index b4c8e4431c216913772eca95c41c3032ea5f329f..09d003b318c77513d1babf62bc505f9fc34fd974 100644 (file)
@@ -49,6 +49,7 @@ Plugin::Plugin(EDL *edl, Track *track, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -66,6 +67,7 @@ Plugin::Plugin(EDL *edl, PluginSet *plugin_set, const char *title)
        out = 1;
        show = 0;
        on = 1;
+       gui_id = -1;
        keyframes = new KeyFrames(edl, track);
        keyframes->create_objects();
 }
@@ -109,6 +111,20 @@ void Plugin::clear_keyframes(int64_t start, int64_t end)
 }
 
 
+void Plugin::init(const char *title,
+       int64_t unit_position, int64_t unit_length, int plugin_type,
+       SharedLocation *shared_location, KeyFrame *default_keyframe)
+{
+       if( title ) strcpy(this->title, title);
+       if( shared_location ) this->shared_location = *shared_location;
+       this->plugin_type = plugin_type;
+       if( default_keyframe )
+               *this->keyframes->default_auto = *default_keyframe;
+       this->keyframes->default_auto->position = unit_position;
+       this->startproject = unit_position;
+       this->length = unit_length;
+}
+
 void Plugin::copy_base(Edit *edit)
 {
        Plugin *plugin = (Plugin*)edit;
@@ -123,6 +139,7 @@ void Plugin::copy_base(Edit *edit)
        this->out = plugin->out;
        this->show = plugin->show;
        this->on = plugin->on;
+// dont copy gui_id, it will be a duplicate ref
 // Should reconfigure this based on where the first track is now.
        this->shared_location = plugin->shared_location;
        strcpy(this->title, plugin->title);
@@ -161,6 +178,7 @@ void Plugin::synchronize_params(Edit *edit)
        this->in = plugin->in;
        this->out = plugin->out;
        this->show = plugin->show;
+       this->gui_id = plugin->gui_id;
        this->on = plugin->on;
        strcpy(this->title, plugin->title);
        copy_keyframes(plugin);
@@ -199,56 +217,50 @@ void Plugin::equivalent_output(Edit *edit, int64_t *result)
        keyframes->equivalent_output(plugin->keyframes, startproject, result);
 }
 
-
-
-int Plugin::is_synthesis(int64_t position,
-               int direction)
+const char* Plugin::type_to_text(int type)
 {
-       switch(plugin_type)
-       {
-               case PLUGIN_STANDALONE:
-               {
-                       if(!track)
-                       {
-                               printf("Plugin::is_synthesis track not defined\n");
-                               return 0;
-                       }
-
+       switch( type ) {
+        case PLUGIN_STANDALONE:    return _("standalone");
+        case PLUGIN_SHAREDPLUGIN:  return _("shared plugin");
+        case PLUGIN_SHAREDMODULE:  return _("shared module");
+       }
+       return _("none");
+}
 
-                       PluginServer *plugin_server = MWindow::scan_plugindb(title,
-                               track->data_type);
-//printf("Plugin::is_synthesis %d %p %d\n", __LINE__, plugin_server, plugin_server->get_synthesis());
-//plugin_server->dump();
-                       return plugin_server->get_synthesis();
-                       break;
+int Plugin::is_synthesis(int64_t position, int direction, int depth)
+{
+       if( depth > 255 ) {
+               printf("Plugin::is_synthesis %d: depth range limit, type=%s, title=%s\n",
+                       __LINE__, type_to_text(plugin_type), title);
+               return 0;
+       }
+       switch( plugin_type ) {
+       case PLUGIN_STANDALONE: {
+               if( !track ) {
+                       printf("Plugin::is_synthesis track not defined\n");
+                       return 0;
                }
+               PluginServer *plugin_server = MWindow::scan_plugindb(title, track->data_type);
+               return plugin_server->get_synthesis(); }
 
 // Dereference real plugin and descend another level
-               case PLUGIN_SHAREDPLUGIN:
-               {
-                       int real_module_number = shared_location.module;
-                       int real_plugin_number = shared_location.plugin;
-                       Track *track = edl->tracks->number(real_module_number);
+       case PLUGIN_SHAREDPLUGIN: {
+               int real_module_number = shared_location.module;
+               int real_plugin_number = shared_location.plugin;
+               Track *track = edl->tracks->number(real_module_number);
 // Get shared plugin from master track
-                       Plugin *plugin = track->get_current_plugin(position,
-                               real_plugin_number,
-                               direction,
-                               0,
-                               0);
-
-                       if(plugin)
-                               return plugin->is_synthesis(position, direction);
-                       break;
-               }
+               Plugin *plugin = track->get_current_plugin(position,
+                       real_plugin_number, direction, 0, 0);
+
+               if(plugin)
+                       return plugin->is_synthesis(position, direction, depth+1);
+               break; }
 
 // Dereference the real track and descend
-               case PLUGIN_SHAREDMODULE:
-               {
-                       int real_module_number = shared_location.module;
-                       Track *track = edl->tracks->number(real_module_number);
-                       return track->is_synthesis(position, direction);
-                       break;
-               }
+       case PLUGIN_SHAREDMODULE: {
+               int real_module_number = shared_location.module;
+               Track *track = edl->tracks->number(real_module_number);
+               return track->is_synthesis(position, direction, depth+1); }
        }
        return 0;
 }
@@ -281,19 +293,6 @@ int Plugin::identical(Plugin *that)
                        ((KeyFrame*)that->keyframes->default_auto)));
 }
 
-int Plugin::identical_location(Plugin *that)
-{
-       if(!plugin_set || !plugin_set->track) return 0;
-       if(!that->plugin_set || !that->plugin_set->track) return 0;
-
-       if(plugin_set->track->number_of() == that->plugin_set->track->number_of() &&
-               plugin_set->get_number() == that->plugin_set->get_number() &&
-               startproject == that->startproject) return 1;
-
-       return 0;
-
-}
-
 int Plugin::keyframe_exists(KeyFrame *ptr)
 {
        for(KeyFrame *current = (KeyFrame*)keyframes->first;
@@ -580,8 +579,8 @@ void Plugin::shift(int64_t difference)
 
 void Plugin::dump(FILE *fp)
 {
-       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d\n",
-               plugin_type, title, on, shared_location.module, shared_location.plugin);
+       fprintf(fp,"    PLUGIN: type=%d title=\"%s\" on=%d track=%d plugin=%d gui_id=%d\n",
+               plugin_type, title, on, shared_location.module, shared_location.plugin, gui_id);
        fprintf(fp,"    startproject %jd length %jd\n", startproject, length);
 
        keyframes->dump(fp);