X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fmackie_control_protocol.h;h=4ff5d53f2567ab7b2ddef8cd792b64d2c28f7b7f;hb=1745340c67d66d8dd92e5b3a377e935ed5eea973;hp=c89bfa2c10892f82fdd89feb778889de2d6923f5;hpb=20d38b1c25b9eaf3790ce148a74a0f708dabaa0c;p=ardour.git diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index c89bfa2c10..4ff5d53f25 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -21,25 +21,30 @@ #include #include +#include +#include #include #include #include -#include - +#define ABSTRACT_UI_EXPORTS #include "pbd/abstract_ui.h" - #include "midi++/types.h" - #include "ardour/types.h" #include "control_protocol/control_protocol.h" #include "types.h" #include "midi_byte_array.h" #include "controls.h" -#include "mackie_jog_wheel.h" +#include "jog_wheel.h" #include "timer.h" +#include "device_info.h" +#include "device_profile.h" + +namespace ARDOUR { + class AutomationControl; +} namespace MIDI { class Port; @@ -88,31 +93,65 @@ class MackieControlProtocol static const int MODIFIER_SHIFT; static const int MODIFIER_CMDALT; + enum ViewMode { + Mixer, + Dynamics, + EQ, + Loop, + AudioTracks, + MidiTracks, + Busses, + Sends, + Plugins, + }; + + enum FlipMode { + Normal, /* fader controls primary, vpot controls secondary */ + Mirror, /* fader + vpot control secondary */ + Swap, /* fader controls secondary, vpot controls primary */ + Zero, /* fader controls primary, but doesn't move, vpot controls secondary */ + }; + MackieControlProtocol(ARDOUR::Session &); virtual ~MackieControlProtocol(); static MackieControlProtocol* instance() { return _instance; } + + const Mackie::DeviceInfo& device_info() const { return _device_info; } + Mackie::DeviceProfile& device_profile() { return _device_profile; } int set_active (bool yn); + int set_device (const std::string&); + void set_profile (const std::string&); + + FlipMode flip_mode () const { return _flip_mode; } + ViewMode view_mode () const { return _view_mode; } + bool zoom_mode () const { return _zoom_mode; } + bool metering_active () const { return _metering_active; } + + void set_view_mode (ViewMode); + void set_flip_mode (FlipMode); XMLNode& get_state (); int set_state (const XMLNode&, int version); static bool probe(); + Glib::Threads::Mutex surfaces_lock; typedef std::list > Surfaces; Surfaces surfaces; std::list > bundles (); - uint32_t n_strips () const; + void set_master_on_surface_strip (uint32_t surface, uint32_t strip); + void set_monitor_on_surface_strip (uint32_t surface, uint32_t strip); + + uint32_t n_strips (bool with_locked_strips = true) const; bool has_editor () const { return true; } void* get_gui () const; void tear_down_gui (); - void select_track (boost::shared_ptr r); - void handle_button_event (Mackie::Surface&, Mackie::Button& button, Mackie::ButtonState); void notify_route_added (ARDOUR::RouteList &); @@ -126,6 +165,7 @@ class MackieControlProtocol void notify_record_state_changed(); void notify_transport_state_changed(); void notify_loop_state_changed(); + void notify_metering_state_changed(); // mainly to pick up punch-in and punch-out void notify_parameter_changed(std::string const &); void notify_solo_active_changed(bool); @@ -133,12 +173,147 @@ class MackieControlProtocol /// Turn timecode on and beats off, or vice versa, depending /// on state of _timecode_type void update_timecode_beats_led(); - + /// this is called to generate the midi to send in response to a button press. void update_led(Mackie::Surface&, Mackie::Button & button, Mackie::LedState); - void update_global_button(const std::string & name, Mackie::LedState); - void update_global_led(const std::string & name, Mackie::LedState); + void update_global_button (int id, Mackie::LedState); + void update_global_led (int id, Mackie::LedState); + + ARDOUR::Session & get_session() { return *session; } + framepos_t transport_frame() const; + + int modifier_state() const { return _modifier_state; } + + typedef std::list > ControlList; + + void add_down_button (ARDOUR::AutomationType, int surface, int strip); + void remove_down_button (ARDOUR::AutomationType, int surface, int strip); + ControlList down_controls (ARDOUR::AutomationType); + + void add_down_select_button (int surface, int strip); + void remove_down_select_button (int surface, int strip); + void select_range (); + + int16_t ipmidi_base() const { return _ipmidi_base; } + void set_ipmidi_base (int16_t); + + void midi_connectivity_established (); + + protected: + // shut down the surface + void close(); + + // This sets up the notifications and sets the + // controls to the correct values + void update_surfaces(); + + // connects global (not strip) signals from the Session to here + // so the surface can be notified of changes from the other UIs. + void connect_session_signals(); + + // set all controls to their zero position + void zero_all(); + + /** + Fetch the set of routes to be considered for control by the + surface. Excluding master, hidden and control routes, and inactive routes + */ + typedef std::vector > Sorted; + Sorted get_sorted_routes(); + + // bank switching + void switch_banks (uint32_t first_remote_id, bool force = false); + void prev_track (); + void next_track (); + + // also called from poll_automation to update timecode display + void update_timecode_display(); + + std::string format_bbt_timecode (ARDOUR::framepos_t now_frame); + std::string format_timecode_timecode (ARDOUR::framepos_t now_frame); + + void do_request (MackieControlUIRequest*); + int stop (); + + void thread_init (); + + bool route_is_locked_to_strip (boost::shared_ptr) const; + + private: + + struct ButtonHandlers { + Mackie::LedState (MackieControlProtocol::*press) (Mackie::Button&); + Mackie::LedState (MackieControlProtocol::*release) (Mackie::Button&); + + ButtonHandlers (Mackie::LedState (MackieControlProtocol::*p) (Mackie::Button&), + Mackie::LedState (MackieControlProtocol::*r) (Mackie::Button&)) + : press (p) + , release (r) {} + }; + + typedef std::map ButtonMap; + typedef std::list PortSources; + + static MackieControlProtocol* _instance; + + Mackie::DeviceInfo _device_info; + Mackie::DeviceProfile _device_profile; + sigc::connection periodic_connection; + uint32_t _current_initial_bank; + PBD::ScopedConnectionList audio_engine_connections; + PBD::ScopedConnectionList session_connections; + PBD::ScopedConnectionList route_connections; + PBD::ScopedConnectionList gui_connections; + // timer for two quick marker left presses + Mackie::Timer _frm_left_last; + // last written timecode string + std::string _timecode_last; + // Which timecode are we displaying? BBT or Timecode + ARDOUR::AnyTime::Type _timecode_type; + // Bundle to represent our input ports + boost::shared_ptr _input_bundle; + // Bundle to represent our output ports + boost::shared_ptr _output_bundle; + void* _gui; + bool _zoom_mode; + bool _scrub_mode; + FlipMode _flip_mode; + ViewMode _view_mode; + int _current_selected_track; + int _modifier_state; + PortSources port_sources; + ButtonMap button_map; + int16_t _ipmidi_base; + bool needs_ipmidi_restart; + bool _metering_active; + bool _initialized; + ARDOUR::RouteNotificationList _last_selected_routes; + XMLNode* _surfaces_state; + int _surfaces_version; + + int create_surfaces (); + bool periodic(); + void build_gui (); + bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port); + void clear_ports (); + void clear_surfaces (); + void force_special_route_to_strip (boost::shared_ptr r, uint32_t surface, uint32_t strip_number); + void build_button_map (); + void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr, bool save_list); + void _gui_track_selection_changed (ARDOUR::RouteNotificationList*, bool save_list); + int ipmidi_restart (); + void initialize (); + int set_device_info (const std::string& device_name); + + /* BUTTON HANDLING */ + + typedef std::set DownButtonList; + typedef std::map DownButtonMap; + DownButtonMap _down_buttons; + DownButtonList _down_select_buttons; + + void pull_route_range (DownButtonList&, ARDOUR::RouteList&); /* implemented button handlers */ Mackie::LedState frm_left_press(Mackie::Button &); @@ -187,8 +362,6 @@ class MackieControlProtocol Mackie::LedState global_solo_release(Mackie::Button &); Mackie::LedState marker_press(Mackie::Button &); Mackie::LedState marker_release(Mackie::Button &); - Mackie::LedState drop_press(Mackie::Button &); - Mackie::LedState drop_release(Mackie::Button &); Mackie::LedState save_press(Mackie::Button &); Mackie::LedState save_release(Mackie::Button &); Mackie::LedState timecode_beats_press(Mackie::Button &); @@ -264,8 +437,6 @@ class MackieControlProtocol Mackie::LedState on_release (Mackie::Button &); Mackie::LedState rec_ready_press (Mackie::Button &); Mackie::LedState rec_ready_release (Mackie::Button &); - Mackie::LedState snapshot_press (Mackie::Button &); - Mackie::LedState snapshot_release (Mackie::Button &); Mackie::LedState touch_press (Mackie::Button &); Mackie::LedState touch_release (Mackie::Button &); Mackie::LedState enter_press (Mackie::Button &); @@ -280,120 +451,55 @@ class MackieControlProtocol Mackie::LedState user_b_release (Mackie::Button &); Mackie::LedState fader_touch_press (Mackie::Button &); Mackie::LedState fader_touch_release (Mackie::Button &); - - ARDOUR::Session & get_session() { return *session; } - - void add_in_use_timeout (Mackie::Surface& surface, Mackie::Control& in_use_control, Mackie::Control* touch_control); - - int modifier_state(); - - protected: - // shut down the surface - void close(); - - // This sets up the notifications and sets the - // controls to the correct values - void update_surfaces(); - - // connects global (not strip) signals from the Session to here - // so the surface can be notified of changes from the other UIs. - void connect_session_signals(); - - // set all controls to their zero position - void zero_all(); - - /** - Fetch the set of routes to be considered for control by the - surface. Excluding master, hidden and control routes, and inactive routes - */ - typedef std::vector > Sorted; - Sorted get_sorted_routes(); - - // bank switching - void switch_banks (uint32_t first_remote_id, bool force = false); - void prev_track (); - void next_track (); - - // also called from poll_automation to update timecode display - void update_timecode_display(); - - std::string format_bbt_timecode (ARDOUR::framepos_t now_frame); - std::string format_timecode_timecode (ARDOUR::framepos_t now_frame); - - void do_request (MackieControlUIRequest*); - int stop (); - - void thread_init (); - - private: - - static MackieControlProtocol* _instance; - - void create_surfaces (); - void port_connected_or_disconnected (std::string, std::string, bool); - bool control_in_use_timeout (Mackie::Surface*, Mackie::Control *, Mackie::Control *); - - bool periodic(); - sigc::connection periodic_connection; - - /// The initial remote_id of the currently switched in bank. - uint32_t _current_initial_bank; - - /// protects the port list - Glib::Mutex update_mutex; - - PBD::ScopedConnectionList audio_engine_connections; - PBD::ScopedConnectionList session_connections; - PBD::ScopedConnectionList port_connections; - PBD::ScopedConnectionList route_connections; - - bool _transport_previously_rolling; - - // timer for two quick marker left presses - Mackie::Timer _frm_left_last; - - // last written timecode string - std::string _timecode_last; - - // Which timecode are we displaying? BBT or Timecode - ARDOUR::AnyTime::Type _timecode_type; - - // Bundle to represent our input ports - boost::shared_ptr _input_bundle; - // Bundle to represent our output ports - boost::shared_ptr _output_bundle; - - void build_gui (); - void* _gui; - - bool _zoom_mode; - bool _scrub_mode; - bool _flip_mode; - int _current_selected_track; - int _modifier_state; - - typedef std::list PortSources; - PortSources port_sources; - - bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port); - void clear_ports (); - - struct ButtonHandlers { - Mackie::LedState (MackieControlProtocol::*press) (Mackie::Button&); - Mackie::LedState (MackieControlProtocol::*release) (Mackie::Button&); - - ButtonHandlers (Mackie::LedState (MackieControlProtocol::*p) (Mackie::Button&), - Mackie::LedState (MackieControlProtocol::*r) (Mackie::Button&)) - : press (p) - , release (r) {} - }; - - typedef std::map ButtonMap; - ButtonMap button_map; - - void build_button_map (); + Mackie::LedState master_fader_touch_press (Mackie::Button &); + Mackie::LedState master_fader_touch_release (Mackie::Button &); + + Mackie::LedState snapshot_press (Mackie::Button&); + Mackie::LedState snapshot_release (Mackie::Button&); + Mackie::LedState read_press (Mackie::Button&); + Mackie::LedState read_release (Mackie::Button&); + Mackie::LedState write_press (Mackie::Button&); + Mackie::LedState write_release (Mackie::Button&); + Mackie::LedState fdrgroup_press (Mackie::Button&); + Mackie::LedState fdrgroup_release (Mackie::Button&); + Mackie::LedState clearsolo_press (Mackie::Button&); + Mackie::LedState clearsolo_release (Mackie::Button&); + Mackie::LedState track_press (Mackie::Button&); + Mackie::LedState track_release (Mackie::Button&); + Mackie::LedState send_press (Mackie::Button&); + Mackie::LedState send_release (Mackie::Button&); + Mackie::LedState miditracks_press (Mackie::Button&); + Mackie::LedState miditracks_release (Mackie::Button&); + Mackie::LedState inputs_press (Mackie::Button&); + Mackie::LedState inputs_release (Mackie::Button&); + Mackie::LedState audiotracks_press (Mackie::Button&); + Mackie::LedState audiotracks_release (Mackie::Button&); + Mackie::LedState audioinstruments_press (Mackie::Button&); + Mackie::LedState audioinstruments_release (Mackie::Button&); + Mackie::LedState aux_press (Mackie::Button&); + Mackie::LedState aux_release (Mackie::Button&); + Mackie::LedState busses_press (Mackie::Button&); + Mackie::LedState busses_release (Mackie::Button&); + Mackie::LedState outputs_press (Mackie::Button&); + Mackie::LedState outputs_release (Mackie::Button&); + Mackie::LedState user_press (Mackie::Button&); + Mackie::LedState user_release (Mackie::Button&); + Mackie::LedState trim_press (Mackie::Button&); + Mackie::LedState trim_release (Mackie::Button&); + Mackie::LedState latch_press (Mackie::Button&); + Mackie::LedState latch_release (Mackie::Button&); + Mackie::LedState grp_press (Mackie::Button&); + Mackie::LedState grp_release (Mackie::Button&); + Mackie::LedState nudge_press (Mackie::Button&); + Mackie::LedState nudge_release (Mackie::Button&); + Mackie::LedState drop_press (Mackie::Button&); + Mackie::LedState drop_release (Mackie::Button&); + Mackie::LedState replace_press (Mackie::Button&); + Mackie::LedState replace_release (Mackie::Button&); + Mackie::LedState click_press (Mackie::Button&); + Mackie::LedState click_release (Mackie::Button&); + Mackie::LedState view_press (Mackie::Button&); + Mackie::LedState view_release (Mackie::Button&); }; - - #endif // ardour_mackie_control_protocol_h