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

View File

@ -58,6 +58,7 @@ namespace ARDOUR {
class ControlGroup;
class GainControl;
class Session;
class Stripable;
class Route;
class RouteGroup;
class PeakMeter;
@ -81,7 +82,7 @@ public:
GainMeterBase (ARDOUR::Session*, bool horizontal, int, int);
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::Amp> amp,
std::shared_ptr<ARDOUR::GainControl> control);
@ -123,7 +124,7 @@ protected:
friend class MeterStrip;
friend class RouteTimeAxisView;
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::Amp> _amp;
std::shared_ptr<ARDOUR::GainControl> _control;
@ -211,6 +212,8 @@ protected:
ARDOUR::DataType _data_type;
ARDOUR::ChanCount _previous_amp_output_streams;
std::shared_ptr<ARDOUR::Route> route();
private:
bool level_meter_button_press (GdkEventButton *);
@ -226,7 +229,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
GainMeter (ARDOUR::Session*, int);
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::Amp> amp,
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)
, _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);
set_name (X_("ReturnUIFrame"));

View File

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