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