1 #include <stdlib.h>
2 #include <math.h>
3 #include "soundpipe.h"
4 
5 #ifndef M_PI
6 #define M_PI		3.14159265358979323846
7 #endif
8 
9 #define SQRT2 1.41421356237309504880
10 
11 
sp_panst_create(sp_panst ** p)12 int sp_panst_create(sp_panst **p)
13 {
14     *p = malloc(sizeof(sp_panst));
15     return SP_OK;
16 }
17 
sp_panst_destroy(sp_panst ** p)18 int sp_panst_destroy(sp_panst **p)
19 {
20     free(*p);
21     return SP_OK;
22 }
23 
sp_panst_init(sp_data * sp,sp_panst * p)24 int sp_panst_init(sp_data *sp, sp_panst *p)
25 {
26     p->type = 0;
27     p->pan = 0;
28     return SP_OK;
29 }
30 
sp_panst_compute(sp_data * sp,sp_panst * p,SPFLOAT * in1,SPFLOAT * in2,SPFLOAT * out1,SPFLOAT * out2)31 int sp_panst_compute(sp_data *sp, sp_panst *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out1, SPFLOAT *out2)
32 {
33     /* Send the signal's input to the output */
34     uint32_t type = p->type;
35     SPFLOAT pan = (p->pan + 1.0) * 0.5;
36     SPFLOAT cc, ss, l, r;
37 
38     type %= 4;
39 
40     switch (type) {
41         /* Equal power */
42         case 0:
43         pan = M_PI * 0.5 * pan;
44         *out1 = *in1 * cos(pan);
45         *out2 = *in2 * sin(pan);
46         break;
47 
48         /* Square root */
49         case 1:
50         *out1 = *in1 * sqrt(pan);
51         *out2 = *in2 * sqrt(1.0 - pan);
52         break;
53 
54         /* simple linear */
55         case 2:
56         *out1 = *in1 * (1.0 - pan);
57         *out2 = *in2 * pan;
58         break;
59 
60         /* Equal power (alternative) */
61         case 3:
62 
63         cc = cos(M_PI * pan * 0.5);
64         ss = sin(M_PI * pan * 0.5);
65         l = SQRT2 * (cc + ss) * 0.5;
66         r = SQRT2 * (cc - ss) * 0.5;
67         *out1 = *in1 * l;
68         *out2 = *in2 * r;
69         break;
70     }
71 
72     return SP_OK;
73 }
74