diff options
author | David Robillard <d@drobilla.net> | 2008-09-19 01:16:44 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-09-19 01:16:44 +0000 |
commit | d8ade6d30595a3a8be343b392e47d422940eac27 (patch) | |
tree | cf51f5f3dffb9fabb4b61f9e5cbaf82142f7825b | |
parent | d357eca668044badcb4bab318e2e74cfffa9a0b0 (diff) |
Tidy.
git-svn-id: svn://localhost/ardour2/branches/3.0@3755 d708f5d6-7413-0410-9779-e7cbd77b26cf
24 files changed, 25 insertions, 494 deletions
diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index dc9b8bb2c4..775c12f668 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -19,7 +19,7 @@ */ #include <pbd/error.h> -#include "ardour/automation_event.h" +#include "ardour/automation_list.h" #include "ardour/automation_control.h" #include "ardour_ui.h" #include "utils.h" diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index de3e2d9873..dd6990b17d 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -26,9 +26,9 @@ #include <pbd/memento_command.h> #include <pbd/stacktrace.h> -#include <ardour/automation_event.h> -#include <ardour/curve.h> +#include <ardour/automation_list.h> #include <ardour/dB.h> +#include <evoral/Curve.hpp> #include "simplerect.h" #include "automation_line.h" diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h index ace2145ff3..bc9c75e8f7 100644 --- a/gtk2_ardour/automation_line.h +++ b/gtk2_ardour/automation_line.h @@ -33,7 +33,7 @@ #include <pbd/undo.h> #include <pbd/statefuldestructible.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> using std::vector; diff --git a/gtk2_ardour/control_point.h b/gtk2_ardour/control_point.h index 47b0d131b7..013ba71e49 100644 --- a/gtk2_ardour/control_point.h +++ b/gtk2_ardour/control_point.h @@ -22,7 +22,7 @@ #include <sys/types.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> #include "canvas.h" #include "simplerect.h" diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc index 80b6224bd3..3e85bd22db 100644 --- a/gtk2_ardour/crossfade_edit.cc +++ b/gtk2_ardour/crossfade_edit.cc @@ -27,8 +27,8 @@ #include <libgnomecanvasmm/line.h> -#include <ardour/automation_event.h> -#include <ardour/curve.h> +#include <ardour/automation_list.h> +#include <evoral/Curve.hpp> #include <ardour/crossfade.h> #include <ardour/session.h> #include <ardour/auditioner.h> diff --git a/gtk2_ardour/crossfade_edit.h b/gtk2_ardour/crossfade_edit.h index e0e9926687..9e4db3be88 100644 --- a/gtk2_ardour/crossfade_edit.h +++ b/gtk2_ardour/crossfade_edit.h @@ -26,7 +26,7 @@ #include <gtkmm/button.h> #include <gtkmm/radiobutton.h> -#include <ardour/curve.h> +#include <evoral/Curve.hpp> #include "ardour_dialog.h" #include "canvas.h" diff --git a/gtk2_ardour/curvetest.cc b/gtk2_ardour/curvetest.cc index ec552848d2..88c7b8e116 100644 --- a/gtk2_ardour/curvetest.cc +++ b/gtk2_ardour/curvetest.cc @@ -22,7 +22,8 @@ #include <cfloat> #include <unistd.h> -#include <ardour/curve.h> +#include <ardour/automation_list.h> +#include <evoral/Curve.hpp> using namespace std; using namespace ARDOUR; diff --git a/gtk2_ardour/region_gain_line.cc b/gtk2_ardour/region_gain_line.cc index 9b2ff346dd..61f7dde0c7 100644 --- a/gtk2_ardour/region_gain_line.cc +++ b/gtk2_ardour/region_gain_line.cc @@ -17,7 +17,7 @@ */ -#include <ardour/curve.h> +#include <evoral/Curve.hpp> #include <ardour/audioregion.h> #include <pbd/memento_command.h> diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index b51e81c2ca..55e287f46b 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -49,7 +49,7 @@ auto_bundle.cc automatable.cc automation.cc automation_control.cc -automation_event.cc +automation_list.cc base_audio_port.cc base_midi_port.cc broadcast_info.cc @@ -60,7 +60,6 @@ configuration.cc control_protocol_manager.cc control_protocol_search_path.cc crossfade.cc -curve.cc cycle_timer.cc default_click.cc directory_names.cc diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index ce31721802..99e7891ce8 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -24,7 +24,7 @@ #include <map> #include <boost/shared_ptr.hpp> #include <ardour/session_object.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> #include <ardour/automation_control.h> #include <ardour/parameter.h> #include <evoral/ControlSet.hpp> diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index c414f7bc40..24d1db3eec 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -25,7 +25,7 @@ #include <pbd/controllable.h> #include <ardour/parameter.h> #include <evoral/Control.hpp> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> namespace ARDOUR { diff --git a/libs/ardour/ardour/automation_event.h b/libs/ardour/ardour/automation_list.h index ed3379bc15..ed3379bc15 100644 --- a/libs/ardour/ardour/automation_event.h +++ b/libs/ardour/ardour/automation_list.h diff --git a/libs/ardour/ardour/crossfade.h b/libs/ardour/ardour/crossfade.h index 9ba3689e82..b0785a6e59 100644 --- a/libs/ardour/ardour/crossfade.h +++ b/libs/ardour/ardour/crossfade.h @@ -30,9 +30,9 @@ #include <pbd/statefuldestructible.h> #include <ardour/ardour.h> -#include <ardour/curve.h> #include <ardour/audioregion.h> #include <ardour/crossfade_compare.h> +#include <evoral/Curve.hpp> namespace ARDOUR { diff --git a/libs/ardour/ardour/curve.h b/libs/ardour/ardour/curve.h deleted file mode 100644 index 433b00a270..0000000000 --- a/libs/ardour/ardour/curve.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright (C) 2001-2007 Paul Davis - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#ifndef __ardour_curve_h__ -#define __ardour_curve_h__ - -#include <sys/types.h> -#include <boost/utility.hpp> -#include <sigc++/signal.h> -#include <glibmm/thread.h> -#include <pbd/undo.h> -#include <list> -#include <algorithm> -#include <ardour/automation_event.h> - -namespace ARDOUR { - -class Curve : public boost::noncopyable -{ - public: - Curve (const AutomationList& al); - - bool rt_safe_get_vector (double x0, double x1, float *arg, int32_t veclen); - void get_vector (double x0, double x1, float *arg, int32_t veclen); - - void solve (); - - private: - double unlocked_eval (double where); - double multipoint_eval (double x); - - void _get_vector (double x0, double x1, float *arg, int32_t veclen); - - void on_list_dirty() { _dirty = true; } - - bool _dirty; - const AutomationList& _list; -}; - -} // namespace ARDOUR - -extern "C" { - void curve_get_vector_from_c (void *arg, double, double, float*, int32_t); -} - -#endif /* __ardour_curve_h__ */ diff --git a/libs/ardour/ardour/gain.h b/libs/ardour/ardour/gain.h index e57cfdc0d7..0c7d9f957d 100644 --- a/libs/ardour/ardour/gain.h +++ b/libs/ardour/ardour/gain.h @@ -21,7 +21,8 @@ #define __ardour_gain_h__ #include "ardour.h" -#include "curve.h" +#include "automation_list.h" +#include <evoral/Curve.hpp> namespace ARDOUR { diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index b44e131d8a..6cae11a7fa 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -36,7 +36,6 @@ #include <ardour/ardour.h> #include <ardour/automatable.h> #include <ardour/utils.h> -#include <ardour/curve.h> #include <ardour/types.h> #include <ardour/data_type.h> #include <ardour/port_set.h> diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h index a535ce3bb4..d2bd210516 100644 --- a/libs/ardour/ardour/io_processor.h +++ b/libs/ardour/ardour/io_processor.h @@ -34,7 +34,7 @@ #include <ardour/ardour.h> #include <ardour/processor.h> #include <ardour/io.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> using std::map; using std::set; diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h index 1b85495d7a..47ef212d58 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -31,7 +31,6 @@ #include <pbd/controllable.h> #include <ardour/types.h> -#include <ardour/curve.h> #include <ardour/automation_control.h> using std::istream; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 8db9fb14fe..f80f26098d 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -27,7 +27,7 @@ #include <ardour/ardour.h> #include <ardour/types.h> #include <ardour/processor.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> class XMLNode; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index a8601a562a..fa074071c5 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -705,7 +705,7 @@ class Session : public PBD::StatefulDestructible sigc::signal<void> NamedSelectionRemoved; /* Curves and AutomationLists (TODO when they go away) */ - void add_curve(Curve*); + void add_curve(Evoral::Curve*); void add_automation_list(AutomationList*); /* fade curves */ @@ -1540,7 +1540,7 @@ class Session : public PBD::StatefulDestructible NamedSelection *XMLNamedSelectionFactory (const XMLNode&); /* CURVES and AUTOMATION LISTS */ - std::map<PBD::ID, Curve*> curves; + std::map<PBD::ID, Evoral::Curve*> curves; std::map<PBD::ID, AutomationList*> automation_lists; /* DEFAULT FADE CURVES */ diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_list.cc index 2d98f1c27c..b9aeabb4b5 100644 --- a/libs/ardour/automation_event.cc +++ b/libs/ardour/automation_list.cc @@ -25,8 +25,8 @@ #include <algorithm> #include <sigc++/bind.h> #include <ardour/parameter.h> -#include <ardour/automation_event.h> -#include <ardour/curve.h> +#include <ardour/automation_list.h> +#include <evoral/Curve.hpp> #include <pbd/stacktrace.h> #include <pbd/enumwriter.h> diff --git a/libs/ardour/curve.cc b/libs/ardour/curve.cc deleted file mode 100644 index dcce3c0c6c..0000000000 --- a/libs/ardour/curve.cc +++ /dev/null @@ -1,406 +0,0 @@ -/* - Copyright (C) 2001-2007 Paul Davis - - Contains ideas derived from "Constrained Cubic Spline Interpolation" - by CJC Kruger (www.korf.co.uk/spline.pdf). - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include <iostream> -#include <float.h> -#include <cmath> -#include <climits> -#include <cfloat> -#include <cmath> - -#include <glibmm/thread.h> -#include <sigc++/bind.h> - -#include "ardour/curve.h" -#include "ardour/automation_event.h" - -#include "i18n.h" - -using namespace std; -using namespace ARDOUR; -using namespace sigc; -using namespace PBD; - -Curve::Curve (const AutomationList& al) - : _dirty (true) - , _list (al) -{ - _list.Dirty.connect(mem_fun(*this, &Curve::on_list_dirty)); -} - -void -Curve::solve () -{ - uint32_t npoints; - - if (!_dirty) { - return; - } - - if ((npoints = _list.events().size()) > 2) { - - /* Compute coefficients needed to efficiently compute a constrained spline - curve. See "Constrained Cubic Spline Interpolation" by CJC Kruger - (www.korf.co.uk/spline.pdf) for more details. - */ - - double x[npoints]; - double y[npoints]; - uint32_t i; - AutomationList::EventList::const_iterator xx; - - for (i = 0, xx = _list.events().begin(); xx != _list.events().end(); ++xx, ++i) { - x[i] = (double) (*xx)->when; - y[i] = (double) (*xx)->value; - } - - double lp0, lp1, fpone; - - lp0 = (x[1] - x[0])/(y[1] - y[0]); - lp1 = (x[2] - x[1])/(y[2] - y[1]); - - if (lp0*lp1 < 0) { - fpone = 0; - } else { - fpone = 2 / (lp1 + lp0); - } - - double fplast = 0; - - for (i = 0, xx = _list.events().begin(); xx != _list.events().end(); ++xx, ++i) { - - double xdelta; /* gcc is wrong about possible uninitialized use */ - double xdelta2; /* ditto */ - double ydelta; /* ditto */ - double fppL, fppR; - double fpi; - - if (i > 0) { - xdelta = x[i] - x[i-1]; - xdelta2 = xdelta * xdelta; - ydelta = y[i] - y[i-1]; - } - - /* compute (constrained) first derivatives */ - - if (i == 0) { - - /* first segment */ - - fplast = ((3 * (y[1] - y[0]) / (2 * (x[1] - x[0]))) - (fpone * 0.5)); - - /* we don't store coefficients for i = 0 */ - - continue; - - } else if (i == npoints - 1) { - - /* last segment */ - - fpi = ((3 * ydelta) / (2 * xdelta)) - (fplast * 0.5); - - } else { - - /* all other segments */ - - double slope_before = ((x[i+1] - x[i]) / (y[i+1] - y[i])); - double slope_after = (xdelta / ydelta); - - if (slope_after * slope_before < 0.0) { - /* slope changed sign */ - fpi = 0.0; - } else { - fpi = 2 / (slope_before + slope_after); - } - - } - - /* compute second derivative for either side of control point `i' */ - - fppL = (((-2 * (fpi + (2 * fplast))) / (xdelta))) + - ((6 * ydelta) / xdelta2); - - fppR = (2 * ((2 * fpi) + fplast) / xdelta) - - ((6 * ydelta) / xdelta2); - - /* compute polynomial coefficients */ - - double b, c, d; - - d = (fppR - fppL) / (6 * xdelta); - c = ((x[i] * fppL) - (x[i-1] * fppR))/(2 * xdelta); - - double xim12, xim13; - double xi2, xi3; - - xim12 = x[i-1] * x[i-1]; /* "x[i-1] squared" */ - xim13 = xim12 * x[i-1]; /* "x[i-1] cubed" */ - xi2 = x[i] * x[i]; /* "x[i] squared" */ - xi3 = xi2 * x[i]; /* "x[i] cubed" */ - - b = (ydelta - (c * (xi2 - xim12)) - (d * (xi3 - xim13))) / xdelta; - - /* store */ - - (*xx)->create_coeffs(); - (*xx)->coeff[0] = y[i-1] - (b * x[i-1]) - (c * xim12) - (d * xim13); - (*xx)->coeff[1] = b; - (*xx)->coeff[2] = c; - (*xx)->coeff[3] = d; - - fplast = fpi; - } - - } - - _dirty = false; -} - -bool -Curve::rt_safe_get_vector (double x0, double x1, float *vec, int32_t veclen) -{ - Glib::Mutex::Lock lm(_list.lock(), Glib::TRY_LOCK); - - if (!lm.locked()) { - return false; - } else { - _get_vector (x0, x1, vec, veclen); - return true; - } -} - -void -Curve::get_vector (double x0, double x1, float *vec, int32_t veclen) -{ - Glib::Mutex::Lock lm(_list.lock()); - _get_vector (x0, x1, vec, veclen); -} - -void -Curve::_get_vector (double x0, double x1, float *vec, int32_t veclen) -{ - double rx, dx, lx, hx, max_x, min_x; - int32_t i; - int32_t original_veclen; - int32_t npoints; - - if ((npoints = _list.events().size()) == 0) { - for (i = 0; i < veclen; ++i) { - vec[i] = _list.default_value(); - } - return; - } - - /* events is now known not to be empty */ - - max_x = _list.events().back()->when; - min_x = _list.events().front()->when; - - lx = max (min_x, x0); - - if (x1 < 0) { - x1 = _list.events().back()->when; - } - - hx = min (max_x, x1); - - original_veclen = veclen; - - if (x0 < min_x) { - - /* fill some beginning section of the array with the - initial (used to be default) value - */ - - double frac = (min_x - x0) / (x1 - x0); - int32_t subveclen = (int32_t) floor (veclen * frac); - - subveclen = min (subveclen, veclen); - - for (i = 0; i < subveclen; ++i) { - vec[i] = _list.events().front()->value; - } - - veclen -= subveclen; - vec += subveclen; - } - - if (veclen && x1 > max_x) { - - /* fill some end section of the array with the default or final value */ - - double frac = (x1 - max_x) / (x1 - x0); - - int32_t subveclen = (int32_t) floor (original_veclen * frac); - - float val; - - subveclen = min (subveclen, veclen); - - val = _list.events().back()->value; - - i = veclen - subveclen; - - for (i = veclen - subveclen; i < veclen; ++i) { - vec[i] = val; - } - - veclen -= subveclen; - } - - if (veclen == 0) { - return; - } - - if (npoints == 1 ) { - - for (i = 0; i < veclen; ++i) { - vec[i] = _list.events().front()->value; - } - return; - } - - - if (npoints == 2) { - - /* linear interpolation between 2 points */ - - /* XXX I'm not sure that this is the right thing to - do here. but its not a common case for the envisaged - uses. - */ - - if (veclen > 1) { - dx = (hx - lx) / (veclen - 1) ; - } else { - dx = 0; // not used - } - - double slope = (_list.events().back()->value - _list.events().front()->value)/ - (_list.events().back()->when - _list.events().front()->when); - double yfrac = dx*slope; - - vec[0] = _list.events().front()->value + slope * (lx - _list.events().front()->when); - - for (i = 1; i < veclen; ++i) { - vec[i] = vec[i-1] + yfrac; - } - - return; - } - - if (_dirty) { - solve (); - } - - rx = lx; - - if (veclen > 1) { - - dx = (hx - lx) / veclen; - - for (i = 0; i < veclen; ++i, rx += dx) { - vec[i] = multipoint_eval (rx); - } - } -} - -double -Curve::unlocked_eval (double x) -{ - // I don't see the point of this... - - if (_dirty) { - solve (); - } - - return _list.unlocked_eval (x); -} - -double -Curve::multipoint_eval (double x) -{ - pair<AutomationList::EventList::const_iterator,AutomationList::EventList::const_iterator> range; - - AutomationList::LookupCache& lookup_cache = _list.lookup_cache(); - - if ((lookup_cache.left < 0) || - ((lookup_cache.left > x) || - (lookup_cache.range.first == _list.events().end()) || - ((*lookup_cache.range.second)->when < x))) { - - ControlEvent cp (x, 0.0); - - lookup_cache.range = equal_range (_list.events().begin(), _list.events().end(), &cp, AutomationList::time_comparator); - } - - range = lookup_cache.range; - - /* EITHER - - a) x is an existing control point, so first == existing point, second == next point - - OR - - b) x is between control points, so range is empty (first == second, points to where - to insert x) - - */ - - if (range.first == range.second) { - - /* x does not exist within the list as a control point */ - - lookup_cache.left = x; - - if (range.first == _list.events().begin()) { - /* we're before the first point */ - // return default_value; - _list.events().front()->value; - } - - if (range.second == _list.events().end()) { - /* we're after the last point */ - return _list.events().back()->value; - } - - double x2 = x * x; - ControlEvent* ev = *range.second; - - return ev->coeff[0] + (ev->coeff[1] * x) + (ev->coeff[2] * x2) + (ev->coeff[3] * x2 * x); - } - - /* x is a control point in the data */ - /* invalidate the cached range because its not usable */ - lookup_cache.left = -1; - return (*range.first)->value; -} - -extern "C" { - -void -curve_get_vector_from_c (void *arg, double x0, double x1, float* vec, int32_t vecsize) -{ - static_cast<Curve*>(arg)->get_vector (x0, x1, vec, vecsize); -} - -} diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 8158e55cc2..4f92295e55 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -30,7 +30,7 @@ #include <ardour/route.h> #include <ardour/ladspa_plugin.h> #include <ardour/buffer_set.h> -#include <ardour/automation_event.h> +#include <ardour/automation_list.h> #ifdef HAVE_SLV2 #include <ardour/lv2_plugin.h> diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc index 72bc3f23d7..b696f7d410 100644 --- a/libs/ardour/session_command.cc +++ b/libs/ardour/session_command.cc @@ -104,7 +104,7 @@ Session::memento_command_factory(XMLNode *n) } } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name() || obj_T == typeid(MidiTrack).name()) { return new MementoCommand<Route>(*route_by_id(id), before, after); - } else if (obj_T == typeid (Curve).name() || obj_T == typeid (AutomationList).name()) { + } else if (obj_T == typeid (Evoral::Curve).name() || obj_T == typeid (AutomationList).name()) { if (automation_lists.count(id)) return new MementoCommand<AutomationList>(*automation_lists[id], before, after); } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here |