From f71a197270588153316322e87b3ba7b58da0d8f5 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 23 Jun 2009 21:29:39 +0000 Subject: [PATCH] save&restore gain levels; provide GUI control over relative route group bit; fix up solo/mute/recenable button naming as mixer strip width is set git-svn-id: svn://localhost/ardour2/branches/3.0@5263 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/mixer_strip.cc | 55 ++++++++++++++++++------------- gtk2_ardour/route_group_dialog.cc | 8 +++++ gtk2_ardour/route_group_dialog.h | 1 + libs/ardour/amp.cc | 25 ++++++++++++++ libs/ardour/ardour/amp.h | 1 + libs/ardour/route.cc | 6 ++-- 6 files changed, 71 insertions(+), 25 deletions(-) diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 1b1e28cda9..073feaf339 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -540,17 +540,13 @@ MixerStrip::set_width_enum (Width w, void* owner) xml_node->add_property ("strip-width", enum_2_string (_width)); } + set_button_names (); + switch (w) { case Wide: - - if (rec_enable_button) { - ((Gtk::Label*)rec_enable_button->get_child())->set_text (_("Record")); - } if (show_sends_button) { ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Sends")); } - ((Gtk::Label*)mute_button->get_child())->set_text (_("Mute")); - ((Gtk::Label*)solo_button->get_child())->set_text (_("Solo")); if (_route->comment() == "") { comment_button.unset_bg (STATE_NORMAL); @@ -577,14 +573,9 @@ MixerStrip::set_width_enum (Width w, void* owner) break; case Narrow: - if (rec_enable_button) { - ((Gtk::Label*)rec_enable_button->get_child())->set_text (_("Rec")); - } if (show_sends_button) { ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Snd")); } - ((Gtk::Label*)mute_button->get_child())->set_text (_("M")); - ((Gtk::Label*)solo_button->get_child())->set_text (_("S")); if (_route->comment() == "") { comment_button.unset_bg (STATE_NORMAL); @@ -1492,19 +1483,39 @@ MixerStrip::revert_to_default_display () void MixerStrip::set_button_names () { - rec_enable_button_label.set_text (_("Rec")); - mute_button_label.set_text (_("Mute")); + switch (_width) { + case Wide: + rec_enable_button_label.set_text (_("Rec")); + mute_button_label.set_text (_("Mute")); + switch (Config->get_solo_model()) { + case SoloInPlace: + solo_button_label.set_text (_("Solo")); + break; + case SoloAFL: + solo_button_label.set_text (_("AFL")); + break; + case SoloPFL: + solo_button_label.set_text (_("PFL")); + break; + } + break; - switch (Config->get_solo_model()) { - case SoloInPlace: - solo_button_label.set_text (_("Solo")); - break; - case SoloAFL: - solo_button_label.set_text (_("AFL")); - break; - case SoloPFL: - solo_button_label.set_text (_("PFL")); + default: + rec_enable_button_label.set_text (_("R")); + mute_button_label.set_text (_("M")); + switch (Config->get_solo_model()) { + case SoloInPlace: + solo_button_label.set_text (_("S")); + break; + case SoloAFL: + solo_button_label.set_text (_("A")); + break; + case SoloPFL: + solo_button_label.set_text (_("P")); + break; + } break; + } } diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc index 3cd2a3508c..6a87ea3c95 100644 --- a/gtk2_ardour/route_group_dialog.cc +++ b/gtk2_ardour/route_group_dialog.cc @@ -11,6 +11,7 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s) _group (g), _active (_("Active")), _gain (_("Gain")), + _relative (_("Relative")), _mute (_("Muting")), _solo (_("Soloing")), _rec_enable (_("Record enable")), @@ -21,6 +22,7 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s) _active.set_active (_group->is_active ()); _gain.set_active (_group->property (RouteGroup::Gain)); + _relative.set_active (_group->is_relative()); _mute.set_active (_group->property (RouteGroup::Mute)); _solo.set_active (_group->property (RouteGroup::Solo)); _rec_enable.set_active (_group->property (RouteGroup::RecEnable)); @@ -34,6 +36,11 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s) get_vbox()->pack_start (*h); get_vbox()->pack_start (_active); get_vbox()->pack_start (_gain); + + h = manage (new HBox); + h->pack_start (_relative, PACK_EXPAND_PADDING); + get_vbox()->pack_start (*h); + get_vbox()->pack_start (_mute); get_vbox()->pack_start (_solo); get_vbox()->pack_start (_rec_enable); @@ -63,6 +70,7 @@ RouteGroupDialog::do_run () _group->set_property (RouteGroup::RecEnable, _rec_enable.get_active ()); _group->set_property (RouteGroup::Select, _select.get_active ()); _group->set_property (RouteGroup::Edit, _edit.get_active ()); + _group->set_relative (_relative.get_active(), this); } return r; diff --git a/gtk2_ardour/route_group_dialog.h b/gtk2_ardour/route_group_dialog.h index 4deb5b56a2..3bcd2b762f 100644 --- a/gtk2_ardour/route_group_dialog.h +++ b/gtk2_ardour/route_group_dialog.h @@ -17,6 +17,7 @@ private: Gtk::Entry _name; Gtk::CheckButton _active; Gtk::CheckButton _gain; + Gtk::CheckButton _relative; Gtk::CheckButton _mute; Gtk::CheckButton _solo; Gtk::CheckButton _rec_enable; diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 28edaf43a0..d6c6f00ee5 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -222,6 +222,7 @@ void Amp::inc_gain (gain_t factor, void *src) { float desired_gain = _gain_control->user_float(); + if (desired_gain == 0.0f) { set_gain (0.000001f + (0.000001f * factor), src); } else { @@ -255,9 +256,33 @@ Amp::state (bool full_state) { XMLNode& node (Processor::state (full_state)); node.add_property("type", "amp"); + + char buf[32]; + snprintf (buf, sizeof (buf), "%2.12f", _gain_control->get_value()); + node.add_property("gain", buf); + return node; } +int +Amp::set_state (const XMLNode& node) +{ + const XMLProperty* prop; + + Processor::set_state (node); + prop = node.property ("gain"); + + if (prop) { + gain_t val; + + if (sscanf (prop->value().c_str(), "%f", &val) == 1) { + _gain_control->set_value (val); + } + } + + return 0; +} + void Amp::GainControl::set_value (float val) { diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index f758ca4de8..7b9ed4a59e 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -51,6 +51,7 @@ public: void apply_gain_automation(bool yn) { _apply_gain_automation = yn; } XMLNode& state (bool full); + int set_state (const XMLNode&); 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); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 2dc9d13b86..e55ad3e425 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -262,7 +262,7 @@ Route::set_gain (gain_t val, void *src) if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) { if (_route_group->is_relative()) { - + gain_t usable_gain = _amp->gain(); if (usable_gain < 0.000001f) { usable_gain = 0.000001f; @@ -1739,7 +1739,7 @@ Route::set_processor_state (const XMLNode& node) for (niter = nlist.begin(); niter != nlist.end(); ++niter) { XMLProperty* id_prop = (*niter)->property(X_("id")); - cerr << "\tchecking " << id_prop->value() << endl; + if (id_prop && (*i)->id() == id_prop->value()) { processorInStateList = true; break; @@ -1772,7 +1772,7 @@ Route::set_processor_state (const XMLNode& node) while (o != _processors.end()) { XMLProperty* id_prop = (*niter)->property(X_("id")); if (id_prop && (*o)->id() == id_prop->value()) { - break; + break; } ++o;