X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_controller.cc;h=c7860c53cb5f5e89179ea8cc96980cc4dbae5731;hb=a79fe239355b8c6f4e86da2eb1eec43c6c4dd052;hp=0005589100b32aa1940e6562d63e4a308ab2a10d;hpb=b3722f7063699fafd0421d504e05a7300c70e0ec;p=ardour.git diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 0005589100..c7860c53cb 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -29,8 +29,8 @@ #include "ardour/session.h" #include "ardour/tempo.h" -#include "ardour_button.h" -#include "ardour_knob.h" +#include "widgets/ardour_button.h" +#include "widgets/ardour_knob.h" #include "automation_controller.h" #include "gui_thread.h" #include "note_select_dialog.h" @@ -40,42 +40,38 @@ using namespace ARDOUR; using namespace Gtk; +using namespace ArdourWidgets; using PBD::Controllable; AutomationBarController::AutomationBarController ( - boost::shared_ptr printer, boost::shared_ptr ac, Adjustment* adj) - : Gtkmm2ext::BarController(*adj, ac) - , _printer(printer) - , _controllable(ac) + : ArdourWidgets::BarController (*adj, ac) + , _controllable (ac) { } std::string AutomationBarController::get_label (double& xpos) { - xpos = 0.5; - return _printer->value_as_string (_controllable); + xpos = 0.5; + return _controllable->get_user_string(); } AutomationBarController::~AutomationBarController() { } -AutomationController::AutomationController(boost::shared_ptr printer, - boost::shared_ptr ac, +AutomationController::AutomationController(boost::shared_ptr ac, Adjustment* adj, bool use_knob) : _widget(NULL) - , _printer (printer) , _controllable(ac) , _adjustment(adj) , _ignore_change(false) + , _grabbed(false) { - assert (_printer); - if (ac->toggled()) { ArdourButton* but = manage(new ArdourButton()); @@ -103,8 +99,10 @@ AutomationController::AutomationController(boost::shared_ptr knob->set_controllable (ac); knob->set_name("processor control knob"); _widget = knob; + knob->StartGesture.connect(sigc::mem_fun(*this, &AutomationController::start_touch)); + knob->StopGesture.connect(sigc::mem_fun(*this, &AutomationController::end_touch)); } else { - AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj)); + AutomationBarController* bar = manage(new AutomationBarController(ac, adj)); bar->set_name(X_("ProcessorControlSlider")); bar->StartGesture.connect( @@ -120,10 +118,13 @@ AutomationController::AutomationController(boost::shared_ptr _adjustment->signal_value_changed().connect( sigc::mem_fun(*this, &AutomationController::value_adjusted)); - _screen_update_connection = Timers::rapid_connect ( - sigc::mem_fun (*this, &AutomationController::display_effective_value)); + ac->Changed.connect (_changed_connections, invalidator (*this), boost::bind (&AutomationController::display_effective_value, this), gui_context()); + display_effective_value (); - ac->Changed.connect (_changed_connection, invalidator (*this), boost::bind (&AutomationController::display_effective_value, this), gui_context()); + if (ac->alist ()) { + ac->alist()->automation_state_changed.connect (_changed_connections, invalidator (*this), boost::bind (&AutomationController::automation_state_changed, this), gui_context()); + automation_state_changed (); + } add(*_widget); show_all(); @@ -134,8 +135,7 @@ AutomationController::~AutomationController() } boost::shared_ptr -AutomationController::create(boost::shared_ptr printer, - const Evoral::Parameter& param, +AutomationController::create(const Evoral::Parameter& param, const ParameterDescriptor& desc, boost::shared_ptr ac, bool use_knob) @@ -143,22 +143,36 @@ AutomationController::create(boost::shared_ptr printer, const double lo = ac->internal_to_interface(desc.lower); const double up = ac->internal_to_interface(desc.upper); const double normal = ac->internal_to_interface(desc.normal); - const double smallstep = ac->internal_to_interface(desc.lower + desc.smallstep); - const double largestep = ac->internal_to_interface(desc.lower + desc.largestep); + const double smallstep = ac->internal_to_interface(desc.lower + desc.smallstep) - lo; + const double largestep = ac->internal_to_interface(desc.lower + desc.largestep) - lo; Gtk::Adjustment* adjustment = manage ( new Gtk::Adjustment (normal, lo, up, smallstep, largestep)); assert (ac); assert(ac->parameter() == param); - return boost::shared_ptr(new AutomationController(printer, ac, adjustment, use_knob)); + return boost::shared_ptr(new AutomationController(ac, adjustment, use_knob)); +} + +void +AutomationController::automation_state_changed () +{ + bool x = _controllable->alist()->automation_state() & Play; + _widget->set_sensitive (!x); } void -AutomationController::display_effective_value() +AutomationController::display_effective_value () { double const interface_value = _controllable->internal_to_interface(_controllable->get_value()); + if (_grabbed) { + /* we cannot use _controllable->touching() here + * because that's only set in Write or Touch mode. + * Besides ctrl-surfaces may also set touching() + */ + return; + } if (_adjustment->get_value () != interface_value) { _ignore_change = true; _adjustment->set_value (interface_value); @@ -171,7 +185,10 @@ void AutomationController::value_adjusted () { if (!_ignore_change) { - _controllable->set_value (_controllable->interface_to_internal(_adjustment->get_value()), Controllable::NoGroup); + const double new_val = _controllable->interface_to_internal(_adjustment->get_value()); + if (_controllable->user_double() != new_val) { + _controllable->set_value (new_val, Controllable::NoGroup); + } } /* A bar controller will automatically follow the adjustment, but for a @@ -188,25 +205,17 @@ AutomationController::value_adjusted () void AutomationController::start_touch() { - _controllable->start_touch (_controllable->session().transport_frame()); + _grabbed = true; + _controllable->start_touch (_controllable->session().transport_sample()); } void AutomationController::end_touch () { - if (_controllable->automation_state() == Touch) { - - bool mark = false; - double when = 0; - - if (_controllable->session().transport_rolling()) { - mark = true; - when = _controllable->session().transport_frame(); - } - - _controllable->stop_touch (mark, when); - } else { - _controllable->stop_touch (false, _controllable->session().transport_frame()); + _controllable->stop_touch (_controllable->session().transport_sample()); + if (_grabbed) { + _grabbed = false; + display_effective_value (); } } @@ -265,8 +274,8 @@ AutomationController::set_freq_beats(double beats) { const ARDOUR::ParameterDescriptor& desc = _controllable->desc(); const ARDOUR::Session& session = _controllable->session(); - const framepos_t pos = session.transport_frame(); - const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at_frame (pos); + const samplepos_t pos = session.transport_sample(); + const ARDOUR::Tempo& tempo = session.tempo_map().tempo_at_sample (pos); const double bpm = tempo.note_types_per_minute(); const double bps = bpm / 60.0; const double freq = bps / beats; @@ -296,7 +305,7 @@ AutomationController::on_button_release(GdkEventButton* ev) MenuList& items = menu->items(); items.push_back(MenuElem(_("Select Note..."), sigc::mem_fun(*this, &AutomationController::run_note_select_dialog))); - menu->popup(ev->button, ev->time); + menu->popup(1, ev->time); return true; } else if (desc.unit == ARDOUR::ParameterDescriptor::HZ) { Gtk::Menu* menu = manage(new Menu()); @@ -320,7 +329,7 @@ AutomationController::on_button_release(GdkEventButton* ev) (double)beats))); } } - menu->popup(ev->button, ev->time); + menu->popup(1, ev->time); return true; } @@ -340,7 +349,6 @@ AutomationController::disable_vertical_scroll () AutomationBarController* bar = dynamic_cast(_widget); if (bar) { bar->set_tweaks ( - Gtkmm2ext::PixFader::Tweaks(bar->tweaks() | - Gtkmm2ext::PixFader::NoVerticalScroll)); + ArdourWidgets::ArdourFader::Tweaks(bar->tweaks() | ArdourWidgets::ArdourFader::NoVerticalScroll)); } }