feat: implement URI-based plugin loading and GUI text input for Carla

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-02 22:35:55 +00:00
parent 426e36087b
commit 12a2f8ede2
2 changed files with 129 additions and 3 deletions

84
carla.c
View File

@@ -81,10 +81,88 @@ static int add_gain_plugin(CarlaHost *host, int channel) {
int carla_add_plugin(CarlaHost *host, int channel, const char *uri, PluginType type) {
if (!host || !host->initialized) return -1;
if (channel < 0 || channel >= 8) return -1;
if (!uri) return -1;
(void)uri;
(void)type;
return add_gain_plugin(host, channel);
ChannelRack *rack = &host->channel_racks[channel];
if (rack->num_plugins >= 16) return -1;
PluginInfo *plugin = &rack->plugins[rack->num_plugins];
// Parse URI to determine plugin type and name
if (strstr(uri, "internal://") == uri) {
// Internal plugin
plugin->type = PLUGIN_TYPE_INTERNAL;
strncpy(plugin->uri, uri, sizeof(plugin->uri) - 1);
plugin->uri[sizeof(plugin->uri) - 1] = '\0';
const char *name = uri + strlen("internal://");
if (strcmp(name, "gain") == 0) {
strcpy(plugin->name, "Gain");
plugin->num_parameters = 1;
plugin->parameters = malloc(sizeof(float));
plugin->parameters[0] = 1.0f;
plugin->parameter_names = malloc(sizeof(char*));
plugin->parameter_names[0] = strdup("Gain");
} else if (strcmp(name, "reverb") == 0) {
strcpy(plugin->name, "Reverb");
plugin->num_parameters = 2;
plugin->parameters = malloc(2 * sizeof(float));
plugin->parameters[0] = 0.5f; // Mix
plugin->parameters[1] = 0.5f; // Decay
plugin->parameter_names = malloc(2 * sizeof(char*));
plugin->parameter_names[0] = strdup("Mix");
plugin->parameter_names[1] = strdup("Decay");
} else if (strcmp(name, "delay") == 0) {
strcpy(plugin->name, "Delay");
plugin->num_parameters = 2;
plugin->parameters = malloc(2 * sizeof(float));
plugin->parameters[0] = 0.3f; // Feedback
plugin->parameters[1] = 0.5f; // Mix
plugin->parameter_names = malloc(2 * sizeof(char*));
plugin->parameter_names[0] = strdup("Feedback");
plugin->parameter_names[1] = strdup("Mix");
} else if (strcmp(name, "filter") == 0) {
strcpy(plugin->name, "Filter");
plugin->num_parameters = 2;
plugin->parameters = malloc(2 * sizeof(float));
plugin->parameters[0] = 1000.0f; // Cutoff
plugin->parameters[1] = 1.0f; // Resonance
plugin->parameter_names = malloc(2 * sizeof(char*));
plugin->parameter_names[0] = strdup("Cutoff");
plugin->parameter_names[1] = strdup("Resonance");
} else {
// Unknown internal plugin, default to gain
strcpy(plugin->name, "Unknown Internal");
plugin->num_parameters = 0;
plugin->parameters = NULL;
plugin->parameter_names = NULL;
}
} else {
// External plugin (LV2, VST, etc.) - store URI for future Carla integration
plugin->type = type;
strncpy(plugin->uri, uri, sizeof(plugin->uri) - 1);
plugin->uri[sizeof(plugin->uri) - 1] = '\0';
// Extract a display name from the URI
const char *last_slash = strrchr(uri, '/');
if (last_slash) {
strncpy(plugin->name, last_slash + 1, sizeof(plugin->name) - 1);
} else {
strncpy(plugin->name, uri, sizeof(plugin->name) - 1);
}
plugin->name[sizeof(plugin->name) - 1] = '\0';
plugin->num_parameters = 0;
plugin->parameters = NULL;
plugin->parameter_names = NULL;
}
plugin->carla_plugin_id = -1;
rack->num_plugins++;
printf("Added plugin '%s' (URI: %s) to channel %d\n", plugin->name, plugin->uri, channel);
return rack->num_plugins - 1;
}
int carla_remove_plugin(CarlaHost *host, int channel, int plugin_index) {