From e1ea14f10ada28fbf48019fef96de78c8f8df393 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 25 Nov 2015 17:20:00 -0500 Subject: [PATCH] faderport: handle mute for monitor out by using monitor processor ops; try to blink mute button when cut-all is in effect. Still some logic bugs when switching between master, monitor and other --- libs/surfaces/faderport/faderport.cc | 28 ++++++++++++++++++++++++++- libs/surfaces/faderport/faderport.h | 1 + libs/surfaces/faderport/operations.cc | 11 +++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/libs/surfaces/faderport/faderport.cc b/libs/surfaces/faderport/faderport.cc index e8e68475ff..381f893174 100644 --- a/libs/surfaces/faderport/faderport.cc +++ b/libs/surfaces/faderport/faderport.cc @@ -43,6 +43,7 @@ #include "ardour/filesystem_paths.h" #include "ardour/midi_port.h" #include "ardour/midiport_manager.h" +#include "ardour/monitor_processor.h" #include "ardour/rc_configuration.h" #include "ardour/route.h" #include "ardour/session.h" @@ -784,11 +785,34 @@ FaderPort::set_current_route (boost::shared_ptr r) if (control) { control->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_gain, this), this); } + + boost::shared_ptr mp = _current_route->monitor_control(); + if (mp) { + mp->cut_control()->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this); + } } map_route_state (); } +void +FaderPort::map_cut () +{ + boost::shared_ptr mp = _current_route->monitor_control(); + + if (mp) { + bool yn = mp->cut_all (); + button_info (Mute).set_led_state (_output_port, yn); + if (yn) { + blinkers.push_back (Mute); + } else { + blinkers.remove (Mute); + } + } else { + blinkers.remove (Mute); + } +} + void FaderPort::map_mute (void*) { @@ -875,12 +899,14 @@ FaderPort::map_route_state () button_info (Mute).set_led_state (_output_port, false); button_info (Solo).set_led_state (_output_port, false); button_info (Rec).set_led_state (_output_port, false); + blinkers.remove (Mute); + blinkers.remove (Solo); } else { /* arguments to these map_*() methods are all ignored */ map_mute (0); map_solo (false, 0, false); map_recenable (); - map_gain (); + map_cut (); } } diff --git a/libs/surfaces/faderport/faderport.h b/libs/surfaces/faderport/faderport.h index d733012ea7..cec673c743 100644 --- a/libs/surfaces/faderport/faderport.h +++ b/libs/surfaces/faderport/faderport.h @@ -260,6 +260,7 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUImonitor_out() || r == session->master_out()) { + if (r == session->monitor_out()) { button_info(Output).set_led_state (_output_port, true); + blinkers.push_back (Output); } else { button_info(Output).set_led_state (_output_port, false); + blinkers.remove (Output); } } else { pre_master_route = boost::weak_ptr (_current_route); set_current_route (r); button_info(Output).set_led_state (_output_port, true); + blinkers.remove (Output); } } } @@ -119,19 +122,23 @@ void FaderPort::use_monitor () { boost::shared_ptr r = session->monitor_out(); + if (r) { if (_current_route == r) { r = pre_monitor_route.lock(); set_current_route (r); - if (r == session->monitor_out() || r == session->master_out()) { + if (r == session->master_out()) { button_info(Output).set_led_state (_output_port, true); } else { button_info(Output).set_led_state (_output_port, false); } + blinkers.remove (Output); } else { pre_monitor_route = boost::weak_ptr (_current_route); set_current_route (r); button_info(Output).set_led_state (_output_port, true); + blinkers.push_back (Output); } + } else { } }