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