}
else if (!strncmp (path, X_("/select/group/sharing"), 21)) {
if (argc == 9) {
- rg->set_gain ((bool) argv[0]->i);
- rg->set_relative ((bool) argv[1]->i, this);
- rg->set_mute ((bool) argv[2]->i);
- rg->set_solo ((bool) argv[3]->i);
- rg->set_recenable ((bool) argv[4]->i);
- rg->set_select ((bool) argv[5]->i);
- rg->set_route_active ((bool) argv[6]->i);
- rg->set_color ((bool) argv[7]->i);
- rg->set_monitoring ((bool) argv[8]->i);
+ if (rg->is_gain() != (bool) argv[0]->i) {
+ rg->set_gain ((bool) argv[0]->i);
+ }
+ if (rg->is_relative() != (bool) argv[1]->i) {
+ rg->set_relative ((bool) argv[1]->i, this);
+ }
+ if (rg->is_mute() != (bool) argv[2]->i) {
+ rg->set_mute ((bool) argv[2]->i);
+ }
+ if (rg->is_solo() != (bool) argv[3]->i) {
+ rg->set_solo ((bool) argv[3]->i);
+ }
+ if (rg->is_recenable() != (bool) argv[4]->i) {
+ rg->set_recenable ((bool) argv[4]->i);
+ }
+ if (rg->is_select() != (bool) argv[5]->i) {
+ rg->set_select ((bool) argv[5]->i);
+ }
+ if (rg->is_route_active() != (bool) argv[6]->i) {
+ rg->set_route_active ((bool) argv[6]->i);
+ }
+ if (rg->is_color() != (bool) argv[7]->i) {
+ rg->set_color ((bool) argv[7]->i);
+ }
+ if (rg->is_monitoring() != (bool) argv[8]->i) {
+ rg->set_monitoring ((bool) argv[8]->i);
+ }
+ ret = 0;
} else {
PBD::warning << "OSC: Sharing can only be set if all 9 parameters are sent." << endmsg;
}
if (so != 0) {
so->refresh_strip (s, nsends, sur->gainmode, true);
} else {
- OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, sur);
+ OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, *session, sur);
sur->sel_obs = sel_fb;
}
sur->sel_obs->set_expand (sur->expand_enable);
#include "ardour/solo_safe_control.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
+#include "ardour/route_group_member.h"
#include "ardour/send.h"
#include "ardour/plugin.h"
#include "ardour/plugin_insert.h"
using namespace ARDOUR;
using namespace ArdourSurface;
-OSCSelectObserver::OSCSelectObserver (OSC& o, ArdourSurface::OSC::OSCSurface* su)
+OSCSelectObserver::OSCSelectObserver (OSC& o, ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* su)
: _osc (o)
,sur (su)
,nsends (0)
,eq_bands (0)
,_expand (2048)
{
+ session = &s;
addr = lo_address_new_from_url (sur->remote_url.c_str());
gainmode = sur->gainmode;
feedback = sur->feedback;
rt->comment_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::comment_changed, this), OSC::instance());
comment_changed ();
+
+ session->RouteGroupPropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::group_sharing, this, _1), OSC::instance());
+ group_sharing (rt->route_group ());
}
_strip->presentation_info().PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::pi_changed, this, _1), OSC::instance());
}
}
+void
+OSCSelectObserver::group_sharing (RouteGroup *rgc)
+{
+ boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (_strip);
+ if (rt) {
+ RouteGroup *rg = rt->route_group();
+ if (rg) {
+ if (rg != rgc) {
+ return;
+ }
+ lo_message reply = lo_message_new ();
+ lo_message_add_int32 (reply, rg->is_gain ());
+ lo_message_add_int32 (reply, rg->is_relative ());
+ lo_message_add_int32 (reply, rg->is_mute ());
+ lo_message_add_int32 (reply, rg->is_solo ());
+ lo_message_add_int32 (reply, rg->is_recenable ());
+ lo_message_add_int32 (reply, rg->is_select ());
+ lo_message_add_int32 (reply, rg->is_route_active ());
+ lo_message_add_int32 (reply, rg->is_color ());
+ lo_message_add_int32 (reply, rg->is_monitoring ());
+ lo_send_message (addr, "/select/group/sharing", reply);
+ lo_message_free (reply);
+ }
+ }
+
+
+}
+
void
OSCSelectObserver::comment_changed ()
{
void
OSCSelectObserver::pi_changed (PBD::PropertyChange const& what_changed)
{
+ if (!what_changed.contains (ARDOUR::Properties::hidden)) {
+ return;
+ }
_osc.float_message (X_("/select/hide"), _strip->is_hidden (), addr);
}
{
public:
- OSCSelectObserver (ArdourSurface::OSC& o, ArdourSurface::OSC::OSCSurface* sur);
+ OSCSelectObserver (ArdourSurface::OSC& o, ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* sur);
~OSCSelectObserver ();
boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
int eq_bands;
bool _tick_busy;
uint32_t _expand;
+ ARDOUR::Session* session;
void name_changed (const PBD::PropertyChange& what_changed);
void group_name ();
+ void group_sharing (ARDOUR::RouteGroup *rg_c);
void comment_changed ();
void pi_changed (PBD::PropertyChange const&);
void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);