X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_controller.cc;h=a75faf747c2fe3751fb67b633084d74c681cad93;hb=471570705d58ee88f852009fee18f51562c34292;hp=775c12f6689499452981e86f68c862f2ca55cd47;hpb=d8ade6d30595a3a8be343b392e47d422940eac27;p=ardour.git diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 775c12f668..a75faf747c 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -1,6 +1,6 @@ /* - Copyright (C) 2007 Paul Davis - Author: Dave Robillard + Copyright (C) 2007 Paul Davis + Author: David Robillard 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 @@ -18,11 +18,16 @@ */ -#include -#include "ardour/automation_list.h" +#include +#include + +#include "pbd/error.h" + +#include "ardour/automatable.h" #include "ardour/automation_control.h" +#include "ardour/session.h" + #include "ardour_ui.h" -#include "utils.h" #include "automation_controller.h" #include "gui_thread.h" @@ -31,29 +36,29 @@ using namespace ARDOUR; using namespace Gtk; - -AutomationController::AutomationController(boost::shared_ptr ac, Adjustment* adj) - : BarController(*adj, ac) +AutomationController::AutomationController(boost::shared_ptr printer, boost::shared_ptr ac, Adjustment* adj) + : BarController (*adj, ac) , _ignore_change(false) + , _printer (printer) , _controllable(ac) , _adjustment(adj) { + assert (_printer); + set_name (X_("PluginSlider")); // FIXME: get yer own name! set_style (BarController::LeftToRight); set_use_parent (true); - - label_callback = sigc::mem_fun(this, &AutomationController::update_label); - - StartGesture.connect (mem_fun(*this, &AutomationController::start_touch)); - StopGesture.connect (mem_fun(*this, &AutomationController::end_touch)); - + + StartGesture.connect (sigc::mem_fun(*this, &AutomationController::start_touch)); + StopGesture.connect (sigc::mem_fun(*this, &AutomationController::end_touch)); + _adjustment->signal_value_changed().connect ( - mem_fun(*this, &AutomationController::value_adjusted)); - + sigc::mem_fun(*this, &AutomationController::value_adjusted)); + _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect ( - mem_fun (*this, &AutomationController::display_effective_value)); - - ac->Changed.connect (mem_fun(*this, &AutomationController::value_changed)); + sigc::mem_fun (*this, &AutomationController::display_effective_value)); + + ac->Changed.connect (_changed_connection, invalidator (*this), boost::bind (&AutomationController::value_changed, this), gui_context()); } AutomationController::~AutomationController() @@ -62,86 +67,84 @@ AutomationController::~AutomationController() boost::shared_ptr AutomationController::create( - boost::shared_ptr parent, - boost::shared_ptr cl, + boost::shared_ptr printer, + const Evoral::Parameter& param, boost::shared_ptr ac) { - Gtk::Adjustment* adjustment = manage(new Gtk::Adjustment(cl->default_value(), cl->get_min_y(), cl->get_max_y())); - if (!ac) { - PBD::warning << "Creating AutomationController for " << cl->parameter().symbol() << endmsg; - ac = boost::dynamic_pointer_cast(parent->control_factory(cl)); - } - return boost::shared_ptr(new AutomationController(ac, adjustment)); + Gtk::Adjustment* adjustment = manage ( + new Gtk::Adjustment ( + ac->internal_to_interface (param.normal()), + ac->internal_to_interface (param.min()), + ac->internal_to_interface (param.max()), + (param.max() - param.min()) / 100.0, + (param.max() - param.min()) / 10.0 + ) + ); + + assert (ac); + assert(ac->parameter() == param); + return boost::shared_ptr(new AutomationController(printer, ac, adjustment)); } -void -AutomationController::update_label(char* label, int label_len) +std::string +AutomationController::get_label (double& xpos) { - if (label && label_len) { - // Hack to display CC rounded to int - if (_controllable->parameter().type() == MidiCCAutomation) - snprintf(label, label_len, "%d", (int)_controllable->get_value()); - else - snprintf(label, label_len, "%.3f", _controllable->get_value()); - } + xpos = 0.5; + return _printer->value_as_string (_controllable); } void AutomationController::display_effective_value() { - //if ( ! _controllable->list()->automation_playback()) - // return; - - float value = _controllable->get_value(); - - if (_adjustment->get_value() != value) { - _ignore_change = true; - _adjustment->set_value (value); + double const interface_value = _controllable->internal_to_interface (_controllable->get_value()); + + if (_adjustment->get_value () != interface_value) { + _ignore_change = true; + _adjustment->set_value (interface_value); _ignore_change = false; } } void -AutomationController::value_adjusted() +AutomationController::value_adjusted () { if (!_ignore_change) { - _controllable->set_value(_adjustment->get_value()); + _controllable->set_value (_controllable->interface_to_internal (_adjustment->get_value())); } } void AutomationController::start_touch() { - _controllable->start_touch(); + _controllable->start_touch (_controllable->session().transport_frame()); } void -AutomationController::end_touch() +AutomationController::end_touch () { - _controllable->stop_touch(); -} + if (_controllable->automation_state() == Touch) { -void -AutomationController::automation_state_changed () -{ - ENSURE_GUI_THREAD(mem_fun(*this, &AutomationController::automation_state_changed)); + bool mark = false; + double when = 0; - bool x = (_controllable->automation_state() != Off); - - /* start watching automation so that things move */ - - _screen_update_connection.disconnect(); + if (_controllable->session().transport_rolling()) { + mark = true; + when = _controllable->session().transport_frame(); + } - if (x) { - _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect ( - mem_fun (*this, &AutomationController::display_effective_value)); + _controllable->stop_touch (mark, when); } } void AutomationController::value_changed () { - Gtkmm2ext::UI::instance()->call_slot ( - mem_fun(*this, &AutomationController::display_effective_value)); + Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationController::display_effective_value, this)); } +/** Stop updating our value from our controllable */ +void +AutomationController::stop_updating () +{ + _screen_update_connection.disconnect (); +}