make "exclusive solo" apply to listen as well as SiP
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 5 May 2010 15:47:51 +0000 (15:47 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 5 May 2010 15:47:51 +0000 (15:47 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7064 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/rc_option_editor.cc
libs/ardour/route.cc
libs/ardour/session.cc

index 1bc4f0a252691dd712ddb212eaa141009db25f48..a53e98871272aa437a0da6ec6edb559d89ec2689 100644 (file)
@@ -3,9 +3,13 @@
 #include <gtkmm/scale.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/slider_controller.h>
+
 #include "pbd/fpu.h"
+
 #include "midi++/manager.h"
 #include "midi++/factory.h"
+
+#include "ardour/audioengine.h"
 #include "ardour/dB.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/control_protocol_manager.h"
@@ -443,10 +447,10 @@ static const struct {
        { "Command", GDK_META_MASK },
        { "Control", GDK_CONTROL_MASK },
        { "Option", GDK_MOD1_MASK },
-       { "Command-Shift", GDK_MOD1_MASK|GDK_SHIFT_MASK },
-       { "Command-Option", GDK_MOD1_MASK|GDK_MOD5_MASK },
-       { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD5_MASK },
-       { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_MOD1_MASK },
+       { "Command-Shift", GDK_META_MASK|GDK_SHIFT_MASK },
+       { "Command-Option", GDK_MOD1_MASK|GDK_META_MASK },
+       { "Shift-Option", GDK_SHIFT_MASK|GDK_MOD1_MASK },
+       { "Shift-Command-Option", GDK_MOD5_MASK|GDK_SHIFT_MASK|GDK_META_MASK },
 
 #else
        { "Shift", GDK_SHIFT_MASK },
@@ -1234,7 +1238,12 @@ RCOptionEditor::RCOptionEditor ()
                sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model)
                );
 
-       mm->add (HardwareMonitoring, _("JACK"));
+#ifndef __APPLE__
+        /* no JACK monitoring on CoreAudio */
+        if (AudioEngine::instance()->can_request_hardware_monitoring()) {
+                mm->add (HardwareMonitoring, _("JACK"));
+        }
+#endif
        mm->add (SoftwareMonitoring, _("ardour"));
        mm->add (ExternalMonitoring, _("audio hardware"));
 
index 7bd91575149db701c307e31ada01218a5f24d751..7eeae417d90ce7238654c6f275b68cf92b2d2fef 100644 (file)
@@ -536,11 +536,14 @@ Route::set_listen (bool yn, void* src)
         }
 
        if (_monitor_send) {
+                cerr << name() << " set listen = " << yn << " current = " << _monitor_send->active() << endl;
                if (yn != _monitor_send->active()) {
                        if (yn) {
                                _monitor_send->activate ();
-                       } else {
+                                _mute_master->set_soloed (true);
+                        } else {
                                _monitor_send->deactivate ();
+                                _mute_master->set_soloed (false);
                        }
 
                        listen_changed (src); /* EMIT SIGNAL */
index 3fc0603a5bacd82fe0ad3974c53d5591fdf55bd5..0b796a32bfba9c5524a1314ff9ee21faf4d7f35a 100644 (file)
@@ -2225,8 +2225,22 @@ Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
        }
 
        if (route->listening()) {
+
+                if (Config->get_exclusive_solo()) {
+                        /* new listen: disable all other listen */
+                        shared_ptr<RouteList> r = routes.reader ();
+                        for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+                                if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
+                                        continue;
+                                } 
+                                (*i)->set_listen (false, this);
+                        }
+                }
+
                _listen_cnt++;
+
        } else if (_listen_cnt > 0) {
+
                _listen_cnt--;
        }
 }