#include <string>
-#include <sigc++/sigc++.h>
+#include "midi++/types.h"
-#include <midi++/types.h>
-#include <pbd/controllable.h>
-#include <pbd/stateful.h>
-#include <ardour/types.h>
+#include "pbd/controllable.h"
+#include "pbd/signals.h"
+#include "pbd/stateful.h"
-namespace MIDI {
+#include "ardour/types.h"
-class Channel;
-class Port;
-class Parser;
+namespace PBD {
+ class ControllableDescriptor;
+}
+namespace MIDI {
+ class Channel;
+ class Port;
+ class Parser;
}
class MIDIControllable : public PBD::Stateful
{
public:
- MIDIControllable (MIDI::Port&, PBD::Controllable&, bool bistate = false);
+ MIDIControllable (MIDI::Port&, PBD::Controllable&, bool momentary);
+ MIDIControllable (MIDI::Port&, bool momentary = false);
virtual ~MIDIControllable ();
+ int init (const std::string&);
+
+ void rediscover_controllable ();
+ bool bank_relative() const { return _bank_relative; }
+ uint32_t rid() const { return _rid; }
+ std::string what() const { return _what; }
+
void send_feedback ();
MIDI::byte* write_feedback (MIDI::byte* buf, int32_t& bufsize, bool force = false);
float control_to_midi(float val);
float midi_to_control(float val);
+ bool learned() const { return _learned; }
+
MIDI::Port& get_port() const { return _port; }
- PBD::Controllable& get_controllable() const { return controllable; }
+ PBD::Controllable* get_controllable() const { return controllable; }
+ void set_controllable (PBD::Controllable*);
+ const std::string& current_uri() const { return _current_uri; }
+
+ PBD::ControllableDescriptor& descriptor() const { return *_descriptor; }
std::string control_description() const { return _control_description; }
MIDI::channel_t get_control_channel () { return control_channel; }
MIDI::eventType get_control_type () { return control_type; }
MIDI::byte get_control_additional () { return control_additional; }
+
private:
- PBD::Controllable& controllable;
+ PBD::Controllable* controllable;
+ PBD::ControllableDescriptor* _descriptor;
+ std::string _current_uri;
MIDI::Port& _port;
bool setting;
MIDI::byte last_value;
- bool bistate;
+ bool _momentary;
+ bool _is_gain_controller;
+ bool _learned;
int midi_msg_id; /* controller ID or note number */
- sigc::connection midi_sense_connection[2];
- sigc::connection midi_learn_connection;
- size_t connections;
+ PBD::ScopedConnection midi_sense_connection[2];
+ PBD::ScopedConnection midi_learn_connection;
MIDI::eventType control_type;
MIDI::byte control_additional;
MIDI::channel_t control_channel;
std::string _control_description;
bool feedback;
+ uint32_t _rid;
+ std::string _what;
+ bool _bank_relative;
void midi_receiver (MIDI::Parser &p, MIDI::byte *, size_t);
void midi_sense_note (MIDI::Parser &, MIDI::EventTwoBytes *, bool is_on);