Optimize automation-event process splitting
[ardour.git] / gtk2_ardour / level_meter.h
index 0273a075c87dbbca639d08afb81650c2c518b2ab..f3ff2a8550f682d37a55d234a895c615befd7bab 100644 (file)
 #include <gtkmm/table.h>
 #include <gtkmm/drawingarea.h>
 
-#include <ardour/types.h>
+#include "ardour/types.h"
+#include "ardour/chan_count.h"
+#include "ardour/session_handle.h"
 
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/focus_entry.h>
-#include <gtkmm2ext/slider_controller.h>
+#include "widgets/fastmeter.h"
+#include "widgets/focus_entry.h"
+#include "widgets/slider_controller.h"
 
 #include "enums.h"
 
 namespace ARDOUR {
-       class IO;
        class Session;
-       class Route;
-       class RouteGroup;
-}
-namespace Gtkmm2ext {
-       class FastMeter;
-       class BarController;
+       class PeakMeter;
 }
 namespace Gtk {
        class Menu;
 }
 
-class LevelMeter : public Gtk::HBox
+class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::trackable
 {
-  public:
-       LevelMeter (ARDOUR::Session&);
-       ~LevelMeter ();
+public:
+       LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir,
+                       ArdourWidgets::FastMeter::Orientation o = ArdourWidgets::FastMeter::Vertical);
+       virtual ~LevelMeterBase ();
 
-       virtual void set_io (boost::shared_ptr<ARDOUR::IO> io);
+       virtual void set_meter (ARDOUR::PeakMeter* meter);
 
        void update_gain_sensitive ();
 
        float update_meters ();
        void update_meters_falloff ();
-       void clear_meters ();
+       void clear_meters (bool reset_highlight = true);
        void hide_meters ();
-       void setup_meters (int len=0, int width=3);
+       void setup_meters (int len=0, int width=3, int thin=2);
+       void set_max_audio_meter_count (uint32_t cnt = 0);
+
+       void set_meter_type (ARDOUR::MeterType);
+       ARDOUR::MeterType meter_type () { return _meter_type; }
+
+       /** Emitted in the GUI thread when a button is pressed over the meter */
+       PBD::Signal1<bool, GdkEventButton *> ButtonPress;
+       PBD::Signal1<bool, GdkEventButton *> ButtonRelease;
+       PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged;
 
-  private:
+protected:
+       virtual void mtr_pack(Gtk::Widget &w) = 0;
+       virtual void mtr_remove(Gtk::Widget &w) = 0;
 
-       //friend class MixerStrip;
-       boost::shared_ptr<ARDOUR::IO> _io;
-       ARDOUR::Session& _session;
+private:
+       PBD::EventLoop::InvalidationRecord* parent_invalidator;
+       ARDOUR::PeakMeter* _meter;
+       ArdourWidgets::FastMeter::Orientation _meter_orientation;
 
        Width _width;
 
        struct MeterInfo {
-           Gtkmm2ext::FastMeter *meter;
-           gint16          width;
-               int                             length;   
-           bool            packed;
-           
-           MeterInfo() { 
-                   meter = 0;
-                   width = 0;
+               ArdourWidgets::FastMeter* meter;
+               gint16                    width;
+               int                       length;
+               bool                      packed;
+               float                     max_peak;
+
+               MeterInfo() {
+                       meter = 0;
+                       width = 0;
                        length = 0;
-                   packed = false;
-           }
+                       packed = false;
+                       max_peak = -INFINITY;
+               }
        };
 
-       guint16 regular_meter_width;
-       static const guint16 thin_meter_width = 2;
-       std::vector<MeterInfo>    meters;
-       float       max_peak;
-       
+       guint16                regular_meter_width;
+       int                    meter_length;
+       guint16                thin_meter_width;
+       std::vector<MeterInfo> meters;
+       float                  max_peak;
+       ARDOUR::MeterType      _meter_type;
+       ARDOUR::MeterType      visible_meter_type;
+       uint32_t               midi_count;
+       uint32_t               meter_count;
+       uint32_t               max_visible_meters;
+
+       PBD::ScopedConnection _configuration_connection;
+       PBD::ScopedConnection _meter_type_connection;
+       PBD::ScopedConnection _parameter_connection;
+
        void hide_all_meters ();
-       gint meter_button_release (GdkEventButton*, uint32_t);
+       bool meter_button_press (GdkEventButton *);
+       bool meter_button_release (GdkEventButton *);
 
-       void parameter_changed (const char*);
+       void parameter_changed (std::string);
+       void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out);
+       void meter_type_changed (ARDOUR::MeterType);
 
-       void on_theme_changed ();
-       bool style_changed;
        bool color_changed;
        void color_handler ();
 };
 
+class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
+{
+public:
+       LevelMeterHBox (ARDOUR::Session*);
+       ~LevelMeterHBox();
+
+protected:
+       void mtr_pack(Gtk::Widget &w);
+       void mtr_remove(Gtk::Widget &w);
+};
+
+class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
+{
+public:
+       LevelMeterVBox (ARDOUR::Session*);
+       ~LevelMeterVBox();
+
+protected:
+       void mtr_pack(Gtk::Widget &w);
+       void mtr_remove(Gtk::Widget &w);
+};
+
 #endif /* __ardour_gtk_track_meter_h__ */