1 #include <stdlib.h>
2 #include <math.h>
3 #include "soundpipe.h"
4
sp_tseg_create(sp_tseg ** p)5 int sp_tseg_create(sp_tseg **p)
6 {
7 *p = malloc(sizeof(sp_tseg));
8 return SP_OK;
9 }
10
sp_tseg_destroy(sp_tseg ** p)11 int sp_tseg_destroy(sp_tseg **p)
12 {
13 free(*p);
14 return SP_OK;
15 }
16
sp_tseg_init(sp_data * sp,sp_tseg * p,SPFLOAT ibeg)17 int sp_tseg_init(sp_data *sp, sp_tseg *p, SPFLOAT ibeg)
18 {
19 p->beg = ibeg;
20 p->end = 1.0;
21 p->val = ibeg;
22 p->type = -3;
23 p->slope = 1.0;
24 p->dur = 1.0;
25 p->tdivnsteps = 0.0;
26 p->count = 0;
27 p->steps = p->dur * sp->sr;
28 return SP_OK;
29 }
30
sp_tseg_compute(sp_data * sp,sp_tseg * p,SPFLOAT * in,SPFLOAT * out)31 int sp_tseg_compute(sp_data *sp, sp_tseg *p, SPFLOAT *in, SPFLOAT *out)
32 {
33 *out = p->val;
34 if(*in != 0) {
35 p->slope = 1.0 / (1.0 - exp(p->type));
36 p->beg = p->val;
37 p->count = 0;
38 p->steps = p->dur * sp->sr;
39 p->tdivnsteps = (SPFLOAT)p->type / (p->steps - 1);
40 }
41 if(p->count < p->steps) {
42 *out = p->beg + (p->end - p->beg) *
43 ((1 - exp(p->count * p->tdivnsteps)) * p->slope);
44 p->val = *out;
45 p->count++;
46 }
47 return SP_OK;
48 }
49