/*
Copyright (C) 2006,2007 John Anderson
-
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace ARDOUR {
class AutomationControl;
+ class Port;
}
namespace MIDI {
~MackieControlUIRequest () {}
};
-class MackieControlProtocol
+class MackieControlProtocol
: public ARDOUR::ControlProtocol
, public AbstractUI<MackieControlUIRequest>
{
static const int MODIFIER_CONTROL;
static const int MODIFIER_SHIFT;
static const int MODIFIER_CMDALT;
+ static const int MODIFIER_ZOOM;
+ static const int MODIFIER_SCRUB;
+ static const int MAIN_MODIFIER_MASK;
enum ViewMode {
Mixer,
- Dynamics,
- EQ,
- Loop,
AudioTracks,
MidiTracks,
Busses,
- Sends,
+ Auxes,
+ Selected,
Plugins,
};
+ enum PotMode {
+ Trim,
+ Send,
+ Pan,
+ };
+
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; }
+ PBD::Signal0<void> DeviceChanged;
+ PBD::Signal1<void,boost::shared_ptr<Mackie::Surface> > ConnectionChange;
+
void device_ready ();
int set_active (bool yn);
- int set_device (const std::string&);
+ int set_device (const std::string&, bool force);
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; }
+ PotMode pot_mode () const { return _pot_mode; }
+ bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
bool metering_active () const { return _metering_active; }
+ bool is_track (boost::shared_ptr<ARDOUR::Route>) const;
+ bool is_audio_track (boost::shared_ptr<ARDOUR::Route>) const;
+ bool is_midi_track (boost::shared_ptr<ARDOUR::Route>) const;
+ bool selected (boost::shared_ptr<ARDOUR::Route>) const;
+
void set_view_mode (ViewMode);
void set_flip_mode (FlipMode);
+ void set_pot_mode (PotMode);
+ void display_view_mode ();
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
we do not implement get/set_feedback() since this aspect of
support for the protocol is not optional.
*/
-
+
static bool probe();
-
- Glib::Threads::Mutex surfaces_lock;
+
+ mutable Glib::Threads::Mutex surfaces_lock;
typedef std::list<boost::shared_ptr<Mackie::Surface> > Surfaces;
Surfaces surfaces;
+ boost::shared_ptr<Mackie::Surface> get_surface_by_raw_pointer (void*) const;
+ boost::shared_ptr<Mackie::Surface> nth_surface (uint32_t) const;
+
std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
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 notify_route_added (ARDOUR::RouteList &);
void notify_remote_id_changed();
+ void recalibrate_faders ();
+ void toggle_backlight ();
+ void set_touch_sensitivity (int);
+
/// rebuild the current bank. Called on route added/removed and
/// remote id changed.
void refresh_current_bank();
/// 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 (int id, Mackie::LedState);
void update_global_led (int id, Mackie::LedState);
framepos_t transport_frame() const;
int modifier_state() const { return _modifier_state; }
+ int main_modifier_state() const { return _modifier_state & MAIN_MODIFIER_MASK; }
typedef std::list<boost::shared_ptr<ARDOUR::AutomationControl> > 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 ();
-
+ void ping_devices ();
+
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<boost::shared_ptr<ARDOUR::Route> > 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 ();
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&))
+ Mackie::LedState (MackieControlProtocol::*r) (Mackie::Button&))
: press (p)
, release (r) {}
};
typedef std::map<Mackie::Button::ID,ButtonHandlers> ButtonMap;
static MackieControlProtocol* _instance;
-
+
Mackie::DeviceInfo _device_info;
Mackie::DeviceProfile _device_profile;
sigc::connection periodic_connection;
+ sigc::connection redisplay_connection;
+ sigc::connection hui_connection;
uint32_t _current_initial_bank;
PBD::ScopedConnectionList audio_engine_connections;
PBD::ScopedConnectionList session_connections;
Mackie::Timer _frm_left_last;
// last written timecode string
std::string _timecode_last;
+ framepos_t _frame_last;
// Which timecode are we displaying? BBT or Timecode
ARDOUR::AnyTime::Type _timecode_type;
// Bundle to represent our input ports
// Bundle to represent our output ports
boost::shared_ptr<ARDOUR::Bundle> _output_bundle;
void* _gui;
- bool _zoom_mode;
bool _scrub_mode;
FlipMode _flip_mode;
ViewMode _view_mode;
+ PotMode _pot_mode;
int _current_selected_track;
int _modifier_state;
ButtonMap button_map;
bool _metering_active;
bool _initialized;
ARDOUR::RouteNotificationList _last_selected_routes;
- XMLNode* _surfaces_state;
- int _surfaces_version;
+ XMLNode* configuration_state;
+ int state_version;
+ int _last_bank[9];
+
boost::shared_ptr<ArdourSurface::Mackie::Surface> _master_surface;
struct ipMIDIHandler {
int create_surfaces ();
bool periodic();
+ bool redisplay();
+ bool hui_heartbeat ();
void build_gui ();
bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port);
void clear_ports ();
int ipmidi_restart ();
void initialize ();
int set_device_info (const std::string& device_name);
+ void update_configuration_state ();
+
+ /* MIDI port connection management */
+
+ PBD::ScopedConnection port_connection;
+ void connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool);
/* BUTTON HANDLING */
typedef std::set<uint32_t> DownButtonList;
typedef std::map<ARDOUR::AutomationType,DownButtonList> DownButtonMap;
DownButtonMap _down_buttons;
- DownButtonList _down_select_buttons;
+ DownButtonList _down_select_buttons;
void pull_route_range (DownButtonList&, ARDOUR::RouteList&);
Mackie::LedState click_release (Mackie::Button&);
Mackie::LedState view_press (Mackie::Button&);
Mackie::LedState view_release (Mackie::Button&);
+
+ Mackie::LedState bank_release (Mackie::Button&, uint32_t bank_num);
};
-} // namespace
+} // namespace
#endif // ardour_mackie_control_protocol_h