1 /*
2 * fader.cc
3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath
4 * DIN Is Noise is released under GNU Public License 2.0
5 * For more information, please visit https://dinisnoise.org/
6 */
7
8 #include "fader.h"
9 #include "chrono.h"
10 #include "log.h"
11
12 using namespace std;
13
fader(double dt)14 fader::fader (double dt) : afl (0) {
15 set (0.0f, 1.0f, 0, dt);
16 }
17
fader(float vs,float ve)18 fader::fader (float vs, float ve) : afl (0) {
19 set (vs, ve, 0);
20 }
21
load(ifstream & f)22 void fader::load (ifstream& f) {
23 f >> start >> end >> on >> delta >> flip >> delta_time >> reached;
24 start_time = ui_clk ();
25 }
26
save(ofstream & f)27 void fader::save (ofstream& f) {
28 f << start << spc << end << spc << on << spc << delta << spc << flip << spc << delta_time << spc << reached;
29 }
30
set(float vs,float ve,int _on,double dt)31 void fader::set (float vs, float ve, int _on, double dt) {
32
33 start = vs;
34 end = ve;
35 delta = end - start;
36
37 alpha = 0;
38 amount = start;
39
40 delta_time = dt;
41
42 on = _on;
43 reached = 0;
44 start_time = ui_clk();
45
46 }
47
eval()48 int fader::eval () {
49 if (on) {
50 double dt = ui_clk() - start_time;
51 if (dt < delta_time) {
52 alpha = dt * 1.0f / delta_time;
53 amount = start + alpha * delta;
54 } else {
55 if (reached) {
56 on = 0;
57 if (afl) afl->after_fade (*this);
58 } else {
59 reached = 1;
60 alpha = 1.0f;
61 amount = end;
62 }
63 }
64 }
65 return on;
66 }
67
restart()68 void fader::restart () {
69 on = 1;
70 reached = 0;
71 alpha = 0;
72 amount = start;
73 start_time = ui_clk();
74 }
75
copy(fader * src)76 void fader::copy (fader* src) {
77
78 if (src == 0) return;
79
80 start = src->start;
81 end = src->end;
82 delta = src->delta;
83
84 if (delta < 0) flip = 1; else flip = 0;
85
86 alpha = src->alpha;
87 amount = src->amount;
88
89 delta_time = src->delta_time;
90
91 on = src->on;
92 reached = src->reached;
93 start_time = src->start_time;
94
95 afl = src->afl;
96
97 }
98
retime(double dt)99 void fader::retime (double dt) {
100 delta_time = dt;
101 start_time = ui_clk () - alpha * delta_time;
102 }
103