From 2484291254a949e42ab2cd1ce3595da3629cba05 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 11 Feb 2011 16:14:54 +0000 Subject: [PATCH] provide solo mute gain Config parameter as a controllable and use it in the monitor section GUI to allow MIDI binding git-svn-id: svn://localhost/ardour2/branches/3.0@8825 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/monitor_section.cc | 21 ++++++++------ gtk2_ardour/monitor_section.h | 4 +-- gtk2_ardour/volume_controller.cc | 43 ---------------------------- gtk2_ardour/volume_controller.h | 48 -------------------------------- gtk2_ardour/wscript | 1 - libs/ardour/ardour/session.h | 4 +++ libs/ardour/session.cc | 4 +-- libs/ardour/session_state.cc | 20 +++++++++++++ 8 files changed, 39 insertions(+), 106 deletions(-) delete mode 100644 gtk2_ardour/volume_controller.cc delete mode 100644 gtk2_ardour/volume_controller.h diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc index c281b0ccaf..1830933048 100644 --- a/gtk2_ardour/monitor_section.cc +++ b/gtk2_ardour/monitor_section.cc @@ -18,7 +18,6 @@ #include "monitor_section.h" #include "public_editor.h" #include "utils.h" -#include "volume_controller.h" #include "i18n.h" @@ -155,7 +154,7 @@ MonitorSection::MonitorSection (Session* s) /* Solo (SiP) cut */ - solo_cut_control = new VolumeController (little_knob_pixbuf, &solo_cut_adjustment, false, 30, 30); + solo_cut_control = new MotionFeedback (little_knob_pixbuf, MotionFeedback::Rotary, "", &solo_cut_adjustment, false, 30, 30); spin_label = manage (new Label (_("SiP Cut"))); spin_packer = manage (new VBox); @@ -310,25 +309,26 @@ MonitorSection::set_session (Session* s) _route = _session->monitor_out (); if (_route) { - /* session with control outs */ + /* session with monitor section */ _monitor = _route->monitor_control (); assign_controllables (); } else { - /* session with no control outs */ + /* session with no monitor section */ _monitor.reset (); _route.reset (); } } else { /* no session */ + _monitor.reset (); _route.reset (); control_connections.drop_connections (); rude_iso_button.set_active (false); rude_solo_button.set_active (false); - } - /* both might be null */ + assign_controllables (); + } } MonitorSection::ChannelButtonSet::ChannelButtonSet () @@ -628,9 +628,6 @@ MonitorSection::register_actions () tact = Glib::RefPtr::cast_dynamic(act); tact->set_active (Config->get_solo_mute_override()); - /* map from RC config */ - - /* note the 1-based counting (for naming - backend uses 0-based) */ @@ -1014,6 +1011,12 @@ MonitorSection::assign_controllables () return; } + if (_session) { + solo_cut_control->set_controllable (_session->solo_cut_control()); + } else { + solo_cut_control->set_controllable (none); + } + if (_route) { gain_control->set_controllable (_route->gain_control()); control_link (control_connections, _route->gain_control(), gain_adjustment); diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h index bc502d9979..462cdbc80b 100644 --- a/gtk2_ardour/monitor_section.h +++ b/gtk2_ardour/monitor_section.h @@ -31,8 +31,6 @@ namespace Gtkmm2ext { class MotionFeedback; } -class VolumeController; - class MonitorSection : public RouteUI { public: @@ -71,7 +69,7 @@ class MonitorSection : public RouteUI Gtk::Adjustment solo_boost_adjustment; Gtkmm2ext::MotionFeedback* solo_boost_control; Gtk::Adjustment solo_cut_adjustment; - VolumeController* solo_cut_control; + Gtkmm2ext::MotionFeedback* solo_cut_control; void populate_buttons (); void set_button_names (); diff --git a/gtk2_ardour/volume_controller.cc b/gtk2_ardour/volume_controller.cc deleted file mode 100644 index 8cf6e68620..0000000000 --- a/gtk2_ardour/volume_controller.cc +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright (C) 1998-2007 Paul Davis - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id: volume_controller.cc,v 1.4 2000/05/03 15:54:21 pbd Exp $ -*/ - -#include -#include - -#include "volume_controller.h" - -using namespace Gtk; - -VolumeController::VolumeController (Glib::RefPtr p, - Gtk::Adjustment *adj, - bool with_numeric, - int subw, int subh) - - : MotionFeedback (p, MotionFeedback::Rotary, "", adj, with_numeric, subw, subh) -{ - get_adjustment()->signal_value_changed().connect (mem_fun (*this,&VolumeController::adjustment_value_changed)); -} - -void -VolumeController::adjustment_value_changed () -{ - -} - - diff --git a/gtk2_ardour/volume_controller.h b/gtk2_ardour/volume_controller.h deleted file mode 100644 index f348b00210..0000000000 --- a/gtk2_ardour/volume_controller.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Copyright (C) 1998-2007 Paul Davis - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id: volume_controller.h,v 1.4 2000/05/03 15:54:21 pbd Exp $ -*/ - -#ifndef __gtk_ardour_vol_controller_h__ -#define __gtk_ardour_vol_controller_h__ - -#include - -#include "gtkmm2ext/motionfeedback.h" - -// march 2010: this exists as a placeholder to add a controllable, but maybe it will -// end up in MotionFeedback - -class VolumeController : public Gtkmm2ext::MotionFeedback -{ - public: - VolumeController (Glib::RefPtr, - Gtk::Adjustment *adj, - bool with_numeric = true, - int image_width = 40, - int image_height = 40); - - virtual ~VolumeController () {} - - private: - Gtk::Adjustment *adjustment; - void adjustment_value_changed (); -}; - -#endif // __gtk_ardour_vol_controller_h__ - - diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index b50521ec76..503dca9bcc 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -221,7 +221,6 @@ gtk2_ardour_sources = [ 'ui_config.cc', 'utils.cc', 'version.cc', - 'volume_controller.cc', 'waveview.cc', 'window_proxy.cc' ] diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 44ab172720..0970e01b5c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -731,6 +731,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi void add_controllable (boost::shared_ptr); void remove_controllable (PBD::Controllable*); + boost::shared_ptr solo_cut_control() const; + SessionMetadata & metadata () { return *_metadata; } SessionConfiguration config; @@ -1419,6 +1421,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi Glib::Mutex controllables_lock; Controllables controllables; + boost::shared_ptr _solo_cut_control; + void reset_native_file_format(); bool first_file_data_format_reset; bool first_file_header_format_reset; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index de0076372f..da18b61681 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -136,8 +136,7 @@ Session::Session (AudioEngine &eng, const string& snapshot_name, BusProfile* bus_profile, string mix_template) - - : _engine (eng) + : _engine (eng) , _target_transport_speed (0.0) , _requested_return_frame (-1) , _session_dir (new SessionDirectory(fullpath)) @@ -4234,3 +4233,4 @@ Session::unknown_processors () const return p; } + diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 31c1c439a8..17fedfb8a4 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -95,6 +95,7 @@ #include "ardour/pannable.h" #include "ardour/processor.h" #include "ardour/port.h" +#include "ardour/proxy_controllable.h" #include "ardour/region_factory.h" #include "ardour/route_group.h" #include "ardour/send.h" @@ -270,6 +271,10 @@ Session::first_stage_init (string fullpath, string snapshot_name) delta_accumulator_cnt = 0; _slave_state = Stopped; + _solo_cut_control.reset (new ProxyControllable (_("solo cut control (dB)"), PBD::Controllable::GainLike, + boost::bind (&RCConfiguration::set_solo_mute_gain, Config, _1), + boost::bind (&RCConfiguration::get_solo_mute_gain, Config))); + _engine.GraphReordered.connect_same_thread (*this, boost::bind (&Session::graph_reordered, this)); /* These are all static "per-class" signals */ @@ -3521,3 +3526,18 @@ Session::setup_midi_machine_control () mmc->SPPContinue.connect_same_thread (*this, boost::bind (&Session::spp_continue, this, _1, _2)); mmc->SPPStop.connect_same_thread (*this, boost::bind (&Session::spp_stop, this, _1, _2)); } + +boost::shared_ptr +Session::solo_cut_control() const +{ + /* the solo cut control is a bit of an anomaly, at least as of Febrary 2011. There are no other + controls in Ardour that currently get presented to the user in the GUI that require + access as a Controllable and are also NOT owned by some SessionObject (e.g. Route, or MonitorProcessor). + + its actually an RCConfiguration parameter, so we use a ProxyControllable to wrap + it up as a Controllable. Changes to the Controllable will just map back to the RCConfiguration + parameter. + */ + + return _solo_cut_control; +}