1 /* 2 * Copyright (C) 2005-2016 Paul Davis <paul@linuxaudiosystems.com> 3 * Copyright (C) 2005 Taybin Rutkin <taybin@taybin.com> 4 * Copyright (C) 2006 Nick Mainsbridge <mainsbridge@gmail.com> 5 * Copyright (C) 2007-2011 David Robillard <d@drobilla.net> 6 * Copyright (C) 2007 Doug McLain <doug@nostar.net> 7 * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net> 8 * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org> 9 * Copyright (C) 2014 Ben Loftis <ben@harrisonconsoles.com> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License along 22 * with this program; if not, write to the Free Software Foundation, Inc., 23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 24 */ 25 26 #ifndef __ardour_gtk_gain_meter_h__ 27 #define __ardour_gtk_gain_meter_h__ 28 29 #include <vector> 30 #include <map> 31 32 #include <gtkmm/adjustment.h> 33 #include <gtkmm/alignment.h> 34 #include <gtkmm/box.h> 35 #include <gtkmm/button.h> 36 #include <gtkmm/drawingarea.h> 37 #include <gtkmm/eventbox.h> 38 #include <gtkmm/frame.h> 39 #include <gtkmm/table.h> 40 41 //#include <gdkmm/colormap.h> 42 43 #include "pbd/signals.h" 44 45 #include "ardour/chan_count.h" 46 #include "ardour/types.h" 47 #include "ardour/session_handle.h" 48 49 #include "widgets/ardour_button.h" 50 #include "widgets/focus_entry.h" 51 #include "widgets/slider_controller.h" 52 53 #include "enums.h" 54 #include "level_meter.h" 55 56 namespace ARDOUR { 57 class IO; 58 class GainControl; 59 class Session; 60 class Route; 61 class RouteGroup; 62 class PeakMeter; 63 class Amp; 64 class Automatable; 65 } 66 67 namespace Gtk { 68 class Menu; 69 } 70 71 enum MeterPointChangeTarget { 72 MeterPointChangeAll, 73 MeterPointChangeGroup, 74 MeterPointChangeSingle 75 }; 76 77 class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr 78 { 79 public: 80 GainMeterBase (ARDOUR::Session*, bool horizontal, int, int); 81 virtual ~GainMeterBase (); 82 83 virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route, 84 boost::shared_ptr<ARDOUR::PeakMeter> meter, 85 boost::shared_ptr<ARDOUR::Amp> amp, 86 boost::shared_ptr<ARDOUR::GainControl> control); 87 88 void update_gain_sensitive (); 89 void update_meters (); 90 91 const ARDOUR::ChanCount meter_channels () const; 92 93 void effective_gain_display (); 94 void set_width (Width, int len=0); 95 void set_meter_strip_name (const char * name); 96 void set_fader_name (const char * name); 97 98 virtual void setup_meters (int len=0); 99 100 boost::shared_ptr<PBD::Controllable> get_controllable(); 101 get_level_meter()102 LevelMeterHBox& get_level_meter() const { return *level_meter; } get_gain_slider()103 ArdourWidgets::SliderController& get_gain_slider() const { return *gain_slider; } 104 105 /** Emitted in the GUI thread when a button is pressed over the level meter; 106 * return true if the event is handled. 107 */ 108 PBD::Signal1<bool, GdkEventButton *> LevelMeterButtonPress; 109 110 static std::string meterpt_string (ARDOUR::MeterPoint); 111 static std::string astate_string (ARDOUR::AutoState); 112 static std::string short_astate_string (ARDOUR::AutoState); 113 static std::string _astate_string (ARDOUR::AutoState, bool); 114 115 protected: 116 117 friend class MixerStrip; 118 friend class MeterStrip; 119 friend class RouteTimeAxisView; 120 friend class VCAMasterStrip; 121 boost::shared_ptr<ARDOUR::Route> _route; 122 boost::shared_ptr<ARDOUR::PeakMeter> _meter; 123 boost::shared_ptr<ARDOUR::Amp> _amp; 124 boost::shared_ptr<ARDOUR::GainControl> _control; 125 std::vector<sigc::connection> connections; 126 PBD::ScopedConnectionList model_connections; 127 128 bool ignore_toggle; 129 bool next_release_selects; 130 131 ArdourWidgets::SliderController* gain_slider; 132 Gtk::Adjustment gain_adjustment; 133 ArdourWidgets::FocusEntry gain_display; 134 ArdourWidgets::FocusEntry peak_display; 135 Gtk::DrawingArea meter_metric_area; 136 Gtk::DrawingArea meter_ticks1_area; 137 Gtk::DrawingArea meter_ticks2_area; 138 LevelMeterHBox* level_meter; 139 140 sigc::connection gain_watching; 141 142 ArdourWidgets::ArdourButton gain_automation_state_button; 143 144 Gtk::Menu gain_astate_menu; 145 146 ArdourWidgets::ArdourButton meter_point_button; 147 148 Gtk::Menu meter_point_menu; 149 150 void set_gain_astate (ARDOUR::AutoState); 151 bool gain_astate_propagate; 152 static sigc::signal<void, ARDOUR::AutoState> ChangeGainAutomationState; 153 154 gint gain_automation_state_button_event (GdkEventButton *); 155 gint pan_automation_state_button_event (GdkEventButton *); 156 157 void gain_automation_state_changed(); 158 159 void setup_gain_adjustment (); 160 Width _width; 161 162 void show_gain (); 163 void gain_activated (); 164 bool gain_focused (GdkEventFocus*); 165 166 float max_peak; 167 168 void fader_moved (); 169 void gain_changed (); 170 171 void meter_point_clicked (ARDOUR::MeterPoint); 172 void gain_unit_changed (); 173 174 virtual void hide_all_meters (); 175 176 gint meter_button_press (GdkEventButton*, uint32_t); 177 178 bool peak_button_press (GdkEventButton*); 179 bool peak_button_release (GdkEventButton*); 180 bool gain_key_press (GdkEventKey*); 181 182 Gtk::Menu* meter_menu; 183 void popup_meter_menu (GdkEventButton*); 184 185 void amp_stop_touch (); 186 void amp_start_touch (); 187 188 void set_route_group_meter_point (ARDOUR::Route&, ARDOUR::MeterPoint); 189 void set_meter_point (ARDOUR::Route&, ARDOUR::MeterPoint); 190 gint meter_press (GdkEventButton*); 191 ARDOUR::MeterPoint old_meter_point; 192 193 MeterPointChangeTarget meter_point_change_target; 194 195 void parameter_changed (const char*); 196 197 void reset_peak_display (); 198 void reset_route_peak_display (ARDOUR::Route*); 199 void reset_group_peak_display (ARDOUR::RouteGroup*); 200 201 void redraw_metrics (); 202 void on_theme_changed (); 203 void color_handler(bool); 204 ARDOUR::DataType _data_type; 205 ARDOUR::ChanCount _previous_amp_output_streams; 206 207 private: 208 209 bool level_meter_button_press (GdkEventButton *); 210 PBD::ScopedConnection _level_meter_connection; 211 212 bool _clear_meters; 213 bool _meter_peaked; 214 }; 215 216 class GainMeter : public GainMeterBase, public Gtk::VBox 217 { 218 public: 219 GainMeter (ARDOUR::Session*, int); 220 virtual ~GainMeter (); 221 222 virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route, 223 boost::shared_ptr<ARDOUR::PeakMeter> meter, 224 boost::shared_ptr<ARDOUR::Amp> amp, 225 boost::shared_ptr<ARDOUR::GainControl> control); 226 227 int get_gm_width (); 228 void setup_meters (int len=0); 229 void route_active_changed (); 230 231 protected: 232 void hide_all_meters (); 233 234 gint meter_metrics_expose (GdkEventExpose *); 235 gint meter_ticks1_expose (GdkEventExpose *); 236 gint meter_ticks2_expose (GdkEventExpose *); 237 void on_style_changed (const Glib::RefPtr<Gtk::Style>&); 238 void redraw_metrics (); 239 240 private: 241 242 void meter_configuration_changed (ARDOUR::ChanCount); 243 244 Gtk::HBox gain_display_box; 245 Gtk::HBox fader_box; 246 Gtk::VBox fader_vbox; 247 Gtk::HBox hbox; 248 Gtk::HBox meter_hbox; 249 Gtk::Alignment fader_alignment; 250 Gtk::Alignment meter_alignment; 251 std::vector<ARDOUR::DataType> _types; 252 }; 253 254 #endif /* __ardour_gtk_gain_meter_h__ */ 255 256