2 Copyright (C) 2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef ardour_generic_midi_control_protocol_h
21 #define ardour_generic_midi_control_protocol_h
24 #include <glibmm/threads.h>
26 #include "ardour/types.h"
27 #include "ardour/port.h"
29 #include "control_protocol/control_protocol.h"
37 class ControllableDescriptor;
46 class MIDIControllable;
50 class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
52 GenericMidiControlProtocol (ARDOUR::Session&);
53 virtual ~GenericMidiControlProtocol();
55 int set_active (bool yn);
56 static bool probe() { return true; }
58 void stripable_selection_changed () {}
60 std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
62 boost::shared_ptr<ARDOUR::Port> input_port () const;
63 boost::shared_ptr<ARDOUR::Port> output_port () const;
65 void set_feedback_interval (ARDOUR::microseconds_t);
67 int set_feedback (bool yn);
68 bool get_feedback () const;
70 boost::shared_ptr<PBD::Controllable> lookup_controllable (const ARDOUR::ControllableDescriptor&) const;
72 void maybe_start_touch (PBD::Controllable*);
74 XMLNode& get_state ();
75 int set_state (const XMLNode&, int version);
77 bool has_editor () const { return true; }
78 void* get_gui () const;
79 void tear_down_gui ();
81 int load_bindings (const std::string&);
82 void drop_bindings ();
84 void check_used_event (int, int);
86 std::string current_binding() const { return _current_binding; }
93 std::list<MapInfo> map_info;
96 void set_current_bank (uint32_t);
100 void set_motorised (bool);
102 bool motorised () const {
106 void set_threshold (int);
108 int threshold () const {
112 PBD::Signal0<void> ConnectionChange;
115 boost::shared_ptr<ARDOUR::Bundle> _input_bundle;
116 boost::shared_ptr<ARDOUR::Bundle> _output_bundle;
117 boost::shared_ptr<ARDOUR::AsyncMIDIPort> _input_port;
118 boost::shared_ptr<ARDOUR::AsyncMIDIPort> _output_port;
120 ARDOUR::microseconds_t _feedback_interval;
121 ARDOUR::microseconds_t last_feedback_time;
124 void _send_feedback ();
125 void send_feedback ();
127 typedef std::list<MIDIControllable*> MIDIControllables;
128 MIDIControllables controllables;
130 typedef std::list<MIDIFunction*> MIDIFunctions;
131 MIDIFunctions functions;
133 typedef std::list<MIDIAction*> MIDIActions;
136 struct MIDIPendingControllable {
137 MIDIControllable* mc;
139 PBD::ScopedConnection connection;
141 MIDIPendingControllable (MIDIControllable* c, bool omc)
146 typedef std::list<MIDIPendingControllable* > MIDIPendingControllables;
147 MIDIPendingControllables pending_controllables;
148 Glib::Threads::Mutex controllables_lock;
149 Glib::Threads::Mutex pending_lock;
151 bool start_learning (PBD::Controllable*);
152 void stop_learning (PBD::Controllable*);
154 void learning_stopped (MIDIControllable*);
156 void create_binding (PBD::Controllable*, int, int);
157 void delete_binding (PBD::Controllable*);
159 MIDIControllable* create_binding (const XMLNode&);
160 MIDIFunction* create_function (const XMLNode&);
161 MIDIAction* create_action (const XMLNode&);
163 void reset_controllables ();
166 enum ConnectionState {
167 InputConnected = 0x1,
168 OutputConnected = 0x2
171 int connection_state;
172 bool connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool yn);
173 PBD::ScopedConnection port_connection;
176 std::string _current_binding;
178 uint32_t _current_bank;
179 /** true if this surface is motorised. If it is, we assume
180 that the surface's controls are never out of sync with
181 Ardour's state, so we don't have to take steps to avoid
182 values jumping around when things are not in sync.
193 #endif /* ardour_generic_midi_control_protocol_h */