📄 plugin.c
字号:
if (instance->is_restored) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), instance->is_bypassed); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE); } /* count control I/O ports */ for (k = 0; k < MAX_KNOBS && k < plugin->PortCount; ++k) { if (LADSPA_IS_PORT_AUDIO(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_PORT_INPUT(plugin->PortDescriptors[k])) { if (LADSPA_IS_HINT_TOGGLED(hints[k].HintDescriptor)) { ++n_toggled; } else { ++n_untoggled; } } else { if (strcmp(plugin->PortNames[k], "latency") == 0) { ++n_outlat; } else { ++n_outctl; } } ++n_rows; } if ((n_toggled) && (n_untoggled)) ++n_rows; if (((n_toggled) || (n_untoggled)) && (n_outctl)) ++n_rows; if (((n_toggled) || (n_untoggled) || (n_outctl)) && (n_outlat)) ++n_rows; scrwin = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_name(scrwin, "plugin_scrwin"); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(vbox), scrwin, TRUE, TRUE, 2); inner_vbox = gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrwin), inner_vbox); if ((n_toggled) || (n_untoggled) || (n_outctl) || (n_outlat)) { table = gtk_table_new(n_rows, 3, FALSE); gtk_box_pack_start(GTK_BOX(inner_vbox), table, TRUE, TRUE, 2); } if (n_toggled) { for (k = 0; k < MAX_KNOBS && k < plugin->PortCount; ++k) { int max_height = 0; if (!LADSPA_IS_PORT_CONTROL(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_PORT_OUTPUT(plugin->PortDescriptors[k])) continue; if (!LADSPA_IS_HINT_TOGGLED(hints[k].HintDescriptor)) continue; widget = gtk_label_new(plugin->PortNames[k]); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, i, i+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 2, 2); gtk_widget_size_request(widget, &req); req.height += 2; if (req.width > max_width) max_width = req.width; if (req.height > max_height) max_height = req.height; widget = gtk_toggle_button_new(); gtk_widget_set_name(widget, "plugin_toggled"); gtk_widget_set_size_request(widget, 14, 14); gtk_table_attach(GTK_TABLE(table), widget, 2, 3, i, i+1, 0, 0, 0, 0); gtk_widget_size_request(widget, &req); if (req.height > max_height) max_height = req.height; height += max_height; ++i; g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(plugin_btn_toggled), &(instance->knobs[k])); if (((instance->is_restored) && (instance->knobs[k] > 0.0f)) || ((!instance->is_restored) && (LADSPA_IS_HINT_DEFAULT_1(hints[k].HintDescriptor)))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE); } } } if ((n_toggled) && (n_untoggled)) { hseparator = gtk_hseparator_new(); gtk_table_attach(GTK_TABLE(table), hseparator, 0, 3, i, i+1, GTK_FILL, GTK_FILL, 2, 2); ++i; gtk_widget_size_request(hseparator, &req); height += req.height + 5; } if (n_untoggled) { for (k = 0; k < MAX_KNOBS && k < plugin->PortCount; ++k) { int max_height = 0; if (!LADSPA_IS_PORT_CONTROL(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_PORT_OUTPUT(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_HINT_TOGGLED(hints[k].HintDescriptor)) continue; widget = gtk_label_new(plugin->PortNames[k]); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, i, i+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 2, 2); gtk_widget_size_request(widget, &req); req.height += 2; if (req.width > max_width) max_width = req.width; if (LADSPA_IS_HINT_SAMPLE_RATE(hints[k].HintDescriptor)) { fact = out_SR; } else { fact = 1.0f; } if (LADSPA_IS_HINT_BOUNDED_BELOW(hints[k].HintDescriptor)) { min = hints[k].LowerBound * fact; } else { min = -10000.0f; } if (LADSPA_IS_HINT_BOUNDED_ABOVE(hints[k].HintDescriptor)) { max = hints[k].UpperBound * fact; } else { max = 10000.0f; } /* infinity */ if (10000.0f <= max - min) { dp = 1; step = 5.0f; /* 100.0 ... lots */ } else if (100.0f < max - min) { dp = 0; step = 1.0f; /* 10.0 ... 100.0 */ } else if (10.0f < max - min) { dp = 1; step = 0.1f; /* 1.0 ... 10.0 */ } else if (1.0f < max - min) { dp = 2; step = 0.01f; /* 0.0 ... 1.0 */ } else { dp = 3; step = 0.001f; } if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { dp = 0; if (step < 1.0f) step = 1.0f; } if (LADSPA_IS_HINT_DEFAULT_MINIMUM(hints[k].HintDescriptor)) { default_val = min; } else if (LADSPA_IS_HINT_DEFAULT_LOW(hints[k].HintDescriptor)) { default_val = min * 0.75f + max * 0.25f; } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(hints[k].HintDescriptor)) { default_val = min * 0.5f + max * 0.5f; } else if (LADSPA_IS_HINT_DEFAULT_HIGH(hints[k].HintDescriptor)) { default_val = min * 0.25f + max * 0.75f; } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(hints[k].HintDescriptor)) { default_val = max; } else if (LADSPA_IS_HINT_DEFAULT_0(hints[k].HintDescriptor)) { default_val = 0.0f; } else if (LADSPA_IS_HINT_DEFAULT_1(hints[k].HintDescriptor)) { default_val = 1.0f; } else if (LADSPA_IS_HINT_DEFAULT_100(hints[k].HintDescriptor)) { default_val = 100.0f; } else if (LADSPA_IS_HINT_DEFAULT_440(hints[k].HintDescriptor)) { default_val = 440.0f; } else if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { default_val = min; } else if (max >= 0.0f && min <= 0.0f) { default_val = 0.0f; } else { default_val = min * 0.5f + max * 0.5f; } if (instance->is_restored) { start = instance->knobs[k]; } else { instance->knobs[k] = start = default_val; } defs = lrdf_get_scale_values(plugin->UniqueID, k); if ((defs) && (defs->count > 0)) { /* have scale values */ combo = gtk_combo_box_new_text (); gtk_widget_set_name(combo, "plugin_combo"); glist = NULL; gtk_table_attach(GTK_TABLE(table), combo, 1, 3, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); for (j = 0; j < defs->count; j++) { gtk_combo_box_append_text (GTK_COMBO_BOX (combo), defs->items[j].label); } gtk_widget_size_request(combo, &req); req.height += 2; if (req.height > max_height) max_height = req.height; /* now if we have an option that corresponds to 'start', choose that. */ for (j = 0; j < defs->count; j++) { if (defs->items[j].value == start) { gtk_combo_box_set_active (GTK_COMBO_BOX (combo), start); break; } } if ((optdata = malloc(sizeof(optdata_t))) == NULL) { fprintf(stderr, "plugin.c: build_plugin_window(): malloc error\n"); return; } trashlist_add(instance->trashlist, optdata); optdata->instance = instance; optdata->index = k; g_signal_connect(combo, "changed", G_CALLBACK(changed_combo), optdata); } else { /* no scale values */ adjustment = gtk_adjustment_new(start, min, max, step, step * 50.0, 0.0); instance->adjustments[k] = GTK_ADJUSTMENT(adjustment); g_signal_connect(G_OBJECT(adjustment), "value_changed", G_CALLBACK(plugin_value_changed), &(instance->knobs[k])); if (!LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { widget = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_widget_set_name(widget, "plugin_scale"); gtk_widget_set_size_request(widget, 200, -1); gtk_scale_set_digits(GTK_SCALE(widget), dp); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); gtk_scale_set_draw_value(GTK_SCALE(widget), FALSE); gtk_widget_size_request(widget, &req); req.height += 2; if (req.height > max_height) max_height = req.height; if ((btnpdata = malloc(sizeof(btnpdata_t))) == NULL) { fprintf(stderr, "plugin.c: build_plugin_window(): malloc error\n"); return; } trashlist_add(instance->trashlist, btnpdata); btnpdata->instance = instance; btnpdata->start = default_val; g_signal_connect(G_OBJECT(widget), "button_press_event", G_CALLBACK(plugin_scale_btn_pressed), (gpointer) btnpdata); } widget = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), step, dp); gtk_widget_set_size_request(widget, 70, -1); gtk_table_attach(GTK_TABLE(table), widget, 2, 3, i, i+1, GTK_FILL, GTK_FILL, 2, 2); gtk_widget_size_request(widget, &req); req.height += 2; if (req.height > max_height) max_height = req.height; } height += max_height; ++i; lrdf_free_setting_values(defs); } } if (((n_toggled) || (n_untoggled)) && (n_outctl)) { hseparator = gtk_hseparator_new(); gtk_table_attach(GTK_TABLE(table), hseparator, 0, 3, i, i+1, GTK_FILL, GTK_FILL, 2, 2); ++i; gtk_widget_size_request(hseparator, &req); height += req.height + 5; } if (n_outctl) { for (k = 0; k < MAX_KNOBS && k < plugin->PortCount; ++k) { int max_height = 0; if (!LADSPA_IS_PORT_CONTROL(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_PORT_INPUT(plugin->PortDescriptors[k])) continue; if (LADSPA_IS_HINT_TOGGLED(hints[k].HintDescriptor)) continue; widget = gtk_label_new(plugin->PortNames[k]); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, i, i+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 2, 2); gtk_widget_size_request(widget, &req); req.height += 2; if (req.width > max_width) max_width = req.width; if (req.height > max_height) max_height = req.height; if (LADSPA_IS_HINT_SAMPLE_RATE(hints[k].HintDescriptor)) { fact = out_SR; } else { fact = 1.0f; } if (LADSPA_IS_HINT_BOUNDED_BELOW(hints[k].HintDescriptor)) { min = hints[k].LowerBound * fact; } else { min = -10000.0f; } if (LADSPA_IS_HINT_BOUNDED_ABOVE(hints[k].HintDescriptor)) { max = hints[k].UpperBound * fact; } else { max = 10000.0f; } /* infinity */ if (10000.0f <= max - min) { dp = 1; step = 5.0f; /* 100.0 ... lots */ } else if (100.0f < max - min) { dp = 0; step = 1.0f; /* 10.0 ... 100.0 */ } else if (10.0f < max - min) { dp = 1; step = 0.1f; /* 1.0 ... 10.0 */ } else if (1.0f < max - min) { dp = 2; step = 0.01f; /* 0.0 ... 1.0 */ } else { dp = 3; step = 0.001f; } if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { dp = 0; if (step < 1.0f) step = 1.0f; } if (LADSPA_IS_HINT_DEFAULT_MINIMUM(hints[k].HintDescriptor)) { start = min; } else if (LADSPA_IS_HINT_DEFAULT_LOW(hints[k].HintDescriptor)) { start = min * 0.75f + max * 0.25f; } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(hints[k].HintDescriptor)) { start = min * 0.5f + max * 0.5f; } else if (LADSPA_IS_HINT_DEFAULT_HIGH(hints[k].HintDescriptor)) { start = min * 0.25f + max * 0.75f; } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(hints[k].HintDescriptor)) { start = max; } else if (LADSPA_IS_HINT_DEFAULT_0(hints[k].HintDescriptor)) { start = 0.0f; } else if (LADSPA_IS_HINT_DEFAULT_1(hints[k].HintDescriptor)) { start = 1.0f; } else if (LADSPA_IS_HINT_DEFAULT_100(hints[k].HintDescriptor)) { start = 100.0f; } else if (LADSPA_IS_HINT_DEFAULT_440(hints[k].HintDescriptor)) { start = 440.0f; } else if (LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { start = min; } else if (max >= 0.0f && min <= 0.0f) { start = 0.0f; } else { start = min * 0.5f + max * 0.5f; } instance->knobs[k] = start; adjustment = gtk_adjustment_new(start, min, max, step, step * 50.0, 0.0); instance->adjustments[k] = GTK_ADJUSTMENT(adjustment); if (!LADSPA_IS_HINT_INTEGER(hints[k].HintDescriptor)) { widget = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); gtk_widget_set_name(widget, "plugin_scale"); gtk_widget_set_size_request(widget, 200, -1); gtk_scale_set_digits(GTK_SCALE(widget), dp); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); gtk_scale_set_draw_value(GTK_SCALE(widget), FALSE); gtk_widget_set_sensitive(widget, FALSE); gtk_widget_size_request(widget, &req); req.height += 2; if (req.height > max_height) max_height = req.height; } widget = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), step, dp); gtk_widget_set_size_request(widget, 70, -1); gtk_widget_set_sensitive(widget, FALSE); gtk_table_attach(GTK_TABLE(table), widget, 2, 3, i, i+1, GTK_FILL, GTK_FILL, 2, 2); gtk_widget_size_request(widget, &req); req.height += 2; if (req.height > max_height) max_height = req.height; height += max_height; ++i; } } if (((n_toggled) || (n_untoggled) || (n_outctl)) && (n_outlat)) { hseparator = gtk_hseparator_new(); gtk_table_attach(GTK_TABLE(table), hseparator, 0, 3, i, i+1, GTK_FILL, GTK_FILL, 2, 2); ++i; gtk_widget_size_request(hseparator, &req); height += req.height + 5; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -