adjust GainMeter* API and design to handle stripables, not just routes for selection/group behavior

This commit is contained in:
Paul Davis 2023-07-31 21:12:00 -06:00
parent 3c44c326c2
commit 1d31ace29d
4 changed files with 54 additions and 44 deletions

View File

@ -227,7 +227,7 @@ GainMeterBase::~GainMeterBase ()
} }
void void
GainMeterBase::set_controls (std::shared_ptr<Route> r, GainMeterBase::set_controls (std::shared_ptr<Stripable> s,
std::shared_ptr<PeakMeter> pm, std::shared_ptr<PeakMeter> pm,
std::shared_ptr<Amp> amp, std::shared_ptr<Amp> amp,
std::shared_ptr<GainControl> control) std::shared_ptr<GainControl> control)
@ -242,14 +242,14 @@ GainMeterBase::set_controls (std::shared_ptr<Route> r,
gain_slider->set_controllable (std::shared_ptr<PBD::Controllable>()); gain_slider->set_controllable (std::shared_ptr<PBD::Controllable>());
_meter.reset (); _meter.reset ();
_amp.reset (); _amp.reset ();
_route.reset (); _stripable.reset ();
_control.reset (); _control.reset ();
return; return;
} }
_meter = pm; _meter = pm;
_amp = amp; _amp = amp;
_route = r; _stripable = s;
_control = control; _control = control;
level_meter->set_meter (pm.get()); level_meter->set_meter (pm.get());
@ -263,7 +263,7 @@ GainMeterBase::set_controls (std::shared_ptr<Route> r,
setup_gain_adjustment (); setup_gain_adjustment ();
if (!_route || !_route->is_auditioner()) { if (!route() || !route()->is_auditioner()) {
using namespace Menu_Helpers; using namespace Menu_Helpers;
@ -370,8 +370,8 @@ GainMeterBase::setup_meters (int len)
uint32_t meter_channels = 0; uint32_t meter_channels = 0;
if (_meter) { if (_meter) {
meter_channels = _meter->input_streams().n_total(); meter_channels = _meter->input_streams().n_total();
} else if (_route) { } else if (route()) {
meter_channels = _route->shared_peak_meter()->input_streams().n_total(); meter_channels = route()->shared_peak_meter()->input_streams().n_total();
} }
switch (_width) { switch (_width) {
@ -404,8 +404,8 @@ GainMeter::setup_meters (int len)
uint32_t meter_channels = 0; uint32_t meter_channels = 0;
if (_meter) { if (_meter) {
meter_channels = _meter->input_streams().n_total(); meter_channels = _meter->input_streams().n_total();
} else if (_route) { } else if (route()) {
meter_channels = _route->shared_peak_meter()->input_streams().n_total(); meter_channels = route()->shared_peak_meter()->input_streams().n_total();
} }
hbox.set_homogeneous(meter_channels < 7 ? true : false); hbox.set_homogeneous(meter_channels < 7 ? true : false);
} }
@ -442,11 +442,11 @@ GainMeterBase::peak_button_release (GdkEventButton* ev)
if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) { if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
ResetAllPeakDisplays (); ResetAllPeakDisplays ();
} else if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { } else if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
if (_route) { if (route()) {
ResetGroupPeakDisplays (_route->route_group()); ResetGroupPeakDisplays (route()->route_group());
} }
} else { } else {
ResetRoutePeakDisplays (_route.get()); ResetRoutePeakDisplays (route().get());
} }
return true; return true;
@ -455,7 +455,7 @@ GainMeterBase::peak_button_release (GdkEventButton* ev)
void void
GainMeterBase::reset_peak_display () GainMeterBase::reset_peak_display ()
{ {
if (!_route) { if (!route()) {
// catch "reset all" for VCAs // catch "reset all" for VCAs
return; return;
} }
@ -464,9 +464,9 @@ GainMeterBase::reset_peak_display ()
} }
void void
GainMeterBase::reset_route_peak_display (Route* route) GainMeterBase::reset_route_peak_display (Route* r)
{ {
if (_route && _route.get() == route) { if (route() && route().get() == r) {
reset_peak_display (); reset_peak_display ();
} }
} }
@ -474,7 +474,7 @@ GainMeterBase::reset_route_peak_display (Route* route)
void void
GainMeterBase::reset_group_peak_display (RouteGroup* group) GainMeterBase::reset_group_peak_display (RouteGroup* group)
{ {
if (_route && group == _route->route_group()) { if (route() && group == route()->route_group()) {
reset_peak_display (); reset_peak_display ();
} }
} }
@ -682,7 +682,7 @@ GainMeterBase::update_gain_sensitive ()
gint gint
GainMeterBase::meter_press(GdkEventButton* ev) GainMeterBase::meter_press(GdkEventButton* ev)
{ {
if (!_route) { if (!route()) {
return false; return false;
} }
if (!ignore_toggle) { if (!ignore_toggle) {
@ -708,7 +708,7 @@ GainMeterBase::meter_press(GdkEventButton* ev)
} }
Gtkmm2ext::anchored_menu_popup(&meter_point_menu, Gtkmm2ext::anchored_menu_popup(&meter_point_menu,
&meter_point_button, &meter_point_button,
meterpt_string (_route->meter_point()), meterpt_string (route()->meter_point()),
1, ev->time); 1, ev->time);
break; break;
default: default:
@ -739,16 +739,16 @@ GainMeterBase::set_route_group_meter_point (Route& route, MeterPoint mp)
void void
GainMeterBase::meter_point_clicked (MeterPoint mp) GainMeterBase::meter_point_clicked (MeterPoint mp)
{ {
if (_route) { if (route()) {
switch (meter_point_change_target) { switch (meter_point_change_target) {
case MeterPointChangeAll: case MeterPointChangeAll:
_session->foreach_route (this, &GainMeterBase::set_meter_point, mp); _session->foreach_route (this, &GainMeterBase::set_meter_point, mp);
break; break;
case MeterPointChangeGroup: case MeterPointChangeGroup:
set_route_group_meter_point (*_route, mp); set_route_group_meter_point (*route(), mp);
break; break;
case MeterPointChangeSingle: case MeterPointChangeSingle:
_route->set_meter_point (mp); route()->set_meter_point (mp);
break; break;
} }
} }
@ -757,10 +757,10 @@ GainMeterBase::meter_point_clicked (MeterPoint mp)
void void
GainMeterBase::amp_start_touch (int state) GainMeterBase::amp_start_touch (int state)
{ {
if (_route) { if (_stripable) {
StripableList sl; StripableList sl;
_session->selection ().get_stripables_for_op (sl, _route, &RouteGroup::is_gain); _session->selection ().get_stripables_for_op (sl, _stripable, &RouteGroup::is_gain);
_touch_control_group.reset (new GainControlGroup ()); _touch_control_group.reset (new GainControlGroup ());
_touch_control_group->set_mode (ControlGroup::Relative); _touch_control_group->set_mode (ControlGroup::Relative);
@ -922,7 +922,7 @@ GainMeterBase::set_width (Width w, int len)
{ {
_width = w; _width = w;
int meter_width = 5; int meter_width = 5;
if (_width == Wide && _route && _route->shared_peak_meter()->input_streams().n_total() == 1) { if (_width == Wide && route() && route()->shared_peak_meter()->input_streams().n_total() == 1) {
meter_width = 10; meter_width = 10;
} }
level_meter->setup_meters(len, meter_width); level_meter->setup_meters(len, meter_width);
@ -942,6 +942,12 @@ GainMeterBase::redraw_metrics()
meter_ticks2_area.queue_draw (); meter_ticks2_area.queue_draw ();
} }
std::shared_ptr<Route>
GainMeterBase::route ()
{
return std::dynamic_pointer_cast<Route> (_stripable);
}
#define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale())) #define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale()))
GainMeter::GainMeter (Session* s, int fader_length) GainMeter::GainMeter (Session* s, int fader_length)
@ -1009,7 +1015,7 @@ GainMeter::GainMeter (Session* s, int fader_length)
GainMeter::~GainMeter () { } GainMeter::~GainMeter () { }
void void
GainMeter::set_controls (std::shared_ptr<Route> r, GainMeter::set_controls (std::shared_ptr<Stripable> s,
std::shared_ptr<PeakMeter> meter, std::shared_ptr<PeakMeter> meter,
std::shared_ptr<Amp> amp, std::shared_ptr<Amp> amp,
std::shared_ptr<GainControl> control) std::shared_ptr<GainControl> control)
@ -1022,7 +1028,7 @@ GainMeter::set_controls (std::shared_ptr<Route> r,
// fader_vbox->remove (gain_automation_state_button); // fader_vbox->remove (gain_automation_state_button);
// } // }
GainMeterBase::set_controls (r, meter, amp, control); GainMeterBase::set_controls (s, meter, amp, control);
if (_meter) { if (_meter) {
_meter->ConfigurationChanged.connect ( _meter->ConfigurationChanged.connect (
@ -1036,8 +1042,8 @@ GainMeter::set_controls (std::shared_ptr<Route> r,
} }
if (_route) { if (route()) {
_route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ()); route()->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ());
} }
hbox.pack_start (meter_hbox, true, true); hbox.pack_start (meter_hbox, true, true);
@ -1078,31 +1084,31 @@ GainMeter::get_gm_width ()
gint gint
GainMeter::meter_metrics_expose (GdkEventExpose *ev) GainMeter::meter_metrics_expose (GdkEventExpose *ev)
{ {
if (!_route) { if (!route()) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); } if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area); return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area);
} }
return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); return meter_expose_metrics(ev, route()->meter_type(), _types, &meter_metric_area);
} }
gint gint
GainMeter::meter_ticks1_expose (GdkEventExpose *ev) GainMeter::meter_ticks1_expose (GdkEventExpose *ev)
{ {
if (!_route) { if (!route()) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); } if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area); return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area);
} }
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); return meter_expose_ticks(ev, route()->meter_type(), _types, &meter_ticks1_area);
} }
gint gint
GainMeter::meter_ticks2_expose (GdkEventExpose *ev) GainMeter::meter_ticks2_expose (GdkEventExpose *ev)
{ {
if (!_route) { if (!route()) {
if (_types.empty()) { _types.push_back(DataType::AUDIO); } if (_types.empty()) { _types.push_back(DataType::AUDIO); }
return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area); return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area);
} }
return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); return meter_expose_ticks(ev, route()->meter_type(), _types, &meter_ticks2_area);
} }
void void
@ -1141,26 +1147,26 @@ GainMeter::meter_configuration_changed (ChanCount c)
} }
} }
bool is_audio_track = _route && std::dynamic_pointer_cast<AudioTrack>(_route) != 0; bool is_audio_track = route() && std::dynamic_pointer_cast<AudioTrack>(route()) != 0;
bool is_midi_track = _route && std::dynamic_pointer_cast<MidiTrack>(_route) != 0; bool is_midi_track = route() && std::dynamic_pointer_cast<MidiTrack>(route()) != 0;
if (!is_audio_track && (is_midi_track || /* MIDI Bus */ (type == (1 << DataType::MIDI)))) { if (!is_audio_track && (is_midi_track || /* MIDI Bus */ (type == (1 << DataType::MIDI)))) {
if (!_route || _route->active()) { if (!route() || route()->active()) {
set_meter_strip_name ("MidiTrackMetrics"); set_meter_strip_name ("MidiTrackMetrics");
} else { } else {
set_meter_strip_name ("MidiTrackMetricsInactive"); set_meter_strip_name ("MidiTrackMetricsInactive");
} }
} }
else if (_route && (!is_audio_track && !is_midi_track)) { else if (route() && (!is_audio_track && !is_midi_track)) {
/* Bus */ /* Bus */
if (_route->active()) { if (route()->active()) {
set_meter_strip_name ("AudioBusMetrics"); set_meter_strip_name ("AudioBusMetrics");
} else { } else {
set_meter_strip_name ("AudioBusMetricsInactive"); set_meter_strip_name ("AudioBusMetricsInactive");
} }
} }
else { else {
if (!_route || _route->active()) { if (!route() || route()->active()) {
set_meter_strip_name ("AudioTrackMetrics"); set_meter_strip_name ("AudioTrackMetrics");
} else { } else {
set_meter_strip_name ("AudioTrackMetricsInactive"); set_meter_strip_name ("AudioTrackMetricsInactive");
@ -1185,3 +1191,4 @@ GainMeter::redraw_metrics ()
{ {
GainMeterBase::redraw_metrics (); GainMeterBase::redraw_metrics ();
} }

View File

@ -58,6 +58,7 @@ namespace ARDOUR {
class ControlGroup; class ControlGroup;
class GainControl; class GainControl;
class Session; class Session;
class Stripable;
class Route; class Route;
class RouteGroup; class RouteGroup;
class PeakMeter; class PeakMeter;
@ -81,7 +82,7 @@ public:
GainMeterBase (ARDOUR::Session*, bool horizontal, int, int); GainMeterBase (ARDOUR::Session*, bool horizontal, int, int);
virtual ~GainMeterBase (); virtual ~GainMeterBase ();
virtual void set_controls (std::shared_ptr<ARDOUR::Route> route, virtual void set_controls (std::shared_ptr<ARDOUR::Stripable> stripable,
std::shared_ptr<ARDOUR::PeakMeter> meter, std::shared_ptr<ARDOUR::PeakMeter> meter,
std::shared_ptr<ARDOUR::Amp> amp, std::shared_ptr<ARDOUR::Amp> amp,
std::shared_ptr<ARDOUR::GainControl> control); std::shared_ptr<ARDOUR::GainControl> control);
@ -123,7 +124,7 @@ protected:
friend class MeterStrip; friend class MeterStrip;
friend class RouteTimeAxisView; friend class RouteTimeAxisView;
friend class VCAMasterStrip; friend class VCAMasterStrip;
std::shared_ptr<ARDOUR::Route> _route; std::shared_ptr<ARDOUR::Stripable> _stripable;
std::shared_ptr<ARDOUR::PeakMeter> _meter; std::shared_ptr<ARDOUR::PeakMeter> _meter;
std::shared_ptr<ARDOUR::Amp> _amp; std::shared_ptr<ARDOUR::Amp> _amp;
std::shared_ptr<ARDOUR::GainControl> _control; std::shared_ptr<ARDOUR::GainControl> _control;
@ -211,6 +212,8 @@ protected:
ARDOUR::DataType _data_type; ARDOUR::DataType _data_type;
ARDOUR::ChanCount _previous_amp_output_streams; ARDOUR::ChanCount _previous_amp_output_streams;
std::shared_ptr<ARDOUR::Route> route();
private: private:
bool level_meter_button_press (GdkEventButton *); bool level_meter_button_press (GdkEventButton *);
@ -226,7 +229,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
GainMeter (ARDOUR::Session*, int); GainMeter (ARDOUR::Session*, int);
virtual ~GainMeter (); virtual ~GainMeter ();
virtual void set_controls (std::shared_ptr<ARDOUR::Route> route, virtual void set_controls (std::shared_ptr<ARDOUR::Stripable> stripable,
std::shared_ptr<ARDOUR::PeakMeter> meter, std::shared_ptr<ARDOUR::PeakMeter> meter,
std::shared_ptr<ARDOUR::Amp> amp, std::shared_ptr<ARDOUR::Amp> amp,
std::shared_ptr<ARDOUR::GainControl> control); std::shared_ptr<ARDOUR::GainControl> control);

View File

@ -40,7 +40,7 @@ ReturnUI::ReturnUI (Gtk::Window* parent, std::shared_ptr<Return> r, Session* ses
:_return (r) :_return (r)
, _gpm (session, 250) , _gpm (session, 250)
{ {
_gpm.set_controls (std::shared_ptr<Route>(), r->meter(), r->amp(), r->gain_control()); _gpm.set_controls (std::shared_ptr<Stripable>(), r->meter(), r->amp(), r->gain_control());
_hbox.pack_start (_gpm, true, true); _hbox.pack_start (_gpm, true, true);
set_name (X_("ReturnUIFrame")); set_name (X_("ReturnUIFrame"));

View File

@ -170,7 +170,7 @@ VCATimeAxisView::set_vca (std::shared_ptr<VCA> v)
StripableTimeAxisView::set_stripable (v); StripableTimeAxisView::set_stripable (v);
_vca = v; _vca = v;
gain_meter.set_controls (std::shared_ptr<Route>(), gain_meter.set_controls (v,
std::shared_ptr<PeakMeter>(), std::shared_ptr<PeakMeter>(),
std::shared_ptr<Amp>(), std::shared_ptr<Amp>(),
_vca->gain_control()); _vca->gain_control());