X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_controller.cc;h=5c00d5a779296f52362775104e60b7c17986fa27;hb=b12beab67c70045269d6ec5dc735c2f4af67c4f9;hp=90c6279f17f1a51fbd34dc638c8d4341ee7c3e84;hpb=64524c0ba40b9f69f06a395f8763615700244fda;p=ardour.git diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 90c6279f17..5c00d5a779 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2007 Paul Davis + Copyright (C) 2007 Paul Davis Author: Dave Robillard This program is free software; you can redistribute it and/or modify @@ -19,11 +19,18 @@ */ #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/panner.h" +#include "ardour/pan_controllable.h" +#include "ardour/session.h" + #include "ardour_ui.h" #include "utils.h" #include "automation_controller.h" @@ -34,27 +41,27 @@ using namespace ARDOUR; using namespace Gtk; - -AutomationController::AutomationController(boost::shared_ptr ac, Adjustment* adj) +AutomationController::AutomationController(boost::shared_ptr owner, boost::shared_ptr ac, Adjustment* adj) : BarController (*adj, ac) , _ignore_change(false) + , _owner (owner) , _controllable(ac) , _adjustment(adj) { set_name (X_("PluginSlider")); // FIXME: get yer own name! set_style (BarController::LeftToRight); set_use_parent (true); - - 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() @@ -74,34 +81,23 @@ AutomationController::create( } else { assert(ac->parameter() == param); } - return boost::shared_ptr(new AutomationController(ac, adjustment)); + return boost::shared_ptr(new AutomationController(parent, 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 _owner->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; + _ignore_change = true; _adjustment->set_value (value); _ignore_change = false; } @@ -118,36 +114,52 @@ AutomationController::value_adjusted() 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) { + + bool mark = false; + double when = 0; + + if (_controllable->session().transport_rolling()) { + mark = true; + when = _controllable->session().transport_frame(); + } + + _controllable->stop_touch (mark, when); + } } void AutomationController::automation_state_changed () { - ENSURE_GUI_THREAD(mem_fun(*this, &AutomationController::automation_state_changed)); + ENSURE_GUI_THREAD (*this, &AutomationController::automation_state_changed) bool x = (_controllable->automation_state() != Off); - + /* start watching automation so that things move */ - + _screen_update_connection.disconnect(); if (x) { _screen_update_connection = ARDOUR_UI::RapidScreenUpdate.connect ( - mem_fun (*this, &AutomationController::display_effective_value)); + sigc::mem_fun (*this, &AutomationController::display_effective_value)); } } 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 (); +}