X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fstrip.h;h=9cce3d2b9215dc0232e2c1667a0f7447727e6b15;hb=a1d2c1307782a1fe7dfae57e36ab480e9efbb189;hp=80d99e31ee238882f9ad7a29641fac1b98081a9d;hpb=f02edae438dc2bede1de439e2e69b684a4117d80;p=ardour.git diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h index 80d99e31ee..9cce3d2b92 100644 --- a/libs/surfaces/mackie/strip.h +++ b/libs/surfaces/mackie/strip.h @@ -4,7 +4,28 @@ #include #include +#include "evoral/Parameter.hpp" + +#include "pbd/property_basics.h" +#include "pbd/ringbuffer.h" +#include "pbd/signals.h" + +#include "ardour/types.h" +#include "control_protocol/types.h" + #include "control_group.h" +#include "types.h" +#include "mackie_control_protocol.h" +#include "midi_byte_array.h" +#include "device_info.h" + +namespace ARDOUR { + class Route; + class Bundle; + class ChannelCount; +} + +namespace ArdourSurface { namespace Mackie { @@ -14,17 +35,12 @@ class Button; class Pot; class Fader; class Meter; - -struct StripControlDefinition { - const char* name; - uint32_t base_id; - Control* (*factory)(Surface&, int index, int ordinal, const char* name, Group&); -}; +class SurfacePort; struct GlobalControlDefinition { const char* name; - uint32_t id; - Control* (*factory)(Surface&, int index, int ordinal, const char* name, Group&); + int id; + Control* (*factory)(Surface&, int index, const char* name, Group&); const char* group_name; }; @@ -34,56 +50,131 @@ struct GlobalControlDefinition { class Strip : public Group { public: - Strip (const std::string& name, int index); /* master strip only */ - Strip (Surface&, const std::string & name, int index, int unit_index, StripControlDefinition* ctls); + Strip (Surface&, const std::string & name, int index, const std::map&); + ~Strip(); + + boost::shared_ptr route() const { return _route; } - virtual bool is_strip() const { return true; } - virtual void add (Control & control); + void add (Control & control); int index() const { return _index; } // zero based - - Button & solo(); - Button & recenable(); - Button & mute(); - Button & select(); - Button & vselect(); - Button & fader_touch(); - Pot & vpot(); - Fader & gain(); - Meter& meter (); - - bool has_solo() const { return _solo != 0; } - bool has_recenable() const { return _recenable != 0; } - bool has_mute() const { return _mute != 0; } - bool has_select() const { return _select != 0; } - bool has_vselect() const { return _vselect != 0; } - bool has_fader_touch() const { return _fader_touch != 0; } - bool has_vpot() const { return _vpot != 0; } - bool has_gain() const { return _gain != 0; } - bool has_meter() const { return _meter != 0; } + Surface* surface() const { return _surface; } + + void set_route (boost::shared_ptr, bool with_messages = true); + + // call all signal handlers manually + void notify_all (); + + void handle_button (Button&, ButtonState bs); + void handle_fader (Fader&, float position); + void handle_fader_touch (Fader&, bool touch_on); + void handle_pot (Pot&, float delta); + + void periodic (ARDOUR::microseconds_t now_usecs); + void redisplay (ARDOUR::microseconds_t now_usecs, bool force = true); + + MidiByteArray display (uint32_t line_number, const std::string&); + MidiByteArray blank_display (uint32_t line_number); + + void zero (); + + void flip_mode_changed (); + void subview_mode_changed (); + + void lock_controls (); + void unlock_controls (); + bool locked() const { return _controls_locked; } + + void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&); + + void notify_metering_state_changed(); + + void block_screen_display_for (uint32_t msecs); + void block_vpot_mode_display_for (uint32_t msecs); + private: - Button* _solo; - Button* _recenable; - Button* _mute; - Button* _select; - Button* _vselect; - Button* _fader_touch; - Pot* _vpot; - Fader* _gain; - Meter* _meter; - int _index; -}; + enum VPotDisplayMode { + Name, + Value + }; -std::ostream & operator << (std::ostream &, const Strip &); + Button* _solo; + Button* _recenable; + Button* _mute; + Button* _select; + Button* _vselect; + Button* _fader_touch; + Pot* _vpot; + Fader* _fader; + Meter* _meter; + int _index; + Surface* _surface; + bool _controls_locked; + bool _transport_is_rolling; + bool _metering_active; + std::string pending_display[2]; + std::string current_display[2]; + uint64_t _block_screen_redisplay_until; + uint64_t return_to_vpot_mode_display_at; + boost::shared_ptr _route; + PBD::ScopedConnectionList route_connections; + PBD::ScopedConnectionList subview_connections; + PBD::ScopedConnectionList send_connections; + int eq_band; -class MasterStrip : public Strip -{ -public: - MasterStrip (const std::string & name, int index) - : Strip (name, index) {} - - virtual bool is_master() const { return true; } + ARDOUR::AutomationType _pan_mode; + + float _last_gain_position_written; + float _last_pan_azi_position_written; + float _last_pan_width_position_written; + float _last_trim_position_written; + + void notify_solo_changed (); + void notify_mute_changed (); + void notify_record_enable_changed (); + void notify_gain_changed (bool force_update = true); + void notify_property_changed (const PBD::PropertyChange&); + void notify_panner_azi_changed (bool force_update = true); + void notify_panner_width_changed (bool force_update = true); + void notify_active_changed (); + void notify_route_deleted (); + void notify_processor_changed (bool force_update = true); + void update_automation (); + void update_meter (); + std::string vpot_mode_string (); + + boost::shared_ptr mb_pan_controllable; + + void return_to_vpot_mode_display (); + void next_pot_mode (); + + void do_parameter_display (ARDOUR::AutomationType, float val); + void select_event (Button&, ButtonState); + void vselect_event (Button&, ButtonState); + void fader_touch_event (Button&, ButtonState); + + std::vector possible_pot_parameters; + std::vector possible_trim_parameters; + void set_vpot_parameter (ARDOUR::AutomationType); + void show_route_name (); + + void reset_saved_values (); + + bool is_midi_track () const; + + void notify_eq_change (ARDOUR::AutomationType, uint32_t band, bool force); + void setup_eq_vpot (boost::shared_ptr); + + void notify_dyn_change (ARDOUR::AutomationType, bool force, bool propagate_mode_change); + void setup_dyn_vpot (boost::shared_ptr); + + void notify_send_level_change (ARDOUR::AutomationType, uint32_t band, bool force); + void setup_sends_vpot (boost::shared_ptr); + + void notify_trackview_change (ARDOUR::AutomationType, uint32_t band, bool force); + void setup_trackview_vpot (boost::shared_ptr); }; +} } #endif /* __ardour_mackie_control_protocol_strip_h__ */