summaryrefslogtreecommitdiff
path: root/libs/surfaces
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces')
-rw-r--r--libs/surfaces/control_protocol/basic_ui.cc29
-rw-r--r--libs/surfaces/control_protocol/control_protocol/control_protocol.h4
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.cc66
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.h4
-rw-r--r--libs/surfaces/generic_midi/interface.cc1
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc2
-rw-r--r--libs/surfaces/tranzport/interface.cc1
-rw-r--r--libs/surfaces/tranzport/tranzport_control_protocol.cc9
-rw-r--r--libs/surfaces/tranzport/tranzport_control_protocol.h2
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;