From 325671e20afa56f5c796d14ce9bb76146a232f0b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 10 Mar 2010 17:31:16 +0000 Subject: [PATCH] how about that ... a monitor/main section .. GUI is still unfinished .. several small fixes to processor loading/listen mgmt and a few debug output lines rmeoved. knob images are provisional, and can be found in icons/knob.png and related files git-svn-id: svn://localhost/ardour2/branches/3.0@6744 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 2 +- gtk2_ardour/gain_meter.h | 1 + gtk2_ardour/icons/bigknob.png | Bin 0 -> 69192 bytes gtk2_ardour/icons/knob.png | Bin 0 -> 48086 bytes gtk2_ardour/icons/littleknob.png | Bin 0 -> 38955 bytes gtk2_ardour/level_meter.h | 4 +- gtk2_ardour/mixer_ui.cc | 23 +- gtk2_ardour/mixer_ui.h | 3 + gtk2_ardour/monitor_section.cc | 562 +++++++++++++++++++++++++ gtk2_ardour/monitor_section.h | 98 +++++ gtk2_ardour/rc_option_editor.cc | 1 + gtk2_ardour/route_ui.cc | 16 +- gtk2_ardour/wscript | 2 + libs/ardour/amp.cc | 68 ++- libs/ardour/ardour/amp.h | 3 + libs/ardour/ardour/internal_send.h | 1 + libs/ardour/ardour/monitor_processor.h | 87 ++++ libs/ardour/ardour/processor.h | 2 +- libs/ardour/ardour/route.h | 14 +- libs/ardour/ardour/session.h | 4 +- libs/ardour/monitor_processor.cc | 221 ++++++++++ libs/ardour/processor.cc | 7 +- libs/ardour/route.cc | 59 ++- libs/ardour/send.cc | 1 - libs/ardour/session.cc | 74 ++-- libs/ardour/session_midi.cc | 2 - libs/ardour/session_state.cc | 8 +- libs/ardour/wscript | 1 + libs/gtkmm2ext/wscript | 1 + 29 files changed, 1192 insertions(+), 73 deletions(-) create mode 100644 gtk2_ardour/icons/bigknob.png create mode 100644 gtk2_ardour/icons/knob.png create mode 100644 gtk2_ardour/icons/littleknob.png create mode 100644 gtk2_ardour/monitor_section.cc create mode 100644 gtk2_ardour/monitor_section.h create mode 100644 libs/ardour/ardour/monitor_processor.h create mode 100644 libs/ardour/monitor_processor.cc diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 4b97ceea2d..1c56abb47d 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -4792,7 +4792,7 @@ Editor::handle_new_route (RouteList& routes) for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) { boost::shared_ptr route = (*x); - if (route->is_hidden()) { + if (route->is_hidden() || route->is_control()) { continue; } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 7d089e2ef1..2513e4d267 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -34,6 +34,7 @@ #include "pbd/signals.h" +#include "ardour/chan_count.h" #include "ardour/types.h" #include "ardour/session_handle.h" diff --git a/gtk2_ardour/icons/bigknob.png b/gtk2_ardour/icons/bigknob.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a3f5df5625ad8b26971227487f83bacd84f2c8 GIT binary patch literal 69192 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 literal 0 HcmV?d00001 diff --git a/gtk2_ardour/icons/littleknob.png b/gtk2_ardour/icons/littleknob.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee1bc332abe090b2bf8f3ca69c0ab0520360bed GIT binary patch literal 38955 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

TfNHBMfPg$8CoUO~apL;kOe;Q>xfnFRy}ir5Z4 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 literal 0 HcmV?d00001 diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index 4b2a0cdbc9..06c7230b7c 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -74,13 +74,13 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr struct MeterInfo { Gtkmm2ext::FastMeter *meter; gint16 width; - int length; + int length; bool packed; MeterInfo() { meter = 0; width = 0; - length = 0; + length = 0; packed = false; } }; diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 4b4a5b41b1..c98d0028e9 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -42,6 +42,7 @@ #include "keyboard.h" #include "mixer_ui.h" #include "mixer_strip.h" +#include "monitor_section.h" #include "plugin_selector.h" #include "ardour_ui.h" #include "prompter.h" @@ -66,6 +67,7 @@ Mixer_UI::Mixer_UI () { _strip_width = Config->get_default_narrow_ms() ? Narrow : Wide; track_menu = 0; + monitor_section = 0; route_group_context_menu = 0; no_track_list_redisplay = false; in_group_row_change = false; @@ -253,6 +255,8 @@ Mixer_UI::Mixer_UI () MixerStrip::CatchDeletion.connect (*this, ui_bind (&Mixer_UI::remove_strip, this, _1), gui_context()); + MonitorSection::setup_knob_images (); + #ifndef DEFER_PLUGIN_SELECTOR_LOAD _plugin_selector = new PluginSelector (PluginManager::the_manager ()); #endif @@ -313,9 +317,18 @@ Mixer_UI::add_strip (RouteList& routes) boost::shared_ptr route = (*x); if (route->is_hidden()) { - return; + continue; } + if (route->is_control()) { + monitor_section = new MonitorSection (_session); + out_packer.pack_end (monitor_section->pack_widget(), false, false); + monitor_section->pack_widget().show_all (); + /* no regular strip */ + continue; + } + + strip = new MixerStrip (*this, _session, route); strips.push_back (strip); @@ -508,10 +521,14 @@ Mixer_UI::session_going_away () group_model->clear (); _selection.clear (); track_model->clear (); + + delete monitor_section; + monitor_section = 0; for (list::iterator i = strips.begin(); i != strips.end(); ++i) { delete (*i); } + strips.clear (); WindowTitle title(Glib::get_application_name()); @@ -576,6 +593,10 @@ Mixer_UI::fast_update_strips () for (list::iterator i = strips.begin(); i != strips.end(); ++i) { (*i)->fast_update (); } + + if (monitor_section) { + monitor_section->fast_update (); + } } } diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index e03d2efebd..87bf57a6df 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -50,6 +50,7 @@ namespace ARDOUR { class MixerStrip; class PluginSelector; class MixerGroupTabs; +class MonitorSection; class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr { @@ -194,6 +195,8 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR void track_column_click (gint); void build_track_menu (); + MonitorSection* monitor_section; + PluginSelector *_plugin_selector; void strip_property_changed (const PBD::PropertyChange&, MixerStrip *); diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc new file mode 100644 index 0000000000..51659adcb6 --- /dev/null +++ b/gtk2_ardour/monitor_section.cc @@ -0,0 +1,562 @@ +#include + +#include "pbd/compose.h" +#include "pbd/error.h" + +#include "gtkmm2ext/bindable_button.h" +#include "gtkmm2ext/tearoff.h" +#include "gtkmm2ext/actions.h" + +#include "ardour/dB.h" +#include "ardour/monitor_processor.h" +#include "ardour/route.h" +#include "ardour/utils.h" + +#include "monitor_section.h" +#include "utils.h" +#include "volume_controller.h" + +#include "i18n.h" + +using namespace ARDOUR; +using namespace Gtk; +using namespace Gtkmm2ext; +using namespace PBD; +using namespace std; + +Glib::RefPtr MonitorSection::monitor_actions; +Glib::RefPtr MonitorSection::big_knob_pixbuf; +Glib::RefPtr MonitorSection::little_knob_pixbuf; + +MonitorSection::MonitorSection (Session* s) + : AxisView (s) + , RouteUI (s) + , main_table (2, 3) + , meter (s) + , _tearoff (0) + , gain_adjustment (1.0, 0.0, 2.0, 0.01, 0.1) + , gain_control (0) + , dim_adjustment (0.2, 0.0, 1.0, 0.01, 0.1) + , dim_control (0) + , solo_boost_adjustment (1.0, 1.0, 2.0, 0.01, 0.1) + , solo_boost_control (0) + , solo_in_place_button (solo_model_group, _("SiP")) + , afl_button (solo_model_group, _("AFL")) + , pfl_button (solo_model_group, _("PFL")) + , cut_all_button (_("MUTE")) + , dim_all_button (_("DIM")) + +{ + Glib::RefPtr act; + + if (!monitor_actions) { + + /* do some static stuff */ + + register_actions (); + + } + + _route = _session->control_out (); + + if (!_route) { + throw failed_constructor (); + } + + _monitor = _route->monitor_control (); + + if (!_monitor) { + throw failed_constructor (); + } + + HBox* sub_knob_packer = manage (new HBox); + sub_knob_packer->set_spacing (12); + + VBox* spin_packer; + Label* spin_label; + + gain_control = new VolumeController (big_knob_pixbuf, &gain_adjustment, true); + gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::gain_value_changed)); + gain_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::nonlinear_gain_printer), + &gain_control->spinner())); + + HBox* center_gain_control = manage (new HBox); + center_gain_control->pack_start (*gain_control, true, true); + + spin_label = manage (new Label (_("Gain (dB)"))); + spin_packer = manage (new VBox); + spin_packer->set_spacing (6); + spin_packer->pack_start (*center_gain_control, false, false); + spin_packer->pack_start (*spin_label, false, false); + + knob_packer.pack_start (*spin_packer, false, false); + + dim_control = new VolumeController (little_knob_pixbuf, &dim_adjustment, true, 30, 30); + dim_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::dim_level_changed)); + dim_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer), + &dim_control->spinner())); + + spin_label = manage (new Label (_("Dim Cut (dB)"))); + spin_packer = manage (new VBox); + spin_packer->set_spacing (6); + spin_packer->pack_start (*dim_control, false, false); + spin_packer->pack_start (*spin_label, false, false); + + sub_knob_packer->pack_start (*spin_packer, false, true); + + solo_boost_control = new VolumeController (little_knob_pixbuf, &solo_boost_adjustment, true, 30, 30); + solo_boost_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_boost_changed)); + solo_boost_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer), + &solo_boost_control->spinner())); + + spin_label = manage (new Label (_("Solo Boost (dB)"))); + spin_packer = manage (new VBox); + spin_packer->set_spacing (6); + spin_packer->pack_start (*solo_boost_control, false, false); + spin_packer->pack_start (*spin_label, false, false); + + sub_knob_packer->pack_start (*spin_packer, false, true); + + knob_packer.pack_start (*sub_knob_packer, false, true); + + sub_knob_packer->show (); + knob_packer.show (); + gain_control->show_all (); + dim_control->show_all (); + solo_boost_control->show_all (); + + meter.set_meter (&_route->peak_meter()); + meter.setup_meters (300, 5); + + table_knob_packer.pack_start (main_table, true, true); + table_knob_packer.pack_start (knob_packer, false, false); + + table_knob_packer.show (); + + solo_model_box.set_spacing (12); + solo_model_box.pack_start (solo_in_place_button, false, false); + solo_model_box.pack_start (afl_button, false, false); + solo_model_box.pack_start (pfl_button, false, false); + + solo_in_place_button.show (); + afl_button.show (); + pfl_button.show (); + solo_model_box.show (); + + upper_packer.pack_start (solo_model_box, false, false); + + act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all")); + if (act) { + act->connect_proxy (cut_all_button); + } + + act = ActionManager::get_action (X_("Monitor"), X_("monitor-dim-all")); + if (act) { + act->connect_proxy (dim_all_button); + } + + cut_all_button.show (); + dim_all_button.show (); + + lower_packer.pack_start (dim_all_button, false, false); + lower_packer.pack_start (cut_all_button, false, false); + + vpacker.set_border_width (12); + vpacker.set_spacing (12); + vpacker.pack_start (upper_packer, false, false); + vpacker.pack_start (table_knob_packer, false, false); + vpacker.pack_start (lower_packer, false, false); + + VBox* keep_meter_under_control = manage (new VBox); + keep_meter_under_control->pack_start (meter, false, false); + keep_meter_under_control->show (); + + hpacker.set_border_width (12); + hpacker.set_spacing (12); + hpacker.pack_start (*keep_meter_under_control, false, false); + hpacker.pack_start (vpacker, true, true); + + main_table.show (); + hpacker.show (); + upper_packer.show (); + lower_packer.show (); + vpacker.show (); + meter.show_all (); + + populate_buttons (); + map_state (); + + _tearoff = new TearOff (hpacker); + /* if torn off, make this a normal window */ + _tearoff->tearoff_window().set_type_hint (Gdk::WINDOW_TYPE_HINT_NORMAL); + _tearoff->tearoff_window().set_title (X_("Monitor")); +} + +MonitorSection::~MonitorSection () +{ + delete _tearoff; + delete gain_control; + delete dim_control; + delete solo_boost_control; +} + +void +MonitorSection::populate_buttons () +{ + Glib::RefPtr act; + uint32_t nchans = _route->monitor_control()->output_streams().n_audio(); + + main_table.resize (nchans+1, 5); + main_table.set_col_spacings (6); + main_table.set_row_spacings (6); + main_table.set_homogeneous (true); + + Label* l1 = manage (new Label (X_("out"))); + main_table.attach (*l1, 0, 1, 0, 1, SHRINK|FILL, SHRINK|FILL); + l1 = manage (new Label (X_("cut"))); + main_table.attach (*l1, 1, 2, 0, 1, SHRINK|FILL, SHRINK|FILL); + l1 = manage (new Label (X_("dim"))); + main_table.attach (*l1, 2, 3, 0, 1, SHRINK|FILL, SHRINK|FILL); + l1 = manage (new Label (X_("solo"))); + main_table.attach (*l1, 3, 4, 0, 1, SHRINK|FILL, SHRINK|FILL); + l1 = manage (new Label (X_("inv"))); + main_table.attach (*l1, 4, 5, 0, 1, SHRINK|FILL, SHRINK|FILL); + +#if 0 + /* the "all" buttons for cut & dim */ + + Label *la = manage (new Label (X_("all"))); + main_table.attach (*la, 0, 1, 1, 2, SHRINK|FILL, SHRINK|FILL); + + + /* cut all */ + + BindableToggleButton* ca = manage (new BindableToggleButton (X_(""))); + ca->set_name (X_("MixerMuteButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (ca->gobj()), false); + main_table.attach (*ca, 1, 2, 1, 2, SHRINK|FILL, SHRINK|FILL); + + act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all")); + if (act) { + act->connect_proxy (*ca); + } + + /* dim all */ + + BindableToggleButton* da = manage (new BindableToggleButton (X_(""))); + da->set_name (X_("MixerMuteButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (da->gobj()), false); + main_table.attach (*da, 2, 3, 1, 2, SHRINK|FILL, SHRINK|FILL); + + act = ActionManager::get_action (X_("Monitor"), X_("monitor-dim-all")); + if (act) { + act->connect_proxy (*da); + } + + uint32_t row_offset = 2; +#else + uint32_t row_offset = 1; +#endif + + for (uint32_t i = 0; i < nchans; ++i) { + + string l; + char buf[64]; + + if (nchans == 2) { + if (i == 0) { + l = "L"; + } else { + l = "R"; + } + } else { + char buf[32]; + snprintf (buf, sizeof (buf), "%d", i+1); + l = buf; + } + + Label* c1 = manage (new Label (l)); + main_table.attach (*c1, 0, 1, i+row_offset, i+row_offset+1, SHRINK|FILL, SHRINK|FILL); + + /* Cut */ + + BindableToggleButton* c2 = manage (new BindableToggleButton (X_(""))); + c2->set_name (X_("MixerMuteButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (c2->gobj()), false); + main_table.attach (*c2, 1, 2, i+row_offset, i+row_offset+1, SHRINK|FILL, SHRINK|FILL); + + snprintf (buf, sizeof (buf), "monitor-cut-%u", i+1); + act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + act->connect_proxy (*c2); + } + + /* Dim */ + + BindableToggleButton* c3 = manage (new BindableToggleButton (X_(""))); + c3->set_name (X_("MixerMuteButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (c2->gobj()), false); + main_table.attach (*c3, 2, 3, i+row_offset, i+row_offset+1, SHRINK|FILL, SHRINK|FILL); + + snprintf (buf, sizeof (buf), "monitor-dim-%u", i+1); + act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + act->connect_proxy (*c3); + } + + /* Solo */ + + BindableToggleButton* c4 = manage (new BindableToggleButton (X_(""))); + c4->set_name (X_("MixerSoloButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (c2->gobj()), false); + main_table.attach (*c4, 3, 4, i+row_offset, i+row_offset+1, SHRINK|FILL, SHRINK|FILL); + + snprintf (buf, sizeof (buf), "monitor-solo-%u", i+1); + act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + act->connect_proxy (*c4); + } + + /* Invert (Polarity/Phase) */ + + BindableToggleButton* c5 = manage (new BindableToggleButton (X_(""))); + c5->set_name (X_("MixerPhaseInvertButton")); + gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (c2->gobj()), false); + main_table.attach (*c5, 4, 5, i+row_offset, i+row_offset+1, SHRINK|FILL, SHRINK|FILL); + + snprintf (buf, sizeof (buf), "monitor-invert-%u", i+1); + act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + act->connect_proxy (*c5); + } + + } + + main_table.show_all (); +} + +void +MonitorSection::set_button_names () +{ + rec_enable_button_label.set_text ("rec"); + mute_button_label.set_text ("rec"); + solo_button_label.set_text ("rec"); +} + +Widget& +MonitorSection::pack_widget () const +{ + return *_tearoff; +} + +void +MonitorSection::dim_all () +{ + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), "monitor-dim-all"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_dim_all (tact->get_active()); + } + +} + +void +MonitorSection::cut_all () +{ + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), "monitor-cut-all"); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_cut_all (tact->get_active()); + } +} + +void +MonitorSection::cut_channel (uint32_t chn) +{ + char buf[64]; + snprintf (buf, sizeof (buf), "monitor-cut-%u", chn); + + --chn; // 0-based in backend + + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_cut (chn, tact->get_active()); + } +} + +void +MonitorSection::dim_channel (uint32_t chn) +{ + char buf[64]; + snprintf (buf, sizeof (buf), "monitor-dim-%u", chn); + + --chn; // 0-based in backend + + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_dim (chn, tact->get_active()); + } + +} + +void +MonitorSection::solo_channel (uint32_t chn) +{ + char buf[64]; + snprintf (buf, sizeof (buf), "monitor-solo-%u", chn); + + --chn; // 0-based in backend + + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_solo (chn, tact->get_active()); + } + +} + +void +MonitorSection::invert_channel (uint32_t chn) +{ + char buf[64]; + + --chn; // 0-based in backend + + snprintf (buf, sizeof (buf), "monitor-invert-%u", chn); + Glib::RefPtr act = ActionManager::get_action (X_("Monitor"), buf); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + _monitor->set_polarity (chn, tact->get_active()); + } + +} + +void +MonitorSection::register_actions () +{ + string action_name; + string action_descr; + + monitor_actions = ActionGroup::create (X_("Monitor")); + ActionManager::add_action_group (monitor_actions); + + ActionManager::register_toggle_action (monitor_actions, "monitor-cut-all", "", + sigc::mem_fun (*this, &MonitorSection::cut_all)); + + ActionManager::register_toggle_action (monitor_actions, "monitor-dim-all", "", + sigc::mem_fun (*this, &MonitorSection::dim_all)); + + /* note the 1-based counting for naming vs. 0-based for action */ + + for (uint32_t chn = 1; chn <= 16; ++chn) { + + /* for the time being, do not use the action description because it always + shows up in the buttons, which is undesirable. + */ + + action_name = string_compose (X_("monitor-cut-%1"), chn); + action_descr = string_compose (_("Cut Monitor Chn %1"), chn); + ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", + sigc::bind (sigc::mem_fun (*this, &MonitorSection::cut_channel), chn)); + + action_name = string_compose (X_("monitor-dim-%1"), chn); + action_descr = string_compose (_("Dim Monitor Chn %1"), chn+1); + ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", + sigc::bind (sigc::mem_fun (*this, &MonitorSection::dim_channel), chn)); + + action_name = string_compose (X_("monitor-solo-%1"), chn); + action_descr = string_compose (_("Solo Monitor Chn %1"), chn); + ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", + sigc::bind (sigc::mem_fun (*this, &MonitorSection::solo_channel), chn)); + + action_name = string_compose (X_("monitor-invert-%1"), chn); + action_descr = string_compose (_("Invert Monitor Chn %1"), chn); + ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", + sigc::bind (sigc::mem_fun (*this, &MonitorSection::invert_channel), chn)); + + } +} + +void +MonitorSection::fast_update () +{ + meter.update_meters (); +} + +void +MonitorSection::setup_knob_images () +{ + try { + + big_knob_pixbuf = ::get_icon ("knob"); + + } catch (...) { + + error << "No knob image found (or not loadable) at " + << " .... " + << endmsg; + throw failed_constructor (); + } + + try { + + little_knob_pixbuf = ::get_icon ("littleknob"); + + } catch (...) { + + error << "No knob image found (or not loadable) at " + << " .... " + << endmsg; + throw failed_constructor (); + } +} + +void +MonitorSection::gain_value_changed () +{ + _route->set_gain (slider_position_to_gain (gain_adjustment.get_value()), this); +} + +void +MonitorSection::dim_level_changed () +{ + _monitor->set_dim_level (dim_adjustment.get_value()); +} + +void +MonitorSection::solo_boost_changed () +{ + _monitor->set_solo_boost_level (solo_boost_adjustment.get_value()); +} + +bool +MonitorSection::nonlinear_gain_printer (SpinButton* button) +{ + double val = button->get_adjustment()->get_value(); + char buf[16]; + snprintf (buf, sizeof (buf), "%.1f", accurate_coefficient_to_dB (slider_position_to_gain (val))); + button->set_text (buf); + return true; +} + +bool +MonitorSection::linear_gain_printer (SpinButton* button) +{ + double val = button->get_adjustment()->get_value(); + char buf[16]; + snprintf (buf, sizeof (buf), "%.1f", accurate_coefficient_to_dB (val)); + button->set_text (buf); + return true; +} + +void +MonitorSection::map_state () +{ + cerr << "route gain = " << _route->gain_control()->get_value() << endl; + + gain_control->get_adjustment()->set_value (gain_to_slider_position (_route->gain_control()->get_value())); + dim_control->get_adjustment()->set_value (_monitor->dim_level()); + solo_boost_control->get_adjustment()->set_value (_monitor->solo_boost_level()); +} diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h new file mode 100644 index 0000000000..6ea9d3b571 --- /dev/null +++ b/gtk2_ardour/monitor_section.h @@ -0,0 +1,98 @@ +/* + Copyright (C) 2010 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. + +*/ + +#include +#include + +#include "gtkmm2ext/bindable_button.h" + +#include "axis_view.h" +#include "level_meter.h" +#include "route_ui.h" + +namespace Gtkmm2ext { + class TearOff; +} + +class VolumeController; + +class MonitorSection : public RouteUI +{ + public: + MonitorSection (ARDOUR::Session*); + ~MonitorSection (); + + Gtk::Widget& pack_widget () const; + void fast_update (); + static void setup_knob_images (); + + private: + Gtk::VBox vpacker; + Gtk::HBox hpacker; + Gtk::Table main_table; + Gtk::VBox upper_packer; + Gtk::VBox lower_packer; + Gtk::VBox table_knob_packer; + Gtk::VBox knob_packer; + LevelMeter meter; + Gtkmm2ext::TearOff* _tearoff; + + Gtk::Adjustment gain_adjustment; + VolumeController* gain_control; + Gtk::Adjustment dim_adjustment; + VolumeController* dim_control; + Gtk::Adjustment solo_boost_adjustment; + VolumeController* solo_boost_control; + + void populate_buttons (); + void set_button_names (); + void map_state (); + + boost::shared_ptr _monitor; + boost::shared_ptr _route; + + static Glib::RefPtr monitor_actions; + void register_actions (); + + static Glib::RefPtr big_knob_pixbuf; + static Glib::RefPtr little_knob_pixbuf; + + void cut_channel (uint32_t); + void dim_channel (uint32_t); + void solo_channel (uint32_t); + void invert_channel (uint32_t); + void dim_all (); + void cut_all (); + void mono (); + void dim_level_changed (); + void solo_boost_changed (); + void gain_value_changed (); + + bool nonlinear_gain_printer (Gtk::SpinButton*); + bool linear_gain_printer (Gtk::SpinButton*); + + Gtk::RadioButtonGroup solo_model_group; + Gtk::RadioButton solo_in_place_button; + Gtk::RadioButton afl_button; + Gtk::RadioButton pfl_button; + Gtk::HBox solo_model_box; + + BindableToggleButton cut_all_button; + BindableToggleButton dim_all_button; +}; diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index f9432bf88b..b3d7364ebd 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -738,6 +738,7 @@ public: h->pack_start (*l, false, false); h->pack_start (*_db_slider, false, false); h->pack_start (_db_display, false, false); + h->show_all (); set_size_request_to_display_given_text (_db_display, "-99.0", 12, 12); diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 1a75132e4c..c074c93cd0 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -766,13 +766,13 @@ RouteUI::update_solo_display () void RouteUI::solo_changed_so_update_mute () { - Gtkmm2ext::UI::instance()->call_slot (boost::bind (&RouteUI::update_mute_display, this)); + update_mute_display (); } void RouteUI::mute_changed(void* /*src*/) { - Gtkmm2ext::UI::instance()->call_slot (boost::bind (&RouteUI::update_mute_display, this)); + update_mute_display (); } int @@ -812,6 +812,10 @@ RouteUI::mute_visual_state (Session* s, boost::shared_ptr r) void RouteUI::update_mute_display () { + if (!_route) { + return; + } + bool model = _route->muted(); bool view = mute_button->get_active(); @@ -837,17 +841,13 @@ RouteUI::route_rec_enable_changed () void RouteUI::session_rec_enable_changed () { - if (!rec_enable_button) { - return; - } - - Gtkmm2ext::UI::instance()->call_slot (boost::bind (&RouteUI::update_rec_display, this)); + update_rec_display (); } void RouteUI::update_rec_display () { - if (!rec_enable_button) { + if (!rec_enable_button || !_route) { return; } diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript index 05725a7e7a..e328a96263 100644 --- a/gtk2_ardour/wscript +++ b/gtk2_ardour/wscript @@ -137,6 +137,7 @@ gtk2_ardour_sources = [ 'mixer_group_tabs.cc', 'mixer_strip.cc', 'mixer_ui.cc', + 'monitor_section.cc', 'nag.cc', 'option_editor.cc', 'opts.cc', @@ -197,6 +198,7 @@ gtk2_ardour_sources = [ 'ui_config.cc', 'utils.cc', 'version.cc', + 'volume_controller.cc', 'waveview.cc', ] diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index ddcb3f84db..35b567688c 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -179,10 +179,10 @@ Amp::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_frame*/, n void Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t target) { - /** Apply a (potentially) declicked gain to the audio buffers of @a bufs + /** Apply a (potentially) declicked gain to the buffers of @a bufs */ - if (nframes == 0 || bufs.count().n_audio() == 0) { + if (nframes == 0 || bufs.count().n_total() == 0) { return; } @@ -196,7 +196,6 @@ Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t targ gain_t delta; double fractional_shift = -1.0/declick; double fractional_pos; - gain_t polscale = 1.0f; if (target < initial) { /* fade out: remove more and more of delta from initial */ @@ -232,7 +231,7 @@ Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t targ fractional_pos = 1.0; for (nframes_t nx = 0; nx < declick; ++nx) { - buffer[nx] *= polscale * (initial + (delta * (0.5 + 0.5 * cos (M_PI * fractional_pos)))); + buffer[nx] *= (initial + (delta * (0.5 + 0.5 * cos (M_PI * fractional_pos)))); fractional_pos += fractional_shift; } @@ -249,6 +248,57 @@ Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t targ } } +void +Amp::apply_gain (AudioBuffer& buf, nframes_t nframes, gain_t initial, gain_t target) +{ + /** Apply a (potentially) declicked gain to the contents of @a buf + */ + + if (nframes == 0) { + return; + } + + // if we don't need to declick, defer to apply_simple_gain + if (initial == target) { + apply_simple_gain (buf, nframes, target); + return; + } + + const nframes_t declick = std::min ((nframes_t)128, nframes); + gain_t delta; + double fractional_shift = -1.0/declick; + double fractional_pos; + + if (target < initial) { + /* fade out: remove more and more of delta from initial */ + delta = -(initial - target); + } else { + /* fade in: add more and more of delta from initial */ + delta = target - initial; + } + + + Sample* const buffer = buf.data(); + + fractional_pos = 1.0; + + for (nframes_t nx = 0; nx < declick; ++nx) { + buffer[nx] *= (initial + (delta * (0.5 + 0.5 * cos (M_PI * fractional_pos)))); + fractional_pos += fractional_shift; + } + + /* now ensure the rest of the buffer has the target value applied, if necessary. */ + + if (declick != nframes) { + + if (target == 0.0) { + memset (&buffer[declick], 0, sizeof (Sample) * (nframes - declick)); + } else if (target != 1.0) { + apply_gain_to_buffer (&buffer[declick], nframes - declick, target); + } + } +} + void Amp::apply_simple_gain (BufferSet& bufs, nframes_t nframes, gain_t target) { @@ -288,6 +338,16 @@ Amp::apply_simple_gain (BufferSet& bufs, nframes_t nframes, gain_t target) } } +void +Amp::apply_simple_gain (AudioBuffer& buf, nframes_t nframes, gain_t target) +{ + if (target == 0.0) { + memset (buf.data(), 0, sizeof (Sample) * nframes); + } else if (target != 1.0) { + apply_gain_to_buffer (buf.data(), nframes, target); + } +} + void Amp::inc_gain (gain_t factor, void *src) { diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index 54bd9defe2..4db2292653 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -59,6 +59,9 @@ public: static void apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t target); static void apply_simple_gain(BufferSet& bufs, nframes_t nframes, gain_t target); + + static void apply_gain (AudioBuffer& buf, nframes_t nframes, gain_t initial, gain_t target); + static void apply_simple_gain(AudioBuffer& buf, nframes_t nframes, gain_t target); gain_t gain () const { return _gain_control->user_float(); } diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index 243106fb54..ad498b852d 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -47,6 +47,7 @@ class InternalSend : public Send void set_block_size (nframes_t); boost::shared_ptr target_route() const { return _send_to; } + const PBD::ID& target_id() const { return _send_to_id; } private: BufferSet mixbufs; diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h new file mode 100644 index 0000000000..a66338c75b --- /dev/null +++ b/libs/ardour/ardour/monitor_processor.h @@ -0,0 +1,87 @@ +/* + Copyright (C) 2010 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. + +*/ + +#ifndef __ardour_monitor_processor_h__ +#define __ardour_monitor_processor_h__ + +#include + +#include "pbd/signals.h" + +#include "ardour/types.h" +#include "ardour/processor.h" + +class XMLNode; + +namespace ARDOUR { + +class Session; + +class MonitorProcessor : public Processor +{ + public: + MonitorProcessor (Session&); + MonitorProcessor (Session&, const XMLNode& name); + + bool display_to_user() const; + + void run (BufferSet& /*bufs*/, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t /*nframes*/, bool /*result_required*/); + + XMLNode& state (bool full); + int set_state (const XMLNode&, int /* version */); + + bool configure_io (ChanCount in, ChanCount out); + bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const; + + void set_cut_all (bool); + void set_dim_all (bool); + void set_polarity (uint32_t, bool invert); + void set_cut (uint32_t, bool cut); + void set_dim (uint32_t, bool dim); + void set_solo (uint32_t, bool); + + void set_dim_level (gain_t); + void set_solo_boost_level (gain_t); + + gain_t dim_level() const { return _dim_level; } + gain_t solo_boost_level() const { return _solo_boost_level; } + + bool dimmed (uint32_t chn) const; + bool soloed (uint32_t chn) const; + bool inverted (uint32_t chn) const; + bool cut (uint32_t chn) const; + + PBD::Signal0 Changed; + + private: + std::vector current_gain; + std::vector _cut; + std::vector _dim; + std::vector _polarity; + std::vector _soloed; + uint32_t solo_cnt; + bool _dim_all; + bool _cut_all; + volatile gain_t _dim_level; + volatile gain_t _solo_boost_level; +}; + +} /* namespace */ + +#endif /* __ardour_monitor_processor_h__ */ diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 2dd78c66f4..95d0c0a286 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2009-2010 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 diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 4157541229..9f7d9d5d5a 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -54,6 +54,7 @@ class Processor; class RouteGroup; class Send; class InternalReturn; +class MonitorProcessor; class Route : public SessionObject, public AutomatableControls, public RouteGroupMember { @@ -80,7 +81,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou bool active() const { return _active; } void set_active (bool yn); - static std::string ensure_track_or_route_name(std::string, Session &); std::string comment() { return _comment; } @@ -190,10 +190,11 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou /* special processors */ - boost::shared_ptr control_outs() const { return _control_outs; } - boost::shared_ptr main_outs() const { return _main_outs; } - boost::shared_ptr internal_return() const { return _intreturn; } - boost::shared_ptr internal_send_for (boost::shared_ptr target) const; + boost::shared_ptr control_outs() const { return _control_outs; } + boost::shared_ptr main_outs() const { return _main_outs; } + boost::shared_ptr internal_return() const { return _intreturn; } + boost::shared_ptr monitor_control() const { return _monitor_control; } + boost::shared_ptr internal_send_for (boost::shared_ptr target) const; void add_internal_return (); BufferSet* get_return_buffer () const; void release_return_buffer () const; @@ -210,7 +211,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou }; int add_processor (boost::shared_ptr, Placement placement, ProcessorStreams* err = 0); - int add_processor (boost::shared_ptr, ProcessorList::iterator iter, ProcessorStreams* err = 0); + int add_processor (boost::shared_ptr, ProcessorList::iterator iter, ProcessorStreams* err = 0, bool activation_allowed = true); int add_processors (const ProcessorList&, boost::shared_ptr before, ProcessorStreams* err = 0); int add_processors (const ProcessorList&, ProcessorList::iterator iter, ProcessorStreams* err = 0); int remove_processor (boost::shared_ptr, ProcessorStreams* err = 0); @@ -364,6 +365,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou boost::shared_ptr _main_outs; boost::shared_ptr _control_outs; boost::shared_ptr _intreturn; + boost::shared_ptr _monitor_control; Flag _flags; int _pending_declick; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 7d94515efa..5cb8cbd78f 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -993,8 +993,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi boost::scoped_ptr _session_dir; - void hookup_io (); - void when_engine_running (); + void hookup_io (bool new_session); + void when_engine_running (bool new_session); void graph_reordered (); std::string _current_snapshot_name; diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc new file mode 100644 index 0000000000..b0de25f92b --- /dev/null +++ b/libs/ardour/monitor_processor.cc @@ -0,0 +1,221 @@ +#include "pbd/xml++.h" + +#include "ardour/amp.h" +#include "ardour/dB.h" +#include "ardour/monitor_processor.h" +#include "ardour/session.h" + +#include "i18n.h" + +using namespace ARDOUR; +using namespace std; + +MonitorProcessor::MonitorProcessor (Session& s) + : Processor (s, X_("MonitorOut")) +{ + solo_cnt = 0; + _cut_all = false; + _dim_all = false; + _dim_level = 0.2; + _solo_boost_level = 1.0; +} + +MonitorProcessor::MonitorProcessor (Session& s, const XMLNode& node) + : Processor (s, node) +{ + set_state (node, Stateful::loading_state_version); +} + +int +MonitorProcessor::set_state (const XMLNode& node, int version) +{ + return Processor::set_state (node, version); +} + +XMLNode& +MonitorProcessor::state (bool full) +{ + XMLNode& node (Processor::state (full)); + + /* this replaces any existing "type" property */ + + node.add_property (X_("type"), X_("monitor")); + + return node; +} + +void +MonitorProcessor::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t nframes, bool /*result_required*/) +{ + uint32_t chn = 0; + gain_t target_gain; + gain_t dim_level_this_time = _dim_level; + gain_t global_cut = (_cut_all ? 0.0f : 1.0f); + gain_t global_dim = (_dim_all ? dim_level_this_time : 1.0f); + gain_t solo_boost; + + if (_session.listening() || _session.soloing()) { + solo_boost = _solo_boost_level; + } else { + solo_boost = 1.0; + } + + for (BufferSet::audio_iterator b = bufs.audio_begin(); b != bufs.audio_end(); ++b) { + + /* don't double-scale by both track dim and global dim coefficients */ + + gain_t dim_level = (global_dim == 1.0 ? (_dim[chn] ? dim_level_this_time : 1.0) : 1.0); + + if (_soloed[chn]) { + target_gain = _polarity[chn] * _cut[chn] * dim_level * global_cut * global_dim * solo_boost; + } else { + if (solo_cnt == 0) { + target_gain = _polarity[chn] * _cut[chn] * dim_level * global_cut * global_dim * solo_boost; + } else { + target_gain = 0.0; + } + } + + if (target_gain != current_gain[chn] || target_gain != 1.0f) { + + Amp::apply_gain (*b, nframes, current_gain[chn], target_gain); + current_gain[chn] = target_gain; + } + + ++chn; + } +} + +bool +MonitorProcessor::configure_io (ChanCount in, ChanCount out) +{ + uint32_t needed = in.n_audio(); + + while (current_gain.size() > needed) { + current_gain.pop_back (); + _dim.pop_back (); + _cut.pop_back (); + _polarity.pop_back (); + + if (_soloed.back()) { + if (solo_cnt > 0) { + --solo_cnt; + } + } + + _soloed.pop_back (); + } + + while (current_gain.size() < needed) { + current_gain.push_back (1.0); + _dim.push_back (false); + _cut.push_back (1.0); + _polarity.push_back (1.0); + _soloed.push_back (false); + } + + return Processor::configure_io (in, out); +} + +bool +MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const +{ + return in == out; +} + +void +MonitorProcessor::set_polarity (uint32_t chn, bool invert) +{ + if (invert) { + _polarity[chn] = -1.0f; + } else { + _polarity[chn] = 1.0f; + } +} + +void +MonitorProcessor::set_dim (uint32_t chn, bool yn) +{ + _dim[chn] = yn; +} + +void +MonitorProcessor::set_cut (uint32_t chn, bool yn) +{ + if (yn) { + _cut[chn] = 0.0f; + } else { + _cut[chn] = 1.0f; + } +} + +void +MonitorProcessor::set_solo (uint32_t chn, bool solo) +{ + _soloed[chn] = solo; + + if (solo) { + solo_cnt++; + } else { + if (solo_cnt > 0) { + solo_cnt--; + } + } +} + +void +MonitorProcessor::set_cut_all (bool yn) +{ + _cut_all = yn; +} + +void +MonitorProcessor::set_dim_all (bool yn) +{ + _dim_all = yn; +} + +bool +MonitorProcessor::display_to_user () const +{ + return false; +} + +void +MonitorProcessor::set_dim_level (gain_t val) +{ + _dim_level = val; +} + +void +MonitorProcessor::set_solo_boost_level (gain_t val) +{ + _solo_boost_level = val; +} + +bool +MonitorProcessor::soloed (uint32_t chn) const +{ + return _soloed[chn]; +} + + +bool +MonitorProcessor::inverted (uint32_t chn) const +{ + return _polarity[chn] < 0.0f; +} + + +bool +MonitorProcessor::cut (uint32_t chn) const +{ + return _cut[chn] == 0.0f; +} + +bool +MonitorProcessor::dimmed (uint32_t chn) const +{ + return _dim[chn]; +} + diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 712ca927e5..1abcc57f41 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -84,7 +84,6 @@ Processor::Processor (Session& session, const XMLNode& node) , _display_to_user (true) { set_state (node, Stateful::loading_state_version); - _pending_active = _active; } XMLNode& @@ -167,6 +166,7 @@ Processor::set_state_2X (const XMLNode & node, int /*version*/) if ((prop = (*i)->property ("active")) != 0) { if (_active != string_is_affirmative (prop->value())) { _active = !_active; + _pending_active = _active; ActiveChanged (); /* EMIT_SIGNAL */ } } @@ -238,8 +238,6 @@ Processor::set_state (const XMLNode& node, int version) } if ((prop = node.property ("active")) == 0) { - warning << _("XML node describing a processor is missing the `active' field," - "trying legacy active flag from child node") << endmsg; if (legacy_active) { prop = legacy_active; } else { @@ -250,7 +248,8 @@ Processor::set_state (const XMLNode& node, int version) if (_active != string_is_affirmative (prop->value())) { _active = !_active; - ActiveChanged (); /* EMIT_SIGNAL */ + _pending_active = _active; + ActiveChanged (); /* EMIT_SIGNAL */ } return 0; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index ccf95c5bf9..41bd1207b5 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -45,6 +45,7 @@ #include "ardour/ladspa_plugin.h" #include "ardour/meter.h" #include "ardour/mix.h" +#include "ardour/monitor_processor.h" #include "ardour/panner.h" #include "ardour/plugin_insert.h" #include "ardour/port.h" @@ -84,12 +85,16 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) _meter.reset (new PeakMeter (_session)); _meter->set_display_to_user (false); + add_processor (_meter, PostFader); - if (_flags & ControlOut) { + if (is_control()) { /* where we listen to tracks */ _intreturn.reset (new InternalReturn (_session)); add_processor (_intreturn, PreFader); + + _monitor_control.reset (new MonitorProcessor (_session)); + add_processor (_monitor_control, PostFader); } _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); @@ -485,7 +490,6 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, feeding the listen "stream". data will "arrive" into the route from the intreturn processor element. */ - bufs.silence (nframes, 0); } else { @@ -745,7 +749,7 @@ Route::add_processor (boost::shared_ptr processor, Placement placemen * @a position is used. */ int -Route::add_processor (boost::shared_ptr processor, ProcessorList::iterator iter, ProcessorStreams* err) +Route::add_processor (boost::shared_ptr processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed) { ChanCount old_pms = processor_max_streams; @@ -803,8 +807,7 @@ Route::add_processor (boost::shared_ptr processor, ProcessorList::ite } - if (_control_outs != processor) { - // XXX: do we want to emit the signal here ? change call order. + if (activation_allowed && (processor != _control_outs)) { processor->activate (); } @@ -861,6 +864,20 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter _meter->set_display_to_user (_meter_point == MeterCustom); processor = _meter; + } else if (prop->value() == "monitor") { + + if (_monitor_control) { + if (_monitor_control->set_state (node, Stateful::loading_state_version)) { + return false; + } else { + return true; + } + } + + _monitor_control.reset (new MonitorProcessor (_session)); + _monitor_control->set_state (node, Stateful::loading_state_version); + processor = _monitor_control; + } else if (prop->value() == "amp") { /* amp always exists */ @@ -875,10 +892,25 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter } else if (prop->value() == "intsend") { - processor.reset (new InternalSend (_session, _mute_master, node)); + InternalSend* isend = new InternalSend (_session, _mute_master, node); + + if (_session.control_out() && (isend->target_id() == _session.control_out()->id())) { + _control_outs.reset (isend); + if (_control_outs->active()) { + _control_outs->set_solo_level (1); + } else { + _control_outs->set_solo_level (0); + } + } + + processor.reset (isend); } else if (prop->value() == "intreturn") { + /* a route only has one internal return. If it exists already + just set its state, and return + */ + if (_intreturn) { if (_intreturn->set_state (node, Stateful::loading_state_version)) { return false; @@ -919,7 +951,7 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter iter = p; } - return (add_processor (processor, iter) == 0); + return (add_processor (processor, iter, 0, false) == 0); } else { error << _("Processor XML node has no type property") << endmsg; @@ -1979,10 +2011,13 @@ Route::_set_state_2X (const XMLNode& node, int version) _meter.reset (new PeakMeter (_session)); add_processor (_meter, PreFader); - if (_flags & ControlOut) { + if (is_control()) { /* where we listen to tracks */ _intreturn.reset (new InternalReturn (_session)); add_processor (_intreturn, PreFader); + + _monitor_control.reset (new MonitorProcessor (_session)); + add_processor (_monitor_control, PostFader); } _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); @@ -2351,6 +2386,11 @@ Route::listen_via (boost::shared_ptr route, Placement placement, bool /*a if (route == _session.control_out()) { _control_outs = boost::dynamic_pointer_cast(d); + if (_control_outs->active()) { + _control_outs->set_solo_level (1); + } else { + _control_outs->set_solo_level (0); + } } /* already listening via the specified IO: do nothing */ @@ -2385,11 +2425,8 @@ Route::listen_via (boost::shared_ptr route, Placement placement, bool /*a if (route == _session.control_out()) { _control_outs = listener; - /* send to control/listen/monitor bus is active by default */ - listener->activate (); } - add_processor (listener, placement); return 0; diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 89a66afa46..037ae9b043 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -162,7 +162,6 @@ Send::set_state (const XMLNode& node, int version) _bitslot = _session.next_send_id(); } else { sscanf (prop->value().c_str(), "%" PRIu32, &_bitslot); - cerr << this << " scanned " << prop->value() << " to get " << _bitslot << endl; _session.mark_send_id (_bitslot); } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index e077e8b570..c38b5a8660 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -483,7 +483,7 @@ Session::set_worst_io_latencies () } void -Session::when_engine_running () +Session::when_engine_running (bool new_session) { string first_physical_output; @@ -644,9 +644,9 @@ Session::when_engine_running () BootMessage (_("Setup signal flow and plugins")); - hookup_io (); + hookup_io (new_session); - if (!no_auto_connect()) { + if (new_session && !no_auto_connect()) { if (_master_out && Config->get_auto_connect_standard_busses()) { @@ -758,7 +758,7 @@ Session::when_engine_running () } void -Session::hookup_io () +Session::hookup_io (bool new_session) { /* stop graph reordering notifications from causing resorts, etc. @@ -771,7 +771,6 @@ Session::hookup_io () /* we delay creating the auditioner till now because it makes its own connections to ports. - the engine has to be running for this to work. */ try { @@ -798,30 +797,34 @@ Session::hookup_io () Delivery::reset_panners (); - /* Connect tracks to listen/solo etc. busses XXX generalize this beyond control_out */ - - if (_control_out) { + /* Connect tracks to monitor/listen bus if there is one. + Note that in an existing session, the internal sends will + already exist, but we want the routes to notice that + they connect to the control out specifically. + */ + if (_control_out) { boost::shared_ptr r = routes.reader (); - - for (RouteList::iterator x = r->begin(); x != r->end(); ++x) { - - if ((*x)->is_control()) { - - /* relax */ - - } else if ((*x)->is_master()) { - - (*x)->listen_via (_control_out, PostFader, false, false); - + for (RouteList::iterator x = r->begin(); x != r->end(); ++x) { + + if ((*x)->is_control()) { + + /* relax */ + + } else if ((*x)->is_master()) { + + /* relax */ + } else { - + + cerr << "Connecting route " << (*x)->name() << " to control outs\n"; + (*x)->listen_via (_control_out, (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), false, false); } - } - } + } + } /* Anyone who cares about input state, wake up and do something */ @@ -2078,7 +2081,7 @@ Session::add_routes (RouteList& new_routes, bool save) if ((*x)->is_control()) { /* relax */ } else if ((*x)->is_master()) { - (*x)->listen_via (_control_out, PostFader, false, false); + /* relax */ } else { (*x)->listen_via (_control_out, (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), @@ -2394,9 +2397,10 @@ Session::route_solo_changed (void* /*src*/, boost::weak_ptr wpr) void Session::update_route_solo_state (boost::shared_ptr r) { - /* now figure out if anything that matters is soloed */ + /* now figure out if anything that matters is soloed (or is "listening")*/ bool something_soloed = false; + uint32_t listeners = 0; if (!r) { r = routes.reader(); @@ -2407,14 +2411,20 @@ Session::update_route_solo_state (boost::shared_ptr r) something_soloed = true; break; } + + if (!(*i)->is_hidden() && (*i)->listening()) { + listeners++; + } } - cerr << "something soloed ? " << something_soloed << endl; + if (something_soloed != _non_soloed_outs_muted) { + _non_soloed_outs_muted = something_soloed; + SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */ + } - if (something_soloed != _non_soloed_outs_muted) { - _non_soloed_outs_muted = something_soloed; - SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */ - } + if (listeners) { + _listen_cnt = listeners; + } } boost::shared_ptr @@ -3291,6 +3301,12 @@ Session::cancel_audition () bool Session::RoutePublicOrderSorter::operator() (boost::shared_ptr a, boost::shared_ptr b) { + if (a->is_control()) { + return true; + } + if (b->is_control()) { + return false; + } return a->order_key(N_("signal")) < b->order_key(N_("signal")); } diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 1ab26d4bef..e8b7b12e2f 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -780,8 +780,6 @@ Session::send_full_time_code(nframes_t /*nframes*/) msg[7] = timecode.seconds; msg[8] = timecode.frames; - cerr << "MTC: Sending full time code at " << outbound_mtc_timecode_frame << endl; - // Send message at offset 0, sent time is for the start of this cycle if (_mtc_port->midimsg (msg, sizeof (msg), 0)) { error << _("Session: could not send full MIDI time code") << endmsg; diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index f960660555..d6060cf6ad 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -339,7 +339,7 @@ Session::second_stage_init (bool new_session) _engine.Xrun.connect_same_thread (*this, boost::bind (&Session::xrun_recovery, this)); try { - when_engine_running(); + when_engine_running (new_session); } /* handle this one in a different way than all others, so that its clear what happened */ @@ -1046,6 +1046,12 @@ Session::state(bool full_state) RouteList public_order (*r); public_order.sort (cmp); + /* the sort should have put control outs first */ + + if (_control_out) { + assert (_control_out == public_order.front()); + } + for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) { if (!(*i)->is_hidden()) { if (full_state) { diff --git a/libs/ardour/wscript b/libs/ardour/wscript index bd3ceeb668..2fd3a013f8 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -123,6 +123,7 @@ libardour_sources = [ 'midi_track.cc', 'midi_ui.cc', 'mix.cc', + 'monitor_processor.cc', 'mtc_slave.cc', 'mtdm.cc', 'mute_master.cc', diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript index 46babcc7cf..1f8144294b 100644 --- a/libs/gtkmm2ext/wscript +++ b/libs/gtkmm2ext/wscript @@ -34,6 +34,7 @@ gtkmm2ext_sources = [ 'gtk_ui.cc', 'idle_adjustment.cc', 'keyboard.cc', + 'motionfeedback.cc', 'pixfader.cc', 'pixscroller.cc', 'popup.cc',