X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fsurface.h;h=218e2e2cbc7c5b65978cd955af9cc56cbb9531b3;hb=e52c8e376a068c11a9a771a15977a65c067c71e6;hp=d88f37e5c6e8a17f4a2040ab99377012f7601713;hpb=5097af6a13828adf9f1bb87bd8bd8557963c0d7e;p=ardour.git diff --git a/libs/surfaces/mackie/surface.h b/libs/surfaces/mackie/surface.h index d88f37e5c6..218e2e2cbc 100644 --- a/libs/surfaces/mackie/surface.h +++ b/libs/surfaces/mackie/surface.h @@ -3,21 +3,33 @@ #include +#include + +#include "pbd/signals.h" +#include "pbd/xml++.h" #include "midi++/types.h" +#include "ardour/types.h" + +#include "control_protocol/types.h" + #include "controls.h" #include "types.h" -#include "mackie_jog_wheel.h" +#include "jog_wheel.h" namespace MIDI { class Parser; } namespace ARDOUR { - class Route; + class Stripable; + class Port; } class MidiByteArray; + +namespace ArdourSurface { + class MackieControlProtocol; namespace Mackie @@ -33,54 +45,58 @@ class Jog; class Pot; class Led; -class Surface : public PBD::ScopedConnectionList +class Surface : public PBD::ScopedConnectionList, public sigc::trackable { public: - Surface (MackieControlProtocol&, jack_client_t* jack, const std::string& device_name, uint32_t number, surface_type_t stype); + Surface (MackieControlProtocol&, const std::string& name, uint32_t number, surface_type_t stype); virtual ~Surface(); surface_type_t type() const { return _stype; } uint32_t number() const { return _number; } + const std::string& name() { return _name; } - MackieControlProtocol& mcp() const { return _mcp; } + void connected (); bool active() const { return _active; } - void drop_routes (); typedef std::vector Controls; Controls controls; std::map faders; std::map pots; - std::map buttons; + std::map buttons; // index is device-DEPENDENT std::map leds; std::map meters; + std::map controls_by_device_independent_id; - /// no strip controls in here because they usually - /// have the same names. - std::map controls_by_name; - Mackie::JogWheel* jog_wheel() const { return _jog_wheel; } + Fader* master_fader() const { return _master_fader; } - /// The collection of all numbered strips. No master - /// strip in here. + /// The collection of all numbered strips. typedef std::vector Strips; Strips strips; - uint32_t n_strips () const; + uint32_t n_strips (bool with_locked_strips = true) const; Strip* nth_strip (uint32_t n) const; + bool stripable_is_locked_to_strip (boost::shared_ptr) const; + bool stripable_is_mapped (boost::shared_ptr) const; + /// This collection owns the groups typedef std::map Groups; Groups groups; SurfacePort& port() const { return *_port; } - void map_routes (const std::vector >& routes); + void map_stripables (const std::vector >&); + + void update_strip_selection (); const MidiByteArray& sysex_hdr() const; - void periodic (); + void periodic (ARDOUR::microseconds_t now_usecs); + void redisplay (ARDOUR::microseconds_t now_usecs, bool force); + void hui_heartbeat (); void handle_midi_pitchbend_message (MIDI::Parser&, MIDI::pitchbend_t, uint32_t channel_id); void handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes*); @@ -90,9 +106,6 @@ public: /// unless it's already connected void connect_to_signals (); - /// notification from a MackiePort that it's now inactive - void handle_port_inactive(Mackie::SurfacePort *); - /// write a sysex message void write_sysex (const MidiByteArray& mba); void write_sysex (MIDI::byte msg); @@ -101,17 +114,24 @@ public: /// display an indicator of the first switched-in Route. Do nothing by default. void display_bank_start (uint32_t /*current_bank*/); - + /// called from MackieControlProtocol::zero_all to turn things off void zero_all (); + void zero_controls (); /// turn off leds around the jog wheel. This is for surfaces that use a pot /// pretending to be a jog wheel. void blank_jog_ring (); - bool has_timecode_display() const; void display_timecode (const std::string & /*timecode*/, const std::string & /*timecode_last*/); + /// sends MCP "reset" message to surface + void reset (); + + void recalibrate_faders (); + void toggle_backlight (); + void set_touch_sensitivity (int); + /** This is used to calculate the clicks per second that define a transport speed of 1.0 for the jog wheel. 100.0 is 10 clicks @@ -131,32 +151,74 @@ public: // display the first 2 chars of the msg in the 2 char display // . is appended to the previous character, so A.B. would // be two characters - MidiByteArray two_char_display (const std::string & msg, const std::string & dots = " "); - MidiByteArray two_char_display (unsigned int value, const std::string & dots = " "); - - /** - Timecode display. Only the difference between timecode and last_timecode will - be encoded, to save midi bandwidth. If they're the same, an empty array will - be returned - */ - MidiByteArray timecode_display (const std::string & timecode, const std::string & last_timecode = ""); + void show_two_char_display (const std::string & msg, const std::string & dots = " "); + void show_two_char_display (unsigned int value, const std::string & dots = " "); + + void update_view_mode_display (bool with_helpful_text); + void update_flip_mode_display (); + + void subview_mode_changed (); + + MackieControlProtocol& mcp() const { return _mcp; } + + void next_jog_mode (); + void set_jog_mode (Mackie::JogWheel::Mode); - protected: - void init_controls(); - void init_strips (); + void notify_metering_state_changed(); + void turn_it_on (); + + void display_message_for (std::string const& msg, uint64_t msecs); + + bool connection_handler (boost::weak_ptr, std::string name1, boost::weak_ptr, std::string name2, bool); + + void master_monitor_may_have_changed (); + + XMLNode& get_state (); + int set_state (const XMLNode&, int version); + + bool get_qcon_flag() { return is_qcon; } private: MackieControlProtocol& _mcp; - SurfacePort* _port; - surface_type_t _stype; - uint32_t _number; - bool _active; - bool _connected; - Mackie::JogWheel* _jog_wheel; - - void jog_wheel_state_display (Mackie::JogWheel::State state); + SurfacePort* _port; + surface_type_t _stype; + uint32_t _number; + std::string _name; + bool _active; + bool _connected; + Mackie::JogWheel* _jog_wheel; + Fader* _master_fader; + float _last_master_gain_written; + PBD::ScopedConnection master_connection; + + void handle_midi_sysex (MIDI::Parser&, MIDI::byte *, size_t count); + MidiByteArray host_connection_query (MidiByteArray& bytes); + MidiByteArray host_connection_confirmation (const MidiByteArray& bytes); + + void say_hello (); + void init_controls (); + void init_strips (uint32_t n); + void setup_master (); + void master_gain_changed (); + + enum ConnectionState { + InputConnected = 0x1, + OutputConnected = 0x2 + }; + + int connection_state; + + // QCon Flag + bool is_qcon; + + MidiByteArray display_line (std::string const& msg, int line_num); + + public: + /* IP MIDI devices need to keep a handle on this and destroy it */ + GSource* input_source; }; +} } #endif