Mackie Control, Fix sends after monitor not showing.
[ardour.git] / libs / surfaces / mackie / mackie_control_protocol.cc
index 8c9d44481941e9a0b0571b2520bfc8453596fcff..ea5e43d2babc30abb9e37204660bd4c4374c3383 100644 (file)
@@ -105,7 +105,7 @@ bool MackieControlProtocol::probe()
 
 MackieControlProtocol::MackieControlProtocol (Session& session)
        : ControlProtocol (session, X_("Mackie"))
-       , AbstractUI<MackieControlUIRequest> ("mackie")
+       , AbstractUI<MackieControlUIRequest> (name())
        , _current_initial_bank (0)
        , _frame_last (0)
        , _timecode_type (ARDOUR::AnyTime::BBT)
@@ -183,10 +183,10 @@ MackieControlProtocol::thread_init ()
 {
        struct sched_param rtparam;
 
-       pthread_set_name (X_("MackieControl"));
+       pthread_set_name (event_loop_name().c_str());
 
-       PBD::notify_gui_about_thread_creation (X_("gui"), pthread_self(), X_("MackieControl"), 2048);
-       ARDOUR::SessionEvent::create_per_thread_pool (X_("MackieControl"), 128);
+       PBD::notify_event_loops_about_thread_creation (pthread_self(), event_loop_name(), 2048);
+       ARDOUR::SessionEvent::create_per_thread_pool (event_loop_name(), 128);
 
        memset (&rtparam, 0, sizeof (rtparam));
        rtparam.sched_priority = 9; /* XXX should be relative to audio (JACK) thread */
@@ -312,10 +312,12 @@ MackieControlProtocol::get_sorted_routes()
                        break;
                case Busses:
                        if (Profile->get_mixbus()) {
+#ifdef MIXBUS
                                if (route->mixbus()) {
                                        sorted.push_back (route);
                                        remote_ids.insert (route->remote_control_id());
                                }
+#endif                         
                        } else {
                                if (!is_track(route)) {
                                        if (route->route_group()) {
@@ -1316,6 +1318,9 @@ MackieControlProtocol::notify_transport_state_changed()
        update_global_button (Button::Rewind, session->transport_speed() < 0.0);
        update_global_button (Button::Ffwd, session->transport_speed() > 1.0);
 
+       // sometimes a return to start leaves time code at old time
+       _timecode_last = string (10, ' ');
+
        notify_metering_state_changed ();
 }
 
@@ -1618,18 +1623,35 @@ MackieControlProtocol::clear_ports ()
        }
 }
 
+void
+MackieControlProtocol::notify_subview_route_deleted ()
+{
+       /* return to global/mixer view */
+       _subview_route.reset ();
+       set_view_mode (Mixer);
+}
+
 void
 MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r)
 {
-       SubViewMode old = _subview_mode;
+       SubViewMode old_mode = _subview_mode;
+       boost::shared_ptr<Route> old_route = _subview_route;
 
        _subview_mode = sm;
 
        if (r) {
-               _subview_route = r;
+               /* retain _subview_route even if it is reset to null implicitly */
+               _subview_route = r;
        }
 
-       if (_subview_mode != old) {
+       if ((_subview_mode != old_mode) || (_subview_route != old_route)) {
+
+               if (r != old_route) {
+                       subview_route_connections.drop_connections ();
+                       if (_subview_route) {
+                               _subview_route->DropReferences.connect (subview_route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_subview_route_deleted, this), this);
+                       }
+               }
 
                /* subview mode did actually change */
 
@@ -1642,18 +1664,35 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
                        }
 
                        for (Surfaces::iterator s = copy.begin(); s != copy.end(); ++s) {
-                       (*s)->subview_mode_changed ();
+                               (*s)->subview_mode_changed ();
                        }
                }
 
-               /* turn buttons related to vpot mode on or off as required */
+               if (_subview_mode != old_mode) {
 
-               if (_subview_mode != None) {
-                       update_global_button (Button::Trim, off);
-                       update_global_button (Button::Send, off);
-                       update_global_button (Button::Pan, off);
-               } else {
-                       pot_mode_globals ();
+                       /* turn buttons related to vpot mode on or off as required */
+
+                       switch (_subview_mode) {
+                       case MackieControlProtocol::None:
+                               pot_mode_globals ();
+                               break;
+                       case MackieControlProtocol::EQ:
+                               update_global_button (Button::Eq, on);
+                               update_global_button (Button::Dyn, off);
+                               update_global_button (Button::AudioInstruments, off); /* faking up Dyn */
+                               update_global_button (Button::Trim, off);
+                               update_global_button (Button::Send, off);
+                               update_global_button (Button::Pan, off);
+                               break;
+                       case MackieControlProtocol::Dynamics:
+                               update_global_button (Button::Eq, off);
+                               update_global_button (Button::Dyn, on);
+                               update_global_button (Button::AudioInstruments, on); /* faking up Dyn */
+                               update_global_button (Button::Trim, off);
+                               update_global_button (Button::Send, off);
+                               update_global_button (Button::Pan, off);
+                               break;
+                       }
                }
        }
 }
@@ -1667,6 +1706,7 @@ MackieControlProtocol::set_view_mode (ViewMode m)
        set_subview_mode (None, boost::shared_ptr<Route>());
 
        switch_banks(_last_bank[_view_mode], true);
+       display_view_mode ();
 }
 
 void
@@ -1728,6 +1768,7 @@ MackieControlProtocol::pot_mode_globals ()
 {
        update_global_button (Button::Eq, off);
        update_global_button (Button::Dyn, off);
+       update_global_button (Button::AudioInstruments, off);
 
        switch (_pot_mode) {
        case Trim:
@@ -2210,3 +2251,14 @@ MackieControlProtocol::global_index (Strip& strip)
 
        return global;
 }
+
+void*
+MackieControlProtocol::request_factory (uint32_t num_requests)
+{
+       /* AbstractUI<T>::request_buffer_factory() is a template method only
+          instantiated in this source module. To provide something visible for
+          use in the interface/descriptor, we have this static method that is
+          template-free.
+       */
+       return request_buffer_factory (num_requests);
+}