13
0

OSC: Bug fix for no monitor, bug fix heart beat on turned global feedback on.

Start select code.
This commit is contained in:
Len Ovens 2016-06-04 07:04:32 -07:00
parent fa50cf50d1
commit 3f336f2021
5 changed files with 190 additions and 78 deletions

View File

@ -487,6 +487,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
REGISTER_CALLBACK (serv, "/monitor/fader", "i", monitor_set_fader);
REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
REGISTER_CALLBACK (serv, "/select/record_safe", "ii", sel_recsafe);
/* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */
@ -496,6 +498,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/strip/record_safe", "ii", route_recsafe);
REGISTER_CALLBACK (serv, "/strip/monitor_input", "ii", route_monitor_input);
REGISTER_CALLBACK (serv, "/strip/monitor_disk", "ii", route_monitor_disk);
REGISTER_CALLBACK (serv, "/strip/select", "ii", strip_select);
REGISTER_CALLBACK (serv, "/strip/gui_select", "ii", strip_gui_select);
REGISTER_CALLBACK (serv, "/strip/gain", "if", route_set_gain_dB);
REGISTER_CALLBACK (serv, "/strip/fader", "if", route_set_gain_fader);
REGISTER_CALLBACK (serv, "/strip/trimabs", "if", route_set_trim_abs);
@ -503,6 +507,7 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/strip/pan_stereo_position", "if", route_set_pan_stereo_position);
REGISTER_CALLBACK (serv, "/strip/pan_stereo_width", "if", route_set_pan_stereo_width);
REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter);
// prints to cerr only
REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print);
REGISTER_CALLBACK (serv, "/strip/send/gainabs", "iif", route_set_send_gain_abs);
REGISTER_CALLBACK (serv, "/strip/send/gaindB", "iif", route_set_send_gain_dB);
@ -832,6 +837,16 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
route_recsafe (ssid, argv[0]->f == 1.0, msg);
ret = 0;
}
else if (!strncmp (path, "/strip/select/", 14) && strlen (path) > 14) {
int ssid = atoi (&path[14]);
strip_select (ssid, argv[0]->f == 1.0, msg);
ret = 0;
}
else if (!strncmp (path, "/strip/gui_select/", 18) && strlen (path) > 18) {
int ssid = atoi (&path[18]);
strip_gui_select (ssid, argv[0]->f == 1.0, msg);
ret = 0;
}
}
if ((ret && _debugmode == Unhandled)) {
@ -1385,10 +1400,6 @@ OSC::master_set_pan_stereo_position (float position)
if (s->pan_azimuth_control()) {
s->pan_azimuth_control()->set_value (position, PBD::Controllable::NoGroup);
}
/*boost::shared_ptr<PBD::Controllable> panner = s->pan_azimuth_control();
if (panner) {
panner->set_value (position, PBD::Controllable::NoGroup);
}*/
}
return 0;
@ -1470,6 +1481,13 @@ OSC::route_solo (int ssid, int yn, lo_message msg)
return 0;
}
int
OSC::sel_recenable (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
return route_recenable(sur->surface_sel, yn, msg);
}
int
OSC::route_recenable (int ssid, int yn, lo_message msg)
{
@ -1490,6 +1508,13 @@ OSC::route_recenable (int ssid, int yn, lo_message msg)
return route_send_fail ("/strip/recenable", ssid, msg);
}
int
OSC::sel_recsafe (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
return route_recsafe(sur->surface_sel, yn, msg);
}
int
OSC::route_recsafe (int ssid, int yn, lo_message msg)
{
@ -1551,6 +1576,54 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
return 0;
}
int
OSC::strip_select (int ssid, int yn, lo_message msg)
{
//ignore button release
if (!yn) return 0;
if (!session) {
route_send_fail ("/strip/select", ssid, msg);
return -1;
}
int rid = get_rid (ssid, lo_message_get_source (msg));
boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
OSCSurface *sur = get_surface(lo_message_get_source (msg));
sur->surface_sel = ssid;
if (s) {
sur->sel = s;
} else {
route_send_fail ("/strip/select", ssid, msg);
}
return 0;
}
int
OSC::strip_gui_select (int ssid, int yn, lo_message msg)
{
//ignore button release
if (!yn) return 0;
if (!session) {
route_send_fail ("/strip/gui_select", ssid, msg);
return -1;
}
int rid = get_rid (ssid, lo_message_get_source (msg));
boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
OSCSurface *sur = get_surface(lo_message_get_source (msg));
sur->surface_sel = ssid;
if (s) {
sur->sel = s;
} else {
route_send_fail ("/strip/gui_select", ssid, msg);
}
return 0;
}
int
OSC::route_set_gain_abs (int rid, float level, lo_message msg)
{
@ -1741,6 +1814,7 @@ OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message
return 0;
}
//prints to cerr only
int
OSC::route_plugin_parameter_print (int ssid, int piid, int par, lo_message msg)
{

View File

@ -98,17 +98,19 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
// keep a surface's global setup by remote server url
struct OSCSurface {
public:
std::string remote_url; // the url these setting belong to
uint32_t bank; // current bank
uint32_t bank_size; // size of banks for this surface
std::bitset<32> strip_types; // what strip types are a part of this bank
std::bitset<32> feedback; // What is fed back? strips/meters/timecode/bar_beat/global
int gainmode; // what kind of faders do we have Gain db or position 0 to 1023?
uint32_t surface_sel; // which strip within the bank is locally selected
std::string remote_url; // the url these setting belong to
uint32_t bank; // current bank
uint32_t bank_size; // size of banks for this surface
std::bitset<32> strip_types; // what strip types are a part of this bank
std::bitset<32> feedback; // What is fed back? strips/meters/timecode/bar_beat/global
int gainmode; // what kind of faders do we have Gain db or position 0 to 1023?
boost::shared_ptr<ARDOUR::Stripable> sel; //
uint32_t surface_sel; // which strip within the bank is locally selected
//StripableList strips; //list of stripables for the current bank
};
/*
* Reminder of what strip_types there are
* XXX these have changed!!!
AudioTrack = 0x1,
MidiTrack = 0x2,
AudioBus = 0x4,
@ -132,6 +134,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
* [7] - Send metering as dB or positional depending on gainmode
* [8] - Send metering as 16 bits (led strip)
* [9] - Send signal present (signal greater than -20dB)
* [10] - Selection is local
*/
@ -322,6 +325,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK1_MSG(set_surface_strip_types,i);
PATH_CALLBACK1_MSG(set_surface_feedback,i);
PATH_CALLBACK1_MSG(set_surface_gainmode,i);
PATH_CALLBACK1_MSG(sel_recenable,i);
PATH_CALLBACK1_MSG(sel_recsafe,i);
#define PATH_CALLBACK2(name,arg1type,arg2type) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@ -380,6 +385,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK2_MSG(route_recsafe,i,i);
PATH_CALLBACK2_MSG(route_monitor_input,i,i);
PATH_CALLBACK2_MSG(route_monitor_disk,i,i);
PATH_CALLBACK2_MSG(strip_select,i,i);
PATH_CALLBACK2_MSG(strip_gui_select,i,i);
PATH_CALLBACK2_MSG(route_set_gain_abs,i,f);
PATH_CALLBACK2_MSG(route_set_gain_dB,i,f);
PATH_CALLBACK2_MSG(route_set_gain_fader,i,f);
@ -398,6 +405,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int route_recsafe (int ssid, int yn, lo_message msg);
int route_monitor_input (int rid, int yn, lo_message msg);
int route_monitor_disk (int rid, int yn, lo_message msg);
int strip_select (int rid, int yn, lo_message msg);
int strip_gui_select (int rid, int yn, lo_message msg);
int route_set_gain_abs (int rid, float level, lo_message msg);
int route_set_gain_dB (int rid, float dB, lo_message msg);
int route_set_gain_fader (int rid, float pos, lo_message msg);
@ -427,6 +436,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int master_set_mute (uint32_t state);
int monitor_set_gain (float dB);
int monitor_set_fader (uint32_t position);
int sel_recenable (uint32_t state, lo_message msg);
int sel_recsafe (uint32_t state, lo_message msg);
void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);

View File

@ -37,85 +37,89 @@ OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std
: gainmode (gm)
,feedback (fb)
{
if (feedback[4]) {
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
session = &s;
_last_frame = -1;
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
session = &s;
_last_frame = -1;
// connect to all the things we want to send feed back from
// connect to all the things we want to send feed back from
/*
* Master (todo)
* Pan width
*/
/*
* Master (todo)
* Pan width
*/
// Master channel first
boost::shared_ptr<Stripable> strip = session->master_out();
// Master channel first
boost::shared_ptr<Stripable> strip = session->master_out();
boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
send_change_message ("/master/mute", strip->mute_control());
boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
send_change_message ("/master/mute", strip->mute_control());
boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
send_trim_message ("/master/trimdB", strip->trim_control());
boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
send_change_message ("/master/pan_stereo_position", strip->pan_azimuth_control());
boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
if (gainmode) {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
send_gain_message ("/master/fader", strip->gain_control());
} else {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
send_gain_message ("/master/gain", strip->gain_control());
boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
if (gainmode) {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
send_gain_message ("/master/fader", strip->gain_control());
} else {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
send_gain_message ("/master/gain", strip->gain_control());
}
// monitor stuff next
/*
* Monitor (todo)
* Mute
* Dim
* Mono
* Rude Solo
* etc.
*/
strip = session->monitor_out();
if (strip) {
// Hmm, it seems the monitor mute is not at route->mute_control()
/*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
//mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
send_change_message ("/monitor/mute", strip->mute_control());
*/
gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
if (gainmode) {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
send_gain_message ("/monitor/fader", strip->gain_control());
} else {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
send_gain_message ("/monitor/gain", strip->gain_control());
}
}
/*
* Transport (todo)
* punchin/out
*/
//Transport feedback
session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
send_transport_state_changed ();
session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
send_record_state_changed ();
// session feedback
session->StateSaved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_session_saved, this, _1), OSC::instance());
send_session_saved (session->snap_name());
/*
* Maybe (many) more
*/
}
// monitor stuff next
/*
* Monitor (todo)
* Mute
* Dim
* Mono
* Rude Solo
* etc.
*/
strip = session->monitor_out();
// Hmm, it seems the monitor mute is not at route->mute_control()
/*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
//mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
send_change_message ("/monitor/mute", strip->mute_control());
*/
gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
if (gainmode) {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
send_gain_message ("/monitor/fader", strip->gain_control());
} else {
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
send_gain_message ("/monitor/gain", strip->gain_control());
}
/*
* Transport (todo)
* punchin/out
*/
//Transport feedback
session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
send_transport_state_changed ();
session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
send_record_state_changed ();
// session feedback
session->StateSaved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_session_saved, this, _1), OSC::instance());
send_session_saved (session->snap_name());
/*
* Maybe (many) more
*/
}
OSCGlobalObserver::~OSCGlobalObserver ()

View File

@ -69,6 +69,7 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, lo_address a
recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/record_safe"), _strip->rec_safe_control()), OSC::instance());
send_change_message ("/strip/record_safe", _strip->rec_safe_control());
}
send_select_status ();
}
if (feedback[1]) { // level controls
@ -119,6 +120,7 @@ OSCRouteObserver::~OSCRouteObserver ()
clear_strip ("/strip/record_safe", 0);
clear_strip ("/strip/monitor_input", 0);
clear_strip ("/strip/monitor_disk", 0);
clear_strip ("/strip/gui_select", 0);
}
if (feedback[1]) { // level controls
if (gainmode) {
@ -359,3 +361,23 @@ OSCRouteObserver::clear_strip (string path, float val)
lo_message_free (msg);
}
void
OSCRouteObserver::send_select_status ()
{
// waiting for _strip->is_selected to start working
if (_strip) {
string path = "/strip/gui_select";
lo_message msg = lo_message_new ();
if (feedback[2]) {
path = set_path (path);
} else {
lo_message_add_int32 (msg, ssid);
}
//std::cout << "strip: " << ssid << " strip name: " << _strip->name() << " select: " << _strip->is_selected() << "\n";
lo_message_add_float (msg, _strip->is_selected());
lo_send_message (addr, path.c_str(), msg);
lo_message_free (msg);
}
}

View File

@ -40,6 +40,7 @@ class OSCRouteObserver
boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
lo_address address() const { return addr; };
void tick (void);
void send_select_status (void);
private:
boost::shared_ptr<ARDOUR::Stripable> _strip;