diff options
Diffstat (limited to 'libs/surfaces')
9 files changed, 90 insertions, 28 deletions
diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index 3dc93cc64a..07e000ab20 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -29,6 +29,7 @@ #include "i18n.h" using namespace ARDOUR; +using ARDOUR::nframes_t; BasicUI::BasicUI (Session& s) : session (&s) @@ -54,10 +55,10 @@ BasicUI::register_thread (std::string name) void BasicUI::loop_toggle () { - if (session->get_auto_loop()) { - session->request_auto_loop (false); + if (Config->get_auto_loop()) { + session->request_play_loop (false); } else { - session->request_auto_loop (true); + session->request_play_loop (true); if (!session->transport_rolling()) { session->request_transport_speed (1.0); } @@ -79,7 +80,7 @@ BasicUI::goto_end () void BasicUI::add_marker () { - jack_nframes_t when = session->audible_frame(); + nframes_t when = session->audible_frame(); session->locations()->add (new Location (when, when, _("unnamed"), Location::IsMark)); } @@ -106,8 +107,8 @@ BasicUI::transport_play (bool from_last_start) { bool rolling = session->transport_rolling (); - if (session->get_auto_loop()) { - session->request_auto_loop (false); + if (Config->get_auto_loop()) { + session->request_play_loop (false); } if (session->get_play_range ()) { @@ -208,13 +209,13 @@ BasicUI::toggle_all_rec_enables () void BasicUI::toggle_punch_in () { - session->set_punch_in (!session->get_punch_in()); + Config->set_punch_in (!Config->get_punch_in()); } void BasicUI::toggle_punch_out () { - session->set_punch_out (!session->get_punch_out()); + Config->set_punch_out (!Config->get_punch_out()); } bool @@ -233,14 +234,14 @@ BasicUI::set_record_enable (bool yn) } } -jack_nframes_t +nframes_t BasicUI::transport_frame () { return session->transport_frame(); } void -BasicUI::locate (jack_nframes_t where, bool roll_after_locate) +BasicUI::locate (nframes_t where, bool roll_after_locate) { session->request_locate (where, roll_after_locate); } @@ -257,26 +258,26 @@ BasicUI::locked () return session->transport_locked (); } -jack_nframes_t +nframes_t BasicUI::smpte_frames_per_hour () { return session->smpte_frames_per_hour (); } void -BasicUI::smpte_time (jack_nframes_t where, SMPTE::Time& smpte) +BasicUI::smpte_time (nframes_t where, SMPTE::Time& smpte) { session->smpte_time (where, *((SMPTE::Time *) &smpte)); } void -BasicUI::smpte_to_sample (SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes) const +BasicUI::smpte_to_sample (SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes) const { session->smpte_to_sample (*((SMPTE::Time*)&smpte), sample, use_offset, use_subframes); } void -BasicUI::sample_to_smpte (jack_nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes) const +BasicUI::sample_to_smpte (nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes) const { session->sample_to_smpte (sample, *((SMPTE::Time*)&smpte), use_offset, use_subframes); } diff --git a/libs/surfaces/control_protocol/control_protocol/control_protocol.h b/libs/surfaces/control_protocol/control_protocol/control_protocol.h index 8be652b9df..a689d49431 100644 --- a/libs/surfaces/control_protocol/control_protocol/control_protocol.h +++ b/libs/surfaces/control_protocol/control_protocol/control_protocol.h @@ -45,6 +45,9 @@ class ControlProtocol : public sigc::trackable, public Stateful, public BasicUI virtual int set_active (bool yn) = 0; bool get_active() const { return _active; } + virtual int set_feedback (bool yn) { return 0; } + virtual bool get_feedback () const { return false; } + sigc::signal<void> ActiveChanged; /* signals that a control protocol can emit and other (presumably graphical) @@ -110,6 +113,7 @@ extern "C" { void* ptr; /* protocol can store a value here */ void* module; /* not for public access */ int mandatory; /* if non-zero, always load and do not make optional */ + bool supports_feedback; /* if true, protocol has toggleable feedback mechanism */ bool (*probe)(ControlProtocolDescriptor*); ControlProtocol* (*initialize)(ControlProtocolDescriptor*,Session*); void (*destroy)(ControlProtocolDescriptor*,ControlProtocol*); diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 4a8c2728c6..03dbfb353c 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -18,6 +18,9 @@ $Id$ */ +#define __STDC_FORMAT_MACROS 1 +#include <stdint.h> + #include <algorithm> #include <pbd/error.h> @@ -39,7 +42,7 @@ using namespace PBD; #include "i18n.h" GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s) - : ControlProtocol (s, _("GenericMIDI")) + : ControlProtocol (s, _("Generic MIDI")) { MIDI::Manager* mm = MIDI::Manager::instance(); @@ -54,6 +57,7 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s) throw failed_constructor(); } + do_feedback = false; _feedback_interval = 10000; // microseconds last_feedback_time = 0; @@ -82,6 +86,10 @@ GenericMidiControlProtocol::set_feedback_interval (microseconds_t ms) void GenericMidiControlProtocol::send_feedback () { + if (!do_feedback) { + return; + } + microseconds_t now = get_microseconds (); if (last_feedback_time != 0) { @@ -98,7 +106,7 @@ GenericMidiControlProtocol::send_feedback () void GenericMidiControlProtocol::_send_feedback () { - const int32_t bufsize = 16 * 1024; + const int32_t bufsize = 16 * 1024; /* XXX too big */ MIDI::byte buf[bufsize]; int32_t bsize = bufsize; MIDI::byte* end = buf; @@ -174,7 +182,14 @@ GenericMidiControlProtocol::stop_learning (Controllable* c) XMLNode& GenericMidiControlProtocol::get_state () { - XMLNode* node = new XMLNode (_name); /* node name must match protocol name */ + XMLNode* node = new XMLNode ("Protocol"); + char buf[32]; + + node->add_property (X_("name"), _name); + node->add_property (X_("feedback"), do_feedback ? "1" : "0"); + snprintf (buf, sizeof (buf), "%" PRIu64, _feedback_interval); + node->add_property (X_("feedback_interval"), buf); + XMLNode* children = new XMLNode (X_("controls")); node->add_child_nocopy (*children); @@ -192,6 +207,22 @@ GenericMidiControlProtocol::set_state (const XMLNode& node) { XMLNodeList nlist; XMLNodeConstIterator niter; + const XMLProperty* prop; + + if ((prop = node.property ("feedback")) != 0) { + do_feedback = (bool) atoi (prop->value().c_str()); + } else { + do_feedback = false; + } + + if ((prop = node.property ("feedback_interval")) != 0) { + if (sscanf (prop->value().c_str(), "%" PRIu64, &_feedback_interval) != 1) { + _feedback_interval = 10000; + } + } else { + _feedback_interval = 10000; + } + Controllable* c; { @@ -213,22 +244,39 @@ GenericMidiControlProtocol::set_state (const XMLNode& node) for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - XMLProperty* prop; - if ((prop = (*niter)->property ("id")) != 0) { - + ID id = prop->value (); - + c = session->controllable_by_id (id); - + if (c) { MIDIControllable* mc = new MIDIControllable (*_port, *c); if (mc->set_state (**niter) == 0) { controllables.insert (mc); } + + } else { + warning << string_compose (_("Generic MIDI control: controllable %1 not found in session (ignored)"), + id) + << endmsg; } } } - + + return 0; +} + +int +GenericMidiControlProtocol::set_feedback (bool yn) +{ + do_feedback = yn; + last_feedback_time = 0; return 0; } + +bool +GenericMidiControlProtocol::get_feedback () const +{ + return do_feedback; +} diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index 5f5a470b13..6fba16bccd 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -32,6 +32,9 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { MIDI::Port* port () const { return _port; } void set_feedback_interval (ARDOUR::microseconds_t); + int set_feedback (bool yn); + bool get_feedback () const; + XMLNode& get_state (); int set_state (const XMLNode&); @@ -40,6 +43,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { ARDOUR::microseconds_t _feedback_interval; ARDOUR::microseconds_t last_feedback_time; + bool do_feedback; void _send_feedback (); void send_feedback (); diff --git a/libs/surfaces/generic_midi/interface.cc b/libs/surfaces/generic_midi/interface.cc index 230be694f2..c70b5b6b61 100644 --- a/libs/surfaces/generic_midi/interface.cc +++ b/libs/surfaces/generic_midi/interface.cc @@ -42,6 +42,7 @@ static ControlProtocolDescriptor generic_midi_descriptor = { ptr : 0, module : 0, mandatory : 0, + supports_feedback : true, probe : probe_generic_midi_protocol, initialize : new_generic_midi_protocol, destroy : delete_generic_midi_protocol diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index aa3fd3e252..6dc9bde8ad 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -345,6 +345,8 @@ MIDIControllable::set_state (const XMLNode& node) return -1; } + bind_midi (control_channel, control_type, control_additional); + return 0; } diff --git a/libs/surfaces/tranzport/interface.cc b/libs/surfaces/tranzport/interface.cc index 29a0fde043..f6d0dc8206 100644 --- a/libs/surfaces/tranzport/interface.cc +++ b/libs/surfaces/tranzport/interface.cc @@ -35,6 +35,7 @@ static ControlProtocolDescriptor tranzport_descriptor = { ptr : 0, module : 0, mandatory : 0, + supports_feedback : false, probe : probe_tranzport_protocol, initialize : new_tranzport_protocol, destroy : delete_tranzport_protocol diff --git a/libs/surfaces/tranzport/tranzport_control_protocol.cc b/libs/surfaces/tranzport/tranzport_control_protocol.cc index 426c837b2f..2e2d943244 100644 --- a/libs/surfaces/tranzport/tranzport_control_protocol.cc +++ b/libs/surfaces/tranzport/tranzport_control_protocol.cc @@ -320,7 +320,7 @@ TranzportControlProtocol::show_meter () void TranzportControlProtocol::show_transport_time () { - jack_nframes_t where = session->transport_frame(); + nframes_t where = session->transport_frame(); if (where != last_where) { @@ -718,13 +718,13 @@ TranzportControlProtocol::update_state () /* global */ - if (session->get_auto_loop()) { + if (Config->get_auto_loop()) { pending_lights[LightLoop] = true; } else { pending_lights[LightLoop] = false; } - if (session->get_punch_in() || session->get_punch_out()) { + if (Config->get_punch_in() || Config->get_punch_out()) { pending_lights[LightPunch] = true; } else { pending_lights[LightPunch] = false; @@ -1577,7 +1577,8 @@ TranzportControlProtocol::print (int row, int col, const char *text) XMLNode& TranzportControlProtocol::get_state () { - XMLNode* node = new XMLNode (_name); /* node name must match protocol name */ + XMLNode* node = new XMLNode (X_("Protocol")); + node->add_property (X_("name"), _name); return *node; } diff --git a/libs/surfaces/tranzport/tranzport_control_protocol.h b/libs/surfaces/tranzport/tranzport_control_protocol.h index e6e1a83e46..e5193a761c 100644 --- a/libs/surfaces/tranzport/tranzport_control_protocol.h +++ b/libs/surfaces/tranzport/tranzport_control_protocol.h @@ -110,7 +110,7 @@ class TranzportControlProtocol : public ARDOUR::ControlProtocol uint32_t last_mins; uint32_t last_secs; uint32_t last_frames; - jack_nframes_t last_where; + nframes_t last_where; ARDOUR::gain_t last_track_gain; uint32_t last_meter_fill; struct timeval last_wheel_motion; |