diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-23 13:30:23 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-23 13:30:23 +0200 |
commit | 8013160eb369ae8a97392284602e41cc77617b79 (patch) | |
tree | 203b5501ccd99ecb76cfdcd23d7c5adc9209cb95 /gtk2_ardour/meterbridge.cc | |
parent | 06e7ad67ae9fb84828011d7522d7c1b4cbeb7c37 (diff) |
meterbridge metrics update:
* display metrics for every used meter-type
* show metrics between meters with differnet types
* update text and label alignment for meterbridge
* fix crash when deleting metrics-strip (zero route)
* clean up metric pattern code (use float for dBFS)
Diffstat (limited to 'gtk2_ardour/meterbridge.cc')
-rw-r--r-- | gtk2_ardour/meterbridge.cc | 86 |
1 files changed, 59 insertions, 27 deletions
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index cdecb36c7c..2b51e9a85f 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -101,8 +101,8 @@ Meterbridge::Meterbridge () , VisibilityTracker (*((Gtk::Window*) this)) , _visible (false) , _show_busses (false) - , metrics_left (1) - , metrics_right (2) + , metrics_left (1, MeterPeak) + , metrics_right (2, MeterPeak) , cur_max_width (-1) { set_name ("Meter Bridge"); @@ -140,7 +140,7 @@ Meterbridge::Meterbridge () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); - MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this)); + MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -192,6 +192,10 @@ Meterbridge::Meterbridge () Meterbridge::~Meterbridge () { + while (_metrics.size() > 0) { + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -550,7 +554,6 @@ Meterbridge::add_strips (RouteList& routes) } resync_order(); - update_metrics(); } void @@ -567,24 +570,6 @@ Meterbridge::remove_strip (MeterStrip* strip) break; } } - update_metrics(); -} - -void -Meterbridge::update_metrics () -{ - bool have_midi = false; - for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) { - if ( (*i).s->has_midi() && (*i).visible) { - have_midi = true; - break; - } - } - if (have_midi) { - metrics_right.set_metric_mode(2); - } else { - metrics_right.set_metric_mode(3); - } } void @@ -598,6 +583,11 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) int pos = 0; int vis = 0; + unsigned int metrics = 0; + MeterType lmt = MeterPeak; + bool have_midi = false; + metrics_left.set_metric_mode(1, lmt); + for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) { if (! (*i).s->route()->active()) { @@ -642,9 +632,55 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) (*i).visible = true; vis++; } - (*i).s->set_pos(vis); + + MeterType nmt = (*i).s->meter_type(); + if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics + + if ((*i).visible && nmt != lmt && pos == 0) { + lmt = nmt; + metrics_left.set_metric_mode(1, lmt); + } else if ((*i).visible && nmt != lmt) { + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + + lmt = nmt; + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(1, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(1, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + have_midi = false; + } + + if ((*i).visible && (*i).s->has_midi()) { + have_midi = true; + } + meterarea.reorder_child(*((*i).s), pos++); } + + metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); + + while (_metrics.size() > metrics) { + meterarea.remove(*_metrics.back()); + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -659,21 +695,17 @@ Meterbridge::parameter_changed (std::string const & p) if (p == "show-busses-on-meterbridge") { _show_busses = _session->config.get_show_busses_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-master-on-meterbridge") { _show_master = _session->config.get_show_master_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-midi-on-meterbridge") { _show_midi = _session->config.get_show_midi_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "meter-line-up-level") { meter_clear_pattern_cache(); - update_metrics(); } else if (p == "show-rec-on-meterbridge") { scroller.queue_resize(); |