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