dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / pluginlv2client.C
index 7ccb6ef8f2aad633d36c2a0c931fc7034c4872b0..289eed4ea98541b06a3df7198e537a0a787628ea 100644 (file)
 #include "bchash.h"
 #include "clip.h"
 #include "cstrdup.h"
+#include "edl.h"
+#include "edlsession.h"
 #include "file.h"
+#include "filesystem.h"
 #include "filexml.h"
 #include "language.h"
 #include "mainerror.h"
@@ -164,8 +167,15 @@ NEW_WINDOW_MACRO(PluginLV2Client, PluginLV2ClientWindow)
 
 int PluginLV2Client::init_lv2()
 {
+       int bfrsz = block_length;
+       EDL *edl = server->edl;
+       if( edl ) {
+               PlaybackConfig *playback_config = edl->session->playback_config;
+               bfrsz = playback_config->aconfig->fragment_size;
+       }
        int sample_rate = get_project_samplerate();
-       return PluginLV2::init_lv2(config, sample_rate);
+       if( sample_rate < 64 ) sample_rate = samplerate;
+       return PluginLV2::init_lv2(config, sample_rate, bfrsz);
 }
 
 int PluginLV2Client::load_configuration()
@@ -219,7 +229,7 @@ char* PluginLV2Client::to_string(char *string, const char *input)
 void PluginLV2Client::save_data(KeyFrame *keyframe)
 {
        FileXML output;
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        char name[BCTEXTLEN];  to_string(name, plugin_title());
        output.tag.set_title(name);
        for( int i=0; i<config.size(); ++i ) {
@@ -233,7 +243,7 @@ void PluginLV2Client::save_data(KeyFrame *keyframe)
 void PluginLV2Client::read_data(KeyFrame *keyframe)
 {
        FileXML input;
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
        char name[BCTEXTLEN];  to_string(name, plugin_title());
 
        while( !input.read_tag() ) {
@@ -307,6 +317,37 @@ int PluginLV2Client::process_realtime(int64_t size,
 }
 
 
+PluginLV2BlackList::PluginLV2BlackList(const char *path)
+{
+       set_array_delete();
+       char lv2_blacklist_path[BCTEXTLEN];
+       sprintf(lv2_blacklist_path, "%s/%s", File::get_cindat_path(), path);
+       FILE *bfp = fopen(lv2_blacklist_path, "r");
+       if( !bfp ) return;
+       while( fgets(lv2_blacklist_path, sizeof(lv2_blacklist_path), bfp) ) {
+               if( lv2_blacklist_path[0] == '#' ) continue;
+               int len = strlen(lv2_blacklist_path);
+               if( len > 0 && lv2_blacklist_path[len-1] == '\n' )
+                       lv2_blacklist_path[len-1] = 0;
+               if( !lv2_blacklist_path[0] ) continue;
+               append(cstrdup(lv2_blacklist_path));
+       }
+       fclose(bfp);
+}
+
+PluginLV2BlackList::~PluginLV2BlackList()
+{
+       remove_all_objects();
+}
+
+int PluginLV2BlackList::is_badboy(const char *uri)
+{
+       FileSystem fs;
+       for( int i=size(); --i>=0; )
+               if( !fs.test_filter(uri, get(i)) ) return 1;
+       return 0;
+}
+
 PluginServer* MWindow::new_lv2_server(MWindow *mwindow, const char *name)
 {
        return new PluginServer(mwindow, name, PLUGIN_TYPE_LV2);
@@ -323,6 +364,8 @@ PluginClient *PluginServer::new_lv2_plugin()
 int MWindow::init_lv2_index(MWindow *mwindow, Preferences *preferences, FILE *fp)
 {
        printf("init lv2 index:\n");
+       PluginLV2BlackList blacklist("lv2_blacklist.txt");
+
        LilvWorld *world = lilv_world_new();
        lilv_world_load_all(world);
        const LilvPlugins *all_plugins = lilv_world_get_all_plugins(world);
@@ -330,6 +373,8 @@ int MWindow::init_lv2_index(MWindow *mwindow, Preferences *preferences, FILE *fp
        LILV_FOREACH(plugins, i, all_plugins) {
                const LilvPlugin *lilv = lilv_plugins_get(all_plugins, i);
                const char *uri = lilv_node_as_uri(lilv_plugin_get_uri(lilv));
+               if( blacklist.is_badboy(uri) ) continue;
+printf("LOAD: %s\n", uri);
                PluginServer server(mwindow, uri, PLUGIN_TYPE_LV2);
                int result = server.open_plugin(1, preferences, 0, 0);
                if( !result ) {
@@ -356,7 +401,7 @@ PluginLV2ParentUI::PluginLV2ParentUI(Plugin *plugin)
        output_bfr = new Condition(0, "PluginLV2ParentUI::output_bfr", 1);
        client = 0;
        gui = 0;
-       hidden = 1;
+       hidden = -1;
 }
 
 PluginLV2ParentUI::~PluginLV2ParentUI()
@@ -373,6 +418,8 @@ void PluginLV2ParentUI::start_parent(PluginLV2Client *client)
        char bfr[len];  memset(bfr, 0, len);
        open_bfr_t *open_bfr = (open_bfr_t *)bfr;
        open_bfr->sample_rate = client->get_project_samplerate();
+       PlaybackConfig *playback_config = client->server->edl->session->playback_config;
+       open_bfr->bfrsz = playback_config->aconfig->fragment_size;
        strcpy(open_bfr->path, path);
        send_child(LV2_OPEN, open_bfr, len);
        PluginLV2ClientConfig &conf = client->config;
@@ -392,6 +439,8 @@ int PluginLV2ParentUI::handle_parent()
                hidden = 1;
                break; }
        case LV2_SHOW: {
+               if( hidden < 0 )
+                       gui->lv2_ui_enable();
                hidden = 0;
                break; }
        case LV2_SHMID: {
@@ -424,16 +473,14 @@ int PluginLV2ParentUI::hide()
        return 0;
 }
 
-
-// stub in parent
-int PluginLV2ChildUI::handle_child() { return 0; }
-void PluginLV2UI::reset_gui() {}
-
 ForkChild *PluginLV2ParentUI::new_fork()
 {
        return new PluginLV2ChildUI();
 }
 
+// stub in parent
+int PluginLV2ChildUI::child_iteration(int64_t usec) { return -1; }
+int PluginLV2ChildUI::send_host(int64_t token, const void *data, int bytes) { return -1; }
 
 #else
 #include "mwindow.h"