drastic, deep and wide changes to make RouteGroup use boost::shared_ptr<Route> and...
[ardour.git] / libs / ardour / ardour / pi_controller.h
1 /*
2   Copyright (C) 2008 Torben Hohn
3   
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2 of the License, or
7   (at your option) any later version.
8   
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software
16   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef __libardour_pi_controller__
20 #define __libardour_pi_controller__
21
22 #include "ardour/types.h"
23
24 class PIController {
25
26   public:
27     PIController (double resample_factor, int fir_size);
28     ~PIController();
29         
30     void reset (double resample_factor) {
31             resample_mean = resample_factor;
32             static_resample_factor = resample_factor;
33             out_of_bounds ();
34     }
35         
36     double get_ratio (int fill_level);
37     void out_of_bounds();
38
39   public:
40     double  resample_mean;
41     double  static_resample_factor;
42     double* offset_array;
43     double* window_array;
44     int     offset_differential_index;
45     double  offset_integral;
46     double  catch_factor;
47     double  catch_factor2;
48     double  pclamp;
49     double  controlquant;
50     int     smooth_size;
51     double  smooth_offset;
52     double  current_resample_factor;
53     bool    fir_empty;
54 };
55
56 #define ESTIMATOR_SIZE 16
57
58 class PIChaser {
59   public:
60     PIChaser();
61     ~PIChaser();
62
63     double get_ratio( nframes64_t realtime, nframes64_t chasetime, nframes64_t slavetime, bool in_control );
64     void reset();
65     nframes64_t want_locate() { return want_locate_val; }
66
67   private:
68     PIController *pic;
69     nframes64_t realtime_stamps[ESTIMATOR_SIZE];
70     nframes64_t chasetime_stamps[ESTIMATOR_SIZE];
71     int array_index;
72     nframes64_t want_locate_val;
73
74     void feed_estimator( nframes64_t realtime, nframes64_t chasetime );
75     double get_estimate();
76
77     double speed;
78
79     double speed_threshold;
80     nframes64_t pos_threshold;
81 };
82
83
84 #endif /* __libardour_pi_controller__ */