X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_controller.cc;h=aa23cb2601e860c3707fb608b9610c19c26ff54c;hb=03d28648208bbb1be9108593e9327b6375ecb5ef;hp=3149b9784f9516005992aa2ceaafddb5709c0ab4;hpb=eb296b2c957f574334fae2aefd8b863cf7631769;p=ardour.git diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 3149b9784f..aa23cb2601 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 @@ -18,12 +18,21 @@ */ -#include -#include "automation_controller.h" -#include "ardour/automation_event.h" +#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/session.h" + #include "ardour_ui.h" #include "utils.h" +#include "automation_controller.h" +#include "gui_thread.h" #include "i18n.h" @@ -32,7 +41,7 @@ using namespace Gtk; AutomationController::AutomationController(boost::shared_ptr ac, Adjustment* adj) - : BarController(*adj, *ac) + : BarController (*adj, ac) , _ignore_change(false) , _controllable(ac) , _adjustment(adj) @@ -40,17 +49,17 @@ AutomationController::AutomationController(boost::shared_ptr 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)); + 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() @@ -58,32 +67,48 @@ AutomationController::~AutomationController() } boost::shared_ptr -AutomationController::create(Session& s, boost::shared_ptr al, boost::shared_ptr ac) +AutomationController::create( + boost::shared_ptr parent, + const Evoral::Parameter& param, + boost::shared_ptr ac) { - Gtk::Adjustment* adjustment = manage(new Gtk::Adjustment(al->default_value(), al->get_min_y(), al->get_max_y())); + Gtk::Adjustment* adjustment = manage(new Gtk::Adjustment(param.normal(), param.min(), param.max())); if (!ac) { - PBD::warning << "Creating AutomationController for " << al->param_id().to_string() << endmsg; - ac = boost::shared_ptr(new AutomationControl(s, al)); + 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)); } -void -AutomationController::update_label(char* label, int label_len) +std::string +AutomationController::get_label (int&) { - //cerr << "Controller label: " << label << endl; + std::stringstream s; + + // Hack to display CC rounded to int + if (_controllable->parameter().type() == MidiCCAutomation) { + s << (int)_controllable->get_value(); + } else if (_controllable->parameter().type() == PanAutomation) { + s << Panner::value_as_string (_controllable->get_value ()); + } else { + s << std::fixed << std::setprecision(3) << _controllable->get_value(); + } + + return s.str (); } void AutomationController::display_effective_value() { - if ( ! _controllable->list()->automation_playback()) - return; + //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; } @@ -100,11 +125,52 @@ AutomationController::value_adjusted() void AutomationController::start_touch() { - _controllable->list()->start_touch(); + _controllable->start_touch (_controllable->session().transport_frame()); +} + +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); + } +} + +void +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 ( + sigc::mem_fun (*this, &AutomationController::display_effective_value)); + } +} + +void +AutomationController::value_changed () +{ + Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&AutomationController::display_effective_value, this)); } +/** Stop updating our value from our controllable */ void -AutomationController::end_touch() +AutomationController::stop_updating () { - _controllable->list()->stop_touch(); + _screen_update_connection.disconnect (); }