From 40493e06eed6bcf8fdda4105f0adb4a9cd01eccf Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 5 Jul 2013 06:23:43 +0200 Subject: dynamically change metebridge metrics (midi|audio) --- gtk2_ardour/ardour3_widget_list.rc | 3 ++ gtk2_ardour/meter_strip.cc | 89 ++++++++++++++++++++++++-------------- gtk2_ardour/meter_strip.h | 6 +++ gtk2_ardour/meterbridge.cc | 20 +++++++++ gtk2_ardour/meterbridge.h | 1 + 5 files changed, 86 insertions(+), 33 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 4cb22b27e3..a0ce07067b 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -169,6 +169,9 @@ widget "*FaderMetricsStrip" style:highest "audio_track_metrics" widget "*AudioTrackMetrics" style:highest "audio_track_metrics" widget "*MidiTrackMetrics" style:highest "midi_track_metrics" widget "*AudioBusMetrics" style:highest "audio_bus_metrics" +widget "*AudioTrackMetricsLeft" style:highest "audio_track_metrics" +widget "*MidiTrackMetricsLeft" style:highest "midi_track_metrics" +widget "*AudioBusMetricsLeft" style:highest "audio_bus_metrics" widget "*AudioTrackMetricsInactive" style:highest "audio_track_metrics_inactive" widget "*MidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive" widget "*AudioBusMetricsInactive" style:highest "audio_bus_metrics_inactive" diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index a6badc9f74..ca2d0cd815 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -55,6 +55,7 @@ using namespace std; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::ResetAllPeakDisplays; PBD::Signal1 MeterStrip::ResetGroupPeakDisplays; +PBD::Signal0 MeterStrip::MetricChanged; MeterStrip::MetricPatterns MeterStrip::metric_patterns; @@ -71,27 +72,7 @@ MeterStrip::MeterStrip (int metricmode) btnbox.set_size_request(-1, 16); namebx.set_size_request(18, 52); - _types.clear (); - switch(metricmode) { - case 1: - meter_metric_area.set_name ("AudioBusMetrics"); - _types.push_back (DataType::AUDIO); - break; - case 2: - meter_metric_area.set_name ("AudioTrackMetrics"); - _types.push_back (DataType::AUDIO); - break; - case 3: - meter_metric_area.set_name ("MidiTrackMetrics"); - _types.push_back (DataType::MIDI); - break; - default: - meter_metric_area.set_name ("AudioMidiTrackMetrics"); - _types.push_back (DataType::AUDIO); - _types.push_back (DataType::MIDI); - break; - } - //meter_metric_area.queue_draw (); + set_metric_mode(metricmode); set_size_request_to_display_given_text (meter_metric_area, "-8888", 1, 0); meter_metric_area.signal_expose_event().connect ( @@ -124,6 +105,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) set_spacing(2); RouteUI::set_route (rt); + _has_midi = false; + int meter_width = 6; if (_route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 12; @@ -287,6 +270,7 @@ MeterStrip::meter_configuration_changed (ChanCount c) { int type = 0; _types.clear (); + bool old_has_midi = _has_midi; for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { if (c.get (*i) > 0) { @@ -301,19 +285,24 @@ MeterStrip::meter_configuration_changed (ChanCount c) ) { meter_ticks1_area.set_name ("AudioBusMetrics"); meter_ticks2_area.set_name ("AudioBusMetrics"); + _has_midi = false; } else if (type == (1 << DataType::AUDIO)) { meter_ticks1_area.set_name ("AudioTrackMetrics"); meter_ticks2_area.set_name ("AudioTrackMetrics"); + _has_midi = false; } else if (type == (1 << DataType::MIDI)) { meter_ticks1_area.set_name ("MidiTrackMetrics"); meter_ticks2_area.set_name ("MidiTrackMetrics"); + _has_midi = true; } else { meter_ticks1_area.set_name ("AudioMidiTrackMetrics"); meter_ticks2_area.set_name ("AudioMidiTrackMetrics"); + _has_midi = true; } + if (old_has_midi != _has_midi) MetricChanged(); on_theme_changed(); } @@ -342,22 +331,17 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) VBox::on_size_allocate(a); } -/* XXX code-copy from gain_meter.cc -- TODO consolidate - * - * slightly different: - * - ticks & label positions are swapped - * - more ticks for audio (longer meter by default) - * - right-aligned lables, unit-legend - * - height limitation of FastMeter::max_pattern_metric_size is included here - */ cairo_pattern_t* MeterStrip::render_metrics (Gtk::Widget& w, vector types) { Glib::RefPtr win (w.get_window()); + bool tickleft = true; gint width, height; win->get_size (width, height); + tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left"; + cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); Glib::RefPtr layout = Pango::Layout::create(w.get_pango_context()); @@ -491,8 +475,13 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector types) fraction = log_meter (j->first); snprintf (buf, sizeof (buf), "%+2d", j->first); pos = height - (gint) floor (height * fraction); - cairo_move_to(cr, width-2.5, pos + .5); - cairo_line_to(cr, width, pos + .5); + if (tickleft) { + cairo_move_to(cr, width-2.5, pos + .5); + cairo_line_to(cr, width, pos + .5); + } else { + cairo_move_to(cr, 0, pos + .5); + cairo_line_to(cr, 2.5, pos + .5); + } cairo_stroke (cr); break; case DataType::MIDI: @@ -501,7 +490,11 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%3d", j->first); pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); - cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + if (tickleft) { + cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); + } else { + cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + } cairo_fill(cr); break; } @@ -556,7 +549,6 @@ MeterStrip::render_metrics (Gtk::Widget& w, vector types) return pattern; } -/* XXX code-copy from gain_meter.cc -- TODO consolidate */ gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { @@ -593,6 +585,37 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev) return true; } +void +MeterStrip::set_metric_mode (int metricmode) +{ + _types.clear (); + switch(metricmode) { + case 1: + meter_metric_area.set_name ("AudioBusMetrics"); + _types.push_back (DataType::AUDIO); + break; + case 2: + meter_metric_area.set_name ("AudioTrackMetricsLeft"); + _types.push_back (DataType::AUDIO); + break; + case 3: + meter_metric_area.set_name ("MidiTrackMetrics"); + _types.push_back (DataType::MIDI); + break; + case 4: + meter_metric_area.set_name ("AudioTrackMetrics"); + _types.push_back (DataType::AUDIO); + break; + default: + meter_metric_area.set_name ("AudioMidiTrackMetrics"); + _types.push_back (DataType::AUDIO); + _types.push_back (DataType::MIDI); + break; + } + + meter_metric_area.queue_draw (); +} + cairo_pattern_t* MeterStrip::render_ticks (Gtk::Widget& w, vector types) { diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index cfd95a4c3b..50d41cadf2 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -56,10 +56,14 @@ class MeterStrip : public Gtk::VBox, public RouteUI static PBD::Signal1 CatchDeletion; static PBD::Signal0 ResetAllPeakDisplays; static PBD::Signal1 ResetGroupPeakDisplays; + static PBD::Signal0 MetricChanged; void reset_peak_display (); void reset_group_peak_display (ARDOUR::RouteGroup*); + void set_metric_mode (int); + bool has_midi() { return _has_midi; } + protected: boost::shared_ptr _route; PBD::ScopedConnectionList route_connections; @@ -106,6 +110,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI std::vector _types; float max_peak; + bool _has_midi; + LevelMeter *level_meter; void meter_changed (); diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 00ba3d43ec..57a7a77bf1 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -147,6 +147,7 @@ Meterbridge::Meterbridge () MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); MeterStrip::ResetAllPeakDisplays.connect_same_thread (*this, boost::bind(&Meterbridge::reset_all_peaks, this)); MeterStrip::ResetGroupPeakDisplays.connect_same_thread (*this, boost::bind (&Meterbridge::reset_group_peaks, this, _1)); + MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this)); global_hpacker.set_spacing(0); scroller.add (global_hpacker); @@ -426,6 +427,7 @@ Meterbridge::add_strips (RouteList& routes) } sync_order_keys(MixerSort); + update_metrics(); } void @@ -439,6 +441,24 @@ Meterbridge::remove_strip (MeterStrip* strip) if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) { strips.erase (i); } + update_metrics(); +} + +void +Meterbridge::update_metrics () +{ + bool have_midi = false; + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { + if ( (*i)->has_midi ()) { + have_midi = true; + break; + } + } + if (have_midi) { + metrics_right->set_metric_mode(3); + } else { + metrics_right->set_metric_mode(4); + } } void diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 8402676e0e..b8e6fc0c79 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -73,6 +73,7 @@ class Meterbridge : void add_strips (ARDOUR::RouteList&); void remove_strip (MeterStrip *); + void update_metrics (); void reset_all_peaks (); void reset_group_peaks (ARDOUR::RouteGroup*); -- cgit v1.2.3