X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_controller.cc;h=a80a4742327cf41eadd782287b83b0af455c9af9;hb=3e59452fa0182ace7785c62acef83cb0d213cc86;hp=0d16628ab056afdba1fee3b75c777b16fcaa9f99;hpb=c3bfc3ec4e14d147d9c4c279eb6c73947781f956;p=ardour.git diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 0d16628ab0..a80a474232 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 + 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 @@ -19,11 +19,14 @@ */ #include +#include + #include "pbd/error.h" -#include "ardour/automation_list.h" -#include "ardour/automation_control.h" -#include "ardour/event_type_map.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" @@ -34,13 +37,15 @@ using namespace ARDOUR; using namespace Gtk; - -AutomationController::AutomationController(boost::shared_ptr ac, Adjustment* adj) +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); @@ -54,7 +59,7 @@ AutomationController::AutomationController(boost::shared_ptr _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect ( sigc::mem_fun (*this, &AutomationController::display_effective_value)); - ac->Changed.connect (_changed_connection, boost::bind (&AutomationController::value_changed, this), gui_context()); + ac->Changed.connect (_changed_connection, invalidator (*this), boost::bind (&AutomationController::value_changed, this), gui_context()); } AutomationController::~AutomationController() @@ -63,91 +68,79 @@ AutomationController::~AutomationController() boost::shared_ptr AutomationController::create( - boost::shared_ptr parent, + boost::shared_ptr printer, const Evoral::Parameter& param, boost::shared_ptr ac) { - Gtk::Adjustment* adjustment = manage(new Gtk::Adjustment(param.normal(), param.min(), param.max())); - if (!ac) { - PBD::warning << "Creating AutomationController for " << EventTypeMap::instance().to_symbol(param) << endmsg; - ac = boost::dynamic_pointer_cast(parent->control_factory(param)); - } else { - assert(ac->parameter() == param); - } - 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)); } std::string -AutomationController::get_label (int&) +AutomationController::get_label (double& xpos) { - std::stringstream s; - - // Hack to display CC rounded to int - if (_controllable->parameter().type() == MidiCCAutomation) { - s << (int)_controllable->get_value(); - } else { - s << std::fixed << std::setprecision(3) << _controllable->get_value(); - } - - return s.str (); + xpos = 0.5; + return _printer->value_as_string (_controllable); } void AutomationController::display_effective_value() { - //if ( ! _controllable->list()->automation_playback()) - // return; + double const interface_value = _controllable->internal_to_interface (_controllable->get_value()); - float value = _controllable->get_value(); - - if (_adjustment->get_value() != value) { + if (_adjustment->get_value () != interface_value) { _ignore_change = true; - _adjustment->set_value (value); + _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(); -} - -void -AutomationController::end_touch() -{ - _controllable->stop_touch(); + _controllable->start_touch (_controllable->session().transport_frame()); } void -AutomationController::automation_state_changed () +AutomationController::end_touch () { - ENSURE_GUI_THREAD (*this, &AutomationController::automation_state_changed) - - bool x = (_controllable->automation_state() != Off); + if (_controllable->automation_state() == Touch) { - /* start watching automation so that things move */ + bool mark = false; + double when = 0; - _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 ( - sigc::mem_fun (*this, &AutomationController::display_effective_value)); + _controllable->stop_touch (mark, when); } } void AutomationController::value_changed () { - Gtkmm2ext::UI::instance()->call_slot (boost::bind (&AutomationController::display_effective_value, this)); + Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationController::display_effective_value, this)); } /** Stop updating our value from our controllable */