summaryrefslogtreecommitdiff
path: root/libs/surfaces/us2400/surface.h
diff options
context:
space:
mode:
authorBen Loftis <ben@harrisonconsoles.com>2017-10-05 10:54:46 -0500
committerBen Loftis <ben@harrisonconsoles.com>2017-10-05 10:55:45 -0500
commit2107d094541dd836b46be0ff48964fd44fbbeacf (patch)
treec952c4f730568031f6669ff25921b1b1f3839d07 /libs/surfaces/us2400/surface.h
parent32c725115d87752a01cae533070b9931867667cd (diff)
US2400: add us2400 files to repository.
Diffstat (limited to 'libs/surfaces/us2400/surface.h')
-rw-r--r--libs/surfaces/us2400/surface.h204
1 files changed, 204 insertions, 0 deletions
diff --git a/libs/surfaces/us2400/surface.h b/libs/surfaces/us2400/surface.h
new file mode 100644
index 0000000000..e17bacb8d4
--- /dev/null
+++ b/libs/surfaces/us2400/surface.h
@@ -0,0 +1,204 @@
+#ifndef mackie_surface_h
+#define mackie_surface_h
+
+#include <stdint.h>
+
+#include <sigc++/trackable.h>
+
+#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 "jog_wheel.h"
+
+namespace MIDI {
+ class Parser;
+}
+
+namespace ARDOUR {
+ class Stripable;
+ class Port;
+}
+
+class MidiByteArray;
+
+namespace ArdourSurface {
+
+class US2400Protocol;
+
+namespace US2400
+{
+
+class MackieButtonHandler;
+class SurfacePort;
+class MackieMidiBuilder;
+class Button;
+class Meter;
+class Fader;
+class Jog;
+class Pot;
+class Led;
+
+class Surface : public PBD::ScopedConnectionList, public sigc::trackable
+{
+public:
+ Surface (US2400Protocol&, 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; }
+
+ void connected ();
+
+ bool active() const { return _active; }
+
+ typedef std::vector<Control*> Controls;
+ Controls controls;
+
+ std::map<int,Fader*> faders;
+ std::map<int,Pot*> pots;
+ std::map<int,Button*> buttons; // index is device-DEPENDENT
+ std::map<int,Led*> leds;
+ std::map<int,Meter*> meters;
+ std::map<int,Control*> controls_by_device_independent_id;
+
+ US2400::JogWheel* jog_wheel() const { return _jog_wheel; }
+ Fader* master_fader() const { return _master_fader; }
+
+ /// The collection of all numbered strips.
+ typedef std::vector<Strip*> Strips;
+ Strips strips;
+
+ 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<ARDOUR::Stripable>) const;
+ bool stripable_is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
+
+ /// This collection owns the groups
+ typedef std::map<std::string,Group*> Groups;
+ Groups groups;
+
+ SurfacePort& port() const { return *_port; }
+
+ void map_stripables (const std::vector<boost::shared_ptr<ARDOUR::Stripable> >&);
+
+ void update_strip_selection ();
+
+ const MidiByteArray& sysex_hdr() const;
+
+ 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*);
+ void handle_midi_note_on_message (MIDI::Parser&, MIDI::EventTwoBytes*);
+
+ /// Connect the any signal from the parser to handle_midi_any
+ /// unless it's already connected
+ void connect_to_signals ();
+
+ /// write a sysex message
+ void write_sysex (const MidiByteArray& mba);
+ void write_sysex (MIDI::byte msg);
+ /// proxy write for port
+ void write (const MidiByteArray&);
+
+ /// display an indicator of the first switched-in Route. Do nothing by default.
+ void display_bank_start (uint32_t /*current_bank*/);
+
+ /// called from US2400Protocol::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 ();
+
+ /// 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
+ per second, 50.5 is 5 clicks per second.
+ */
+ float scrub_scaling_factor() const;
+
+ /**
+ The scaling factor function for speed increase and decrease. At
+ low transport speeds this should return a small value, for high transport
+ speeds, this should return an exponentially larger value. This provides
+ high definition control at low speeds and quick speed changes to/from
+ higher speeds.
+ */
+ float scaled_delta (float delta, float current_speed);
+
+ void subview_mode_changed ();
+
+ US2400Protocol& mcp() const { return _mcp; }
+
+ void next_jog_mode ();
+ void set_jog_mode (US2400::JogWheel::Mode);
+
+ void notify_metering_state_changed();
+ void turn_it_on ();
+
+ bool connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool);
+
+ void master_monitor_may_have_changed ();
+
+ XMLNode& get_state ();
+ int set_state (const XMLNode&, int version);
+
+ private:
+ US2400Protocol& _mcp;
+ SurfacePort* _port;
+ surface_type_t _stype;
+ uint32_t _number;
+ std::string _name;
+ bool _active;
+ bool _connected;
+ US2400::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;
+
+ public:
+ /* IP MIDI devices need to keep a handle on this and destroy it */
+ GSource* input_source;
+};
+
+}
+}
+
+#endif