samplerate = 44100;
refreshrate = 30.;
+ min_block_length = 1;
block_length = 4096;
midi_buf_size = 8192;
schedule.schedule_work = lv2_worker_schedule;
worker_iface = 0; worker_done = -1;
pthread_mutex_init(&worker_lock, 0);
+ pthread_mutex_init(&startup_lock, 0);
+ pthread_mutex_lock(&startup_lock);
pthread_cond_init(&worker_ready, 0);
work_avail = 0; work_input = 0;
work_output = 0; work_tail = &work_output;
}
}
+ if( !nb_inputs || !nb_outputs ) {
+ printf(": Unsupported lv2 plugin, missing audio input or output\n");
+ reset_lv2();
+ return 1;
+ }
+
uri_map.handle = (LV2_URID_Map_Handle)this;
uri_map.map = map_uri;
features.append(new Lv2Feature(LV2_URID__map, &uri_map));
ui_updateRate = uri_table.map(LV2_UI__updateRate);
samplerate = sample_rate;
- block_length = bfrsz;
options.add(param_sampleRate, sizeof(float), atom_float, &samplerate);
- options.add(bufsz_minBlockLength, sizeof(int), atom_int, &block_length);
+ if( min_block_length > bfrsz ) min_block_length = bfrsz;
+ options.add(bufsz_minBlockLength, sizeof(int), atom_int, &min_block_length);
+ block_length = bfrsz;
options.add(bufsz_maxBlockLength, sizeof(int), atom_int, &block_length);
options.add(bufsz_sequenceSize, sizeof(int), atom_int, &midi_buf_size);
options.add(ui_updateRate, sizeof(float), atom_float, &refreshrate);
printf("lv2: lilv_plugin_instantiate failed\n");
return 1;
}
-
+
+// After instantiate, some plugins require fields to be filled in before
+// activate is called. This is done via ConnectPort, which connects a
+// port to a data structure in the host (CinGG). So these have to be
+// allocated first.
+
+ init_buffer(bfrsz);
+ connect_ports(conf, PORTS_ALL);
+
const LV2_Descriptor *lilv_desc = inst->lv2_descriptor;
worker_iface = !lilv_desc->extension_data ? 0 :
(LV2_Worker_Interface*)lilv_desc->extension_data(LV2_WORKER__interface);
(lilv_plugin_has_feature(lilv, powerOf2BlockLength) ||
lilv_plugin_has_feature(lilv, fixedBlockLength) ||
lilv_plugin_has_feature(lilv, boundedBlockLength)) ? 4096 : 0;
+
return 0;
}
void *PluginLV2::worker_func()
{
pthread_mutex_lock(&worker_lock);
+ pthread_mutex_unlock(&startup_lock);
for(;;) {
while( !worker_done && !work_input )
pthread_cond_wait(&worker_ready, &worker_lock);
void PluginLV2::worker_start()
{
pthread_create(&worker_thread, 0, worker_func, this);
+ pthread_mutex_lock(&startup_lock);
}
void PluginLV2::worker_stop()