#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
#include "ardour/session.h"
+#include "ardour/value_as_string.h"
#include "ardour_ui.h"
#include "prompter.h"
HBox* constraint_hbox = manage (new HBox);
HBox* smaller_hbox = manage (new HBox);
+ HBox* automation_hbox = manage (new HBox);
smaller_hbox->set_spacing (4);
+ automation_hbox->set_spacing (4);
Label* combo_label = manage (new Label (_("<span size=\"large\">Presets</span>")));
combo_label->set_use_markup (true);
smaller_hbox->pack_start (save_button, false, false);
smaller_hbox->pack_start (delete_button, false, false);
smaller_hbox->pack_start (bypass_button, false, true);
+
+ automation_manual_all_button.set_label(_("Manual All"));
+ automation_play_all_button.set_label(_("Play All"));
+ automation_write_all_button.set_label(_("Write All"));
+ automation_touch_all_button.set_label(_("Touch All"));
+
+ Gtk::Alignment *al = Gtk::manage(new Gtk::Alignment());
+ al->set_size_request(6, 2);
+ automation_hbox->pack_start(*al, false, true);
+
+ automation_hbox->pack_start (automation_manual_all_button, false, false);
+ automation_hbox->pack_start (automation_play_all_button, false, false);
+ automation_hbox->pack_start (automation_write_all_button, false, false);
+ automation_hbox->pack_start (automation_touch_all_button, false, false);
constraint_hbox->set_spacing (5);
constraint_hbox->set_homogeneous (false);
}
v1_box->pack_start (*smaller_hbox, false, true);
+ v1_box->pack_start (*automation_hbox, false, true);
v2_box->pack_start (focus_button, false, true);
main_contents.pack_start (settings_box, false, false);
/* Don't show latency control ports */
- if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("latency")) {
+ const Evoral::Parameter param(PluginAutomation, 0, i);
+ if (plugin->describe_parameter (param) == X_("latency")) {
continue;
}
- if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("hidden")) {
+ if (plugin->describe_parameter (param) == X_("hidden")) {
continue;
}
+ const float value = plugin->get_parameter(i);
+
ControlUI* cui;
boost::shared_ptr<ARDOUR::AutomationControl> c
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
- insert->control(Evoral::Parameter(PluginAutomation, 0, i)));
+ insert->control(param));
ParameterDescriptor desc;
plugin->get_parameter_descriptor(i, desc);
- if ((cui = build_control_ui (desc, c, plugin->parameter_is_input(i))) == 0) {
+ if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i))) == 0) {
error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
continue;
}
const Plugin::PropertyDescriptors& descs = plugin->get_supported_properties();
for (Plugin::PropertyDescriptors::const_iterator d = descs.begin(); d != descs.end(); ++d) {
const ParameterDescriptor& desc = d->second;
+ const Evoral::Parameter param(PluginPropertyAutomation, 0, desc.key);
boost::shared_ptr<ARDOUR::AutomationControl> c
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
- insert->control(Evoral::Parameter(PluginPropertyAutomation, 0, desc.key)));
+ insert->control(param));
if (!c) {
error << string_compose(_("Plugin Editor: no control for property %1"), desc.key) << endmsg;
continue;
}
- ControlUI* cui = build_control_ui(desc, c, true);
+ ControlUI* cui = build_control_ui(param, desc, c, c->get_value(), true);
if (!cui) {
error << string_compose(_("Plugin Editor: could not build control element for property %1"),
desc.key) << endmsg;
output_table.show_all ();
button_table.show_all ();
+
+ // Connect automation *_all buttons
+ automation_manual_all_button.signal_clicked().connect(boost::bind(&GenericPluginUI::automation_manual_all, this, control_uis));
+ automation_play_all_button.signal_clicked().connect(boost::bind(&GenericPluginUI::automation_play_all, this, control_uis));
+ automation_write_all_button.signal_clicked().connect(boost::bind(&GenericPluginUI::automation_write_all, this, control_uis));
+ automation_touch_all_button.signal_clicked().connect(boost::bind(&GenericPluginUI::automation_touch_all, this, control_uis));
}
-GenericPluginUI::ControlUI::ControlUI ()
- : automate_button (X_("")) // force creation of a label
+GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
+ : param(p)
+ , automate_button (X_("")) // force creation of a label
, file_button(NULL)
{
automate_button.set_name ("PluginAutomateButton");
}
}
-
bool
GenericPluginUI::integer_printer (char buf[32], Adjustment &adj, ControlUI* cui)
{
- float const v = adj.get_value ();
-
- if (cui->scale_points) {
- ScalePoints::const_iterator i = cui->scale_points->begin ();
- while (i != cui->scale_points->end() && i->second != v) {
- ++i;
- }
-
- if (i != cui->scale_points->end ()) {
- snprintf (buf, 32, "%s", i->first.c_str());
- return true;
- }
- }
-
- snprintf (buf, 32, "%.0f", v);
+ float const v = cui->control->interface_to_internal(adj.get_value ());
+ const std::string& str = ARDOUR::value_as_string(cui->control->desc(), Variant(v));
+ const size_t len = str.copy(buf, 31);
+ buf[len] = '\0';
return true;
}
bool
GenericPluginUI::midinote_printer (char buf[32], Adjustment &adj, ControlUI* cui)
{
- float const v = adj.get_value ();
-
- if (cui->scale_points) {
- ScalePoints::const_iterator i = cui->scale_points->begin ();
- while (i != cui->scale_points->end() && i->second != v) {
- ++i;
- }
-
- if (i != cui->scale_points->end ()) {
- snprintf (buf, 32, "%s", i->first.c_str());
- return true;
- }
- }
- if (v >= 0 && v <= 127) {
- int mn = rint(v);
- const char notename[12][3] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
- snprintf (buf, 32, "%s %d", notename[mn%12], (mn/12)-2);
- } else {
- snprintf (buf, 32, "%.0f", v);
- }
+ float const v = cui->control->interface_to_internal(adj.get_value ());
+ const std::string& str = ARDOUR::value_as_string(cui->control->desc(), Variant(v));
+ const size_t len = str.copy(buf, 31);
+ buf[len] = '\0';
return true;
}
plugin->print_parameter (param, buf, len);
}
+/** Build a ControlUI for a parameter/property.
+ * Note that mcontrol may be NULL for outputs.
+ */
GenericPluginUI::ControlUI*
-GenericPluginUI::build_control_ui (const ParameterDescriptor& desc,
+GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
+ const ParameterDescriptor& desc,
boost::shared_ptr<AutomationControl> mcontrol,
+ float value,
bool is_input)
{
ControlUI* control_ui = 0;
- const float value = mcontrol->get_value();
-
- control_ui = manage (new ControlUI ());
+ control_ui = manage (new ControlUI (param));
control_ui->combo = 0;
control_ui->control = mcontrol;
control_ui->update_pending = false;
Adjustment* adj = control_ui->controller->adjustment();
if (desc.integer_step) {
- control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox");
+ control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox", desc.enumeration);
Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
- if (desc.midinote) {
+ if (desc.unit == ParameterDescriptor::MIDI_NOTE) {
control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midinote_printer), control_ui));
} else {
control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
automation_menu->popup (1, gtk_get_current_event_time());
}
+void
+GenericPluginUI::automation_manual_all(std::vector<ControlUI *>& controls)
+{
+ for (std::vector<ControlUI *>::iterator control_it = controls.begin(); control_it != controls.end(); ++control_it)
+ {
+ if ((*control_it)->controller || (*control_it)->button)
+ set_automation_state((AutoState) ARDOUR::Off, (*control_it));
+ }
+}
+
+void
+GenericPluginUI::automation_play_all(std::vector<ControlUI *>& controls)
+{
+ for (std::vector<ControlUI *>::iterator control_it = controls.begin(); control_it != controls.end(); ++control_it)
+ {
+ if ((*control_it)->controller || (*control_it)->button)
+ set_automation_state((AutoState) Play, (*control_it));
+ }
+}
+
+void
+GenericPluginUI::automation_write_all(std::vector<ControlUI *>& controls)
+{
+ for (std::vector<ControlUI *>::iterator control_it = controls.begin(); control_it != controls.end(); ++control_it)
+ {
+ if ((*control_it)->controller || (*control_it)->button)
+ set_automation_state((AutoState) Write, (*control_it));
+ }
+}
+
+void
+GenericPluginUI::automation_touch_all(std::vector<ControlUI *>& controls)
+{
+ for (std::vector<ControlUI *>::iterator control_it = controls.begin(); control_it != controls.end(); ++control_it)
+ {
+ if ((*control_it)->controller || (*control_it)->button)
+ set_automation_state((AutoState) Touch, (*control_it));
+ }
+}
+
void
GenericPluginUI::set_automation_state (AutoState state, ControlUI* cui)
{
GenericPluginUI::output_update ()
{
for (vector<ControlUI*>::iterator i = output_controls.begin(); i != output_controls.end(); ++i) {
- float val = (*i)->control->get_value();
+ float val = plugin->get_parameter ((*i)->parameter().id());
char buf[32];
snprintf (buf, sizeof(buf), "%.2f", val);
(*i)->display_label->set_text (buf);