Indicate plugin-busses in the plugin pin dialog

This commit is contained in:
Robin Gareus
2023-01-06 00:51:00 +01:00
parent 617ec6f54f
commit 0063211b4e
2 changed files with 67 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2016-2018 Robin Gareus <robin@gareus.org>
* Copyright (C) 2016-2023 Robin Gareus <robin@gareus.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -395,7 +395,7 @@ PluginPinWidget::plugin_reconfigured ()
++_n_inputs;
}
CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, sidechain));
CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, 0, sidechain));
_elements.push_back (cw);
}
@@ -413,14 +413,14 @@ PluginPinWidget::plugin_reconfigured ()
DataType dt (i < _sinks.n_midi () ? DataType::MIDI : DataType::AUDIO);
int idx = (dt == DataType::MIDI) ? i : i - _sinks.n_midi ();
const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, true, idx));
CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.is_sidechain));
CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.bus_number, iod.is_sidechain));
_elements.push_back (cw);
}
for (uint32_t i = 0; i < _sources.n_total (); ++i) {
DataType dt (i < _sources.n_midi () ? DataType::MIDI : DataType::AUDIO);
int idx = (dt == DataType::MIDI) ? i : i - _sources.n_midi ();
const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, false, idx));
_elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n));
_elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n, iod.bus_number));
}
_in_map[n] = _pi->input_map (n);
_out_map[n] = _pi->output_map (n);
@@ -744,7 +744,7 @@ PluginPinWidget::update_element_pos ()
}
void
PluginPinWidget::set_color (cairo_t* cr, bool midi)
PluginPinWidget::set_color (cairo_t* cr, bool midi) const
{
// see also gtk2_ardour/processor_box.cc
static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
@@ -764,7 +764,7 @@ PluginPinWidget::set_color (cairo_t* cr, bool midi)
}
void
PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w)
PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w) const
{
if (w.e->sc) {
const double dy = w.h * .5;
@@ -860,6 +860,19 @@ PluginPinWidget::draw_plugin_pin (cairo_t* cr, const CtrlWidget& w)
}
}
void
PluginPinWidget::draw_plugin_bus (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1) const
{
const double dy = w0.h * .5;
rounded_top_rectangle (cr, w0.x - 1, w0.y - dy, 2 + w1.x + w0.w - w0.x, w0.h, 7);
cairo_set_line_width (cr, 1.0);
cairo_set_source_rgb (cr, .4, .4, .4);
cairo_stroke_preserve (cr);
cairo_set_source_rgb (cr, .6, .6, .6);
cairo_fill (cr);
}
double
PluginPinWidget::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi)
{
@@ -913,7 +926,7 @@ PluginPinWidget::edge_coordinates (const CtrlWidget& w, double &x, double &y)
}
void
PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed)
PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed) const
{
const double bz = 2 * _pin_box_size;
double bc = (dashed && x0 == x1) ? 1.25 * _pin_box_size : 0;
@@ -940,7 +953,7 @@ PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0,
}
void
PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed)
PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed) const
{
double x0, x1, y0, y1;
edge_coordinates (w0, x0, y0);
@@ -949,6 +962,36 @@ PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlW
draw_connection (cr, x0, x1, y0, y1, w0.e->dt == DataType::MIDI, w0.e->sc, dashed);
}
void
PluginPinWidget::draw_bus_groups (cairo_t* cr, const CtrlType t) const
{
uint32_t bcnt = 0;
CtrlWidget const* g_start = NULL;
CtrlWidget const* g_prev = NULL;
for (auto const& i : _elements) {
if (i.e->ct != t || i.e->dt != DataType::AUDIO) {
continue;
}
if (!g_start) {
g_start = &i;
} else if (i.e->bn > g_start->e->bn) {
if (bcnt > 0) {
assert (g_start && g_prev);
draw_plugin_bus (cr, *g_start, *g_prev);
}
g_start = &i;
bcnt = 0;
} else {
++bcnt;
}
g_prev = &i;
}
if (bcnt > 0 && g_start->e->bn > 0) {
assert (g_start && g_prev);
draw_plugin_bus (cr, *g_start, *g_prev);
}
}
bool
PluginPinWidget::darea_expose_event (GdkEventExpose* ev)
@@ -1102,6 +1145,9 @@ PluginPinWidget::darea_expose_event (GdkEventExpose* ev)
}
}
draw_bus_groups (cr, Sink);
draw_bus_groups (cr, Source);
/* pins and ports */
for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) {
switch (i->e->ct) {
@@ -1111,7 +1157,7 @@ PluginPinWidget::darea_expose_event (GdkEventExpose* ev)
break;
case Sink:
case Source:
draw_plugin_pin (cr, *i);
draw_plugin_pin (cr, *i); // XXX color by bus
break;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2016-2018 Robin Gareus <robin@gareus.org>
* Copyright (C) 2016-2023 Robin Gareus <robin@gareus.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -58,22 +58,23 @@ private:
} CtrlType;
struct _CtrlElem {
_CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, bool s)
: ct (c), dt (d), id (i), ip (p), sc (s) {}
_CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, uint32_t b, bool s)
: ct (c), dt (d), id (i), ip (p), bn (b), sc (s) {}
CtrlType ct;
ARDOUR::DataType dt;
uint32_t id; // port/pin ID
uint32_t ip; // plugin ID (for Sink, Source only);
uint32_t bn; // bus-number
bool sc; // sidechain
};
typedef boost::shared_ptr<_CtrlElem> CtrlElem;
struct CtrlWidget {
CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, bool sc = false)
CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, uint32_t bn = 0, bool sc = false)
: name (n), x(0), y(0), w (0), h (0), prelight (false)
{
e = CtrlElem (new _CtrlElem (ct, dt, id, ip, sc));
e = CtrlElem (new _CtrlElem (ct, dt, id, ip, bn, sc));
}
std::string name;
double x,y;
@@ -137,13 +138,15 @@ private:
void start_drag (const CtrlElem&, double, double);
void draw_io_pin (cairo_t*, const CtrlWidget&);
void draw_io_pin (cairo_t*, const CtrlWidget&) const;
void draw_plugin_pin (cairo_t*, const CtrlWidget&);
void draw_plugin_bus (cairo_t*, const CtrlWidget&, const CtrlWidget&) const;
void set_color (cairo_t*, bool);
void set_color (cairo_t*, bool) const;
double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool);
void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false);
void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false);
void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false) const;
void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false) const;
void draw_bus_groups (cairo_t*, const CtrlType) const;
const CtrlWidget& get_io_ctrl (CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0) const;
static void edge_coordinates (const CtrlWidget& w, double &x, double &y);