X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fgain_meter.cc;h=7b7ad33f9ae5beda0146e2c1ebfac152b49a050b;hb=d3e2de8b4e006ac652b004cb44b66afa9f6584f6;hp=b56504b2f10d0a611dc6d68cde0f88966617a1dd;hpb=bce09c06b9dbeb42fe6f6f359b39d91403a783d3;p=ardour.git diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index b56504b2f1..7b7ad33f9a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -30,9 +30,7 @@ #include #include #include -#include #include -#include "midi++/manager.h" #include "pbd/fastlog.h" #include "pbd/stacktrace.h" @@ -55,11 +53,33 @@ #include "i18n.h" using namespace ARDOUR; +using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; using namespace std; using Gtkmm2ext::Keyboard; +using namespace ArdourMeter; + + +static void +reset_cursor_to_default (Gtk::Entry* widget) +{ + Glib::RefPtr win = widget->get_text_window (); + if (win) { + /* C++ doesn't provide a pointer argument version of this + (i.e. you cannot set to NULL to get the default/parent + cursor) + */ + gdk_window_set_cursor (win->gobj(), 0); + } +} + +static void +reset_cursor_to_default_state (Gtk::StateType, Gtk::Entry* widget) +{ + reset_cursor_to_default (widget); +} GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth) : gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0.0, 1.0, 0.01, 0.1) @@ -78,19 +98,20 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int _width = Wide; if (horizontal) { - gain_slider = manage (new HSliderController (&gain_adjustment, fader_length, fader_girth, false)); + gain_slider = manage (new HSliderController (&gain_adjustment, boost::shared_ptr(), fader_length, fader_girth)); } else { - gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false)); + gain_slider = manage (new VSliderController (&gain_adjustment, boost::shared_ptr(), fader_length, fader_girth)); } - level_meter = new LevelMeter(_session); + level_meter = new LevelMeterHBox(_session); level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1)); meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press)); meter_metric_area.add_events (Gdk::BUTTON_PRESS_MASK); - gain_slider->signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_press), false); - gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release), false); + gain_slider->set_tweaks (PixFader::Tweaks(PixFader::NoButtonForward | PixFader::NoVerticalScroll)); + gain_slider->StartGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_start_touch)); + gain_slider->StopGesture.connect (sigc::mem_fun (*this, &GainMeter::amp_stop_touch)); gain_slider->set_name ("GainFader"); gain_display.set_name ("MixerStripGainDisplay"); @@ -98,12 +119,22 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int gain_display.signal_activate().connect (sigc::mem_fun (*this, &GainMeter::gain_activated)); gain_display.signal_focus_in_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false); gain_display.signal_focus_out_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false); + gain_display.set_alignment(0.5); peak_display.set_name ("MixerStripPeakDisplay"); set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */ max_peak = minus_infinity(); - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); + peak_display.set_alignment(0.5); + + /* stuff related to the fact that the peak display is not, in + fact, supposed to be a text entry. + */ + peak_display.set_events (peak_display.get_events() & ~(Gdk::EventMask (Gdk::LEAVE_NOTIFY_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::POINTER_MOTION_MASK))); + peak_display.signal_map().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default), &peak_display)); + peak_display.signal_state_changed().connect (sigc::bind (sigc::ptr_fun (reset_cursor_to_default_state), &peak_display)); peak_display.unset_flags (Gtk::CAN_FOCUS); + peak_display.set_editable (false); gain_automation_style_button.set_name ("mixer strip button"); gain_automation_state_button.set_name ("mixer strip button"); @@ -135,16 +166,6 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &GainMeterBase::on_theme_changed)); ColorsChanged.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), false)); DPIReset.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), true)); - -// PBD::ScopedConnection _config_connection; -// Config->ParameterChanged.connect ( _config_connection, MISSING_INVALIDATOR, boost::bind(&GainMeterBase::set_flat_buttons, this, _1), gui_context() ); -} - -void -GainMeterBase::set_flat_buttons () -{ -printf("set_flat_butt\n"); -// gain_slider->set_flat_buttons( ARDOUR_UI::config()->get_flat_buttons() ); } GainMeterBase::~GainMeterBase () @@ -274,19 +295,29 @@ void GainMeterBase::setup_meters (int len) { int meter_width = 5; + 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(); + } switch (_width) { case Wide: - meter_ticks1_area.show(); - meter_ticks2_area.show(); - if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { + //meter_ticks1_area.show(); + //meter_ticks2_area.show(); + meter_metric_area.show(); + if (meter_channels == 1) { meter_width = 10; } break; case Narrow: - meter_width = 2; - meter_ticks1_area.hide(); - meter_ticks2_area.hide(); + if (meter_channels > 1) { + meter_width = 4; + } + //meter_ticks1_area.hide(); + //meter_ticks2_area.hide(); + meter_metric_area.hide(); break; } level_meter->setup_meters(len, meter_width); @@ -303,7 +334,15 @@ GainMeter::setup_meters (int len) { switch (_width) { case Wide: - hbox.set_homogeneous(true); + { + 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(); + } + hbox.set_homogeneous(meter_channels < 7 ? true : false); + } break; case Narrow: hbox.set_homogeneous(false); @@ -353,7 +392,7 @@ GainMeterBase::reset_peak_display () _meter->reset_max(); level_meter->clear_meters(); max_peak = -INFINITY; - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); peak_display.set_name ("MixerStripPeakDisplay"); } @@ -525,9 +564,12 @@ GainMeterBase::gain_changed () void GainMeterBase::set_meter_strip_name (const char * name) { + char tmp[256]; meter_metric_area.set_name (name); - meter_ticks1_area.set_name (name); - meter_ticks2_area.set_name (name); + sprintf(tmp, "Mark%sLeft", name); + meter_ticks1_area.set_name (tmp); + sprintf(tmp, "Mark%sRight", name); + meter_ticks2_area.set_name (tmp); } void @@ -568,7 +610,7 @@ next_meter_point (MeterPoint mp) break; } - /*NOTREACHED*/ + abort(); /*NOTREACHED*/ return MeterInput; } @@ -677,25 +719,16 @@ GainMeterBase::meter_point_clicked () } } -bool -GainMeterBase::gain_slider_button_press (GdkEventButton* ev) +void +GainMeterBase::amp_start_touch () { - switch (ev->type) { - case GDK_BUTTON_PRESS: - _amp->gain_control()->start_touch (_amp->session().transport_frame()); - break; - default: - return false; - } - - return false; + _amp->gain_control()->start_touch (_amp->session().transport_frame()); } -bool -GainMeterBase::gain_slider_button_release (GdkEventButton*) +void +GainMeterBase::amp_stop_touch () { _amp->gain_control()->stop_touch (false, _amp->session().transport_frame()); - return false; } gint @@ -840,6 +873,12 @@ GainMeterBase::gain_automation_state_changed () } } +const ChanCount +GainMeterBase::meter_channels() const +{ + if (_meter) { return _meter->input_streams(); } + else { return ChanCount(); } +} void GainMeterBase::update_meters() { @@ -849,10 +888,10 @@ GainMeterBase::update_meters() if (mpeak > max_peak) { max_peak = mpeak; if (mpeak <= -200.0f) { - peak_display.set_label (_("-inf")); + peak_display.set_text (_("-inf")); } else { snprintf (buf, sizeof(buf), "%.1f", mpeak); - peak_display.set_label (buf); + peak_display.set_text (buf); } } if (mpeak >= Config->get_meter_peak()) { @@ -860,7 +899,7 @@ GainMeterBase::update_meters() } } -void GainMeterBase::color_handler(bool dpi) +void GainMeterBase::color_handler(bool /*dpi*/) { setup_meters(); } @@ -900,6 +939,11 @@ GainMeter::GainMeter (Session* s, int fader_length) } gain_display_box.pack_start (gain_display, true, true); + if (peak_display.get_parent()) { + peak_display.get_parent()->remove (gain_display); + } + gain_display_box.pack_start (peak_display, true, true); + meter_metric_area.set_name ("AudioTrackMetrics"); meter_metric_area.set_size_request(24, -1); @@ -949,6 +993,8 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_hbox.pack_start (meter_metric_area, false, false); } +GainMeter::~GainMeter () { } + void GainMeter::set_controls (boost::shared_ptr r, boost::shared_ptr meter, @@ -976,6 +1022,10 @@ GainMeter::set_controls (boost::shared_ptr r, } + if (_route) { + _route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ()); + } + /* if we have a non-hidden route (ie. we're not the click or the auditioner), pack some route-dependent stuff. @@ -996,6 +1046,7 @@ GainMeter::get_gm_width () { Gtk::Requisition sz; int min_w = 0; + sz.width = 0; meter_metric_area.size_request (sz); min_w += sz.width; level_meter->size_request (sz); @@ -1012,19 +1063,38 @@ GainMeter::get_gm_width () gint GainMeter::meter_metrics_expose (GdkEventExpose *ev) { - return meter_expose_metrics(ev, _types, &meter_metric_area); + 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); } gint GainMeter::meter_ticks1_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks1_area); + 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); } gint GainMeter::meter_ticks2_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks2_area); + 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); +} + +void +GainMeter::on_style_changed (const Glib::RefPtr&) +{ + gain_display.queue_draw(); + peak_display.queue_draw(); } boost::shared_ptr @@ -1040,7 +1110,7 @@ GainMeterBase::get_controllable() bool GainMeterBase::level_meter_button_press (GdkEventButton* ev) { - return LevelMeterButtonPress (ev); /* EMIT SIGNAL */ + return !!LevelMeterButtonPress (ev); /* EMIT SIGNAL */ } void @@ -1066,18 +1136,21 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioBusMetricsInactive"); } } - else if (type == (1 << DataType::AUDIO)) { + else if ( + (type == (1 << DataType::MIDI)) + || (_route && boost::dynamic_pointer_cast(_route)) + ) { if (!_route || _route->active()) { - set_meter_strip_name ("AudioTrackMetrics"); + set_meter_strip_name ("MidiTrackMetrics"); } else { - set_meter_strip_name ("AudioTrackMetricsInactive"); + set_meter_strip_name ("MidiTrackMetricsInactive"); } } - else if (type == (1 << DataType::MIDI)) { + else if (type == (1 << DataType::AUDIO)) { if (!_route || _route->active()) { - set_meter_strip_name ("MidiTrackMetrics"); + set_meter_strip_name ("AudioTrackMetrics"); } else { - set_meter_strip_name ("MidiTrackMetricsInactive"); + set_meter_strip_name ("AudioTrackMetricsInactive"); } } else { if (!_route || _route->active()) { @@ -1086,11 +1159,23 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioMidiTrackMetricsInactive"); } } + + setup_meters(); meter_clear_pattern_cache(4); + on_style_changed(Glib::RefPtr()); +} + +void +GainMeter::route_active_changed () +{ + if (_meter) { + meter_configuration_changed (_meter->input_streams ()); + } } void GainMeter::meter_type_changed (MeterType t) { _route->set_meter_type(t); + RedrawMetrics(); }