Mercurial > mplayer.hg
annotate libaf/af_surround.c @ 24129:50e1e79056b6
Make terminal input work more like VO key input
The Unix version of getch2() could either return an internally buffered
key or do a second-level select() in addition to the input.c one and
then read more data. Change getch2() to always add all read keys with
mplayer_put_key() (like video output window keyboard input does) and
remove the internal select() from the Unix version. Make input.c call
mplayer_get_key() directly.
The primary motivation for this change is to make combining multiple
event sources under one select() easier. Now getch2() only needs to be
called when the corresponding fd is readable, and it will be possible to
handle events from X-based VOs with the same code.
author | uau |
---|---|
date | Sat, 25 Aug 2007 04:28:08 +0000 |
parents | 904e3f3f8bee |
children | b2402b4f0afa |
rev | line source |
---|---|
8678 | 1 /* |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
2 This is an libaf filter to do simple decoding of matrixed surround |
8678 | 3 sound. This will provide a (basic) surround-sound effect from |
4 audio encoded for Dolby Surround, Pro Logic etc. | |
5 | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
21977
cea0eb833758
Fix FSF address and otherwise broken license headers.
diego
parents:
14275
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
cea0eb833758
Fix FSF address and otherwise broken license headers.
diego
parents:
14275
diff
changeset
|
17 * with this program; if not, write to the Free Software Foundation, Inc., |
cea0eb833758
Fix FSF address and otherwise broken license headers.
diego
parents:
14275
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
8678 | 19 |
20 Original author: Steve Davies <steve@daviesfam.org> | |
21 */ | |
22 | |
23 /* The principle: Make rear channels by extracting anti-phase data | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
24 from the front channels, delay by 20ms and feed to rear in anti-phase |
8678 | 25 */ |
26 | |
27 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
28 /* SPLITREAR: Define to decode two distinct rear channels - this |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
29 doesn't work so well in practice because separation in a passive |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
30 matrix is not high. C (dialogue) to Ls and Rs 14dB or so - so |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
31 dialogue leaks to the rear. Still - give it a try and send |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
32 feedback. Comment this define for old behavior of a single |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
33 surround sent to rear in anti-phase */ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
34 #define SPLITREAR 1 |
8678 | 35 |
36 #include <stdio.h> | |
37 #include <stdlib.h> | |
38 #include <string.h> | |
39 | |
40 #include "af.h" | |
41 #include "dsp.h" | |
42 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
43 #define L 32 // Length of fir filter |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
44 #define LD 65536 // Length of delay buffer |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
45 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
46 // 32 Tap fir filter loop unrolled |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
47 #define FIR(x,w,y) \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
48 y = ( w[0] *x[0] +w[1] *x[1] +w[2] *x[2] +w[3] *x[3] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
49 + w[4] *x[4] +w[5] *x[5] +w[6] *x[6] +w[7] *x[7] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
50 + w[8] *x[8] +w[9] *x[9] +w[10]*x[10]+w[11]*x[11] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
51 + w[12]*x[12]+w[13]*x[13]+w[14]*x[14]+w[15]*x[15] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
52 + w[16]*x[16]+w[17]*x[17]+w[18]*x[18]+w[19]*x[19] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
53 + w[20]*x[20]+w[21]*x[21]+w[22]*x[22]+w[23]*x[23] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
54 + w[24]*x[24]+w[25]*x[25]+w[26]*x[26]+w[27]*x[27] \ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
55 + w[28]*x[28]+w[29]*x[29]+w[30]*x[30]+w[31]*x[31]) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
56 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
57 // Add to circular queue macro + update index |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
58 #ifdef SPLITREAR |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
59 #define ADDQUE(qi,rq,lq,r,l)\ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
60 lq[qi]=lq[qi+L]=(l);\ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
61 rq[qi]=rq[qi+L]=(r);\ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
62 qi=(qi-1)&(L-1); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
63 #else |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
64 #define ADDQUE(qi,lq,l)\ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
65 lq[qi]=lq[qi+L]=(l);\ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
66 qi=(qi-1)&(L-1); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
67 #endif |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
68 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
69 // Macro for updating queue index in delay queues |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
70 #define UPDATEQI(qi) qi=(qi+1)&(LD-1) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
71 |
8678 | 72 // instance data |
73 typedef struct af_surround_s | |
74 { | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
75 float lq[2*L]; // Circular queue for filtering left rear channel |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
76 float rq[2*L]; // Circular queue for filtering right rear channel |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
77 float w[L]; // FIR filter coefficients for surround sound 7kHz low-pass |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
78 float* dr; // Delay queue right rear channel |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
79 float* dl; // Delay queue left rear channel |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
80 float d; // Delay time |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
81 int i; // Position in circular buffer |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
82 int wi; // Write index for delay queue |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
83 int ri; // Read index for delay queue |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
84 }af_surround_t; |
8678 | 85 |
86 // Initialization and runtime control | |
87 static int control(struct af_instance_s* af, int cmd, void* arg) | |
88 { | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
89 af_surround_t *s = af->setup; |
8678 | 90 switch(cmd){ |
91 case AF_CONTROL_REINIT:{ | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
92 float fc; |
8678 | 93 af->data->rate = ((af_data_t*)arg)->rate; |
94 af->data->nch = ((af_data_t*)arg)->nch*2; | |
14245 | 95 af->data->format = AF_FORMAT_FLOAT_NE; |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
96 af->data->bps = 4; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
97 |
8678 | 98 if (af->data->nch != 4){ |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
99 af_msg(AF_MSG_ERROR,"[surround] Only stereo input is supported.\n"); |
8678 | 100 return AF_DETACH; |
101 } | |
102 // Surround filer coefficients | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
103 fc = 2.0 * 7000.0/(float)af->data->rate; |
14275
de13fd557440
less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents:
14245
diff
changeset
|
104 if (-1 == af_filter_design_fir(L, s->w, &fc, LP|HAMMING, 0)){ |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
105 af_msg(AF_MSG_ERROR,"[surround] Unable to design low-pass filter.\n"); |
8678 | 106 return AF_ERROR; |
107 } | |
108 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
109 // Free previous delay queues |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
110 if(s->dl) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
111 free(s->dl); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
112 if(s->dr) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
113 free(s->dr); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
114 // Allocate new delay queues |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
115 s->dl = calloc(LD,af->data->bps); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
116 s->dr = calloc(LD,af->data->bps); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
117 if((NULL == s->dl) || (NULL == s->dr)) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
118 af_msg(AF_MSG_FATAL,"[delay] Out of memory\n"); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
119 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
120 // Initialize delay queue index |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
121 if(AF_OK != af_from_ms(1, &s->d, &s->wi, af->data->rate, 0.0, 1000.0)) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
122 return AF_ERROR; |
12569 | 123 // printf("%i\n",s->wi); |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
124 s->ri = 0; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
125 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
126 if((af->data->format != ((af_data_t*)arg)->format) || |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
127 (af->data->bps != ((af_data_t*)arg)->bps)){ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
128 ((af_data_t*)arg)->format = af->data->format; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
129 ((af_data_t*)arg)->bps = af->data->bps; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
130 return AF_FALSE; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
131 } |
8678 | 132 return AF_OK; |
133 } | |
134 case AF_CONTROL_COMMAND_LINE:{ | |
135 float d = 0; | |
136 sscanf((char*)arg,"%f",&d); | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
137 if ((d < 0) || (d > 1000)){ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
138 af_msg(AF_MSG_ERROR,"[surround] Invalid delay time, valid time values" |
10719
caec33353477
1000l and I imho this would win 'The Bug/Typo of the Year' award
alex
parents:
8763
diff
changeset
|
139 " are 0ms to 1000ms current value is %0.3f ms\n",d); |
8678 | 140 return AF_ERROR; |
141 } | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
142 s->d = d; |
8678 | 143 return AF_OK; |
144 } | |
145 } | |
146 return AF_UNKNOWN; | |
147 } | |
148 | |
149 // Deallocate memory | |
150 static void uninit(struct af_instance_s* af) | |
151 { | |
22176 | 152 if(af->data) |
8678 | 153 free(af->data->audio); |
22176 | 154 free(af->data); |
155 free(af->setup); | |
8678 | 156 } |
157 | |
158 // The beginnings of an active matrix... | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
159 static float steering_matrix[][12] = { |
8678 | 160 // LL RL LR RR LS RS |
161 // LLs RLs LRs RRs LC RC | |
162 {.707, .0, .0, .707, .5, -.5, | |
163 .5878, -.3928, .3928, -.5878, .5, .5}, | |
164 }; | |
165 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
166 // Experimental moving average dominance |
8678 | 167 //static int amp_L = 0, amp_R = 0, amp_C = 0, amp_S = 0; |
168 | |
169 // Filter data through filter | |
170 static af_data_t* play(struct af_instance_s* af, af_data_t* data){ | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
171 af_surround_t* s = (af_surround_t*)af->setup; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
172 float* m = steering_matrix[0]; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
173 float* in = data->audio; // Input audio data |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
174 float* out = NULL; // Output audio data |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
175 float* end = in + data->len / sizeof(float); // Loop end |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
176 int i = s->i; // Filter queue index |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
177 int ri = s->ri; // Read index for delay queue |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
178 int wi = s->wi; // Write index for delay queue |
8678 | 179 |
180 if (AF_OK != RESIZE_LOCAL_BUFFER(af, data)) | |
181 return NULL; | |
182 | |
183 out = af->data->audio; | |
184 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
185 while(in < end){ |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
186 /* Dominance: |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
187 abs(in[0]) abs(in[1]); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
188 abs(in[0]+in[1]) abs(in[0]-in[1]); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
189 10 * log( abs(in[0]) / (abs(in[1])|1) ); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
190 10 * log( abs(in[0]+in[1]) / (abs(in[0]-in[1])|1) ); */ |
8678 | 191 |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
192 /* About volume balancing... |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
193 Surround encoding does the following: |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
194 Lt=L+.707*C+.707*S, Rt=R+.707*C-.707*S |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
195 So S should be extracted as: |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
196 (Lt-Rt) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
197 But we are splitting the S to two output channels, so we |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
198 must take 3dB off as we split it: |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
199 Ls=Rs=.707*(Lt-Rt) |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
200 Trouble is, Lt could be +1, Rt -1, so possibility that S will |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
201 overflow. So to avoid that, we cut L/R by 3dB (*.707), and S by |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
202 6dB (/2). This keeps the overall balance, but guarantees no |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
203 overflow. */ |
8678 | 204 |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
205 // Output front left and right |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
206 out[0] = m[0]*in[0] + m[1]*in[1]; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
207 out[1] = m[2]*in[0] + m[3]*in[1]; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
208 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
209 // Low-pass output @ 7kHz |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
210 FIR((&s->lq[i]), s->w, s->dl[wi]); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
211 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
212 // Delay output by d ms |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
213 out[2] = s->dl[ri]; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
214 |
8678 | 215 #ifdef SPLITREAR |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
216 // Low-pass output @ 7kHz |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
217 FIR((&s->rq[i]), s->w, s->dr[wi]); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
218 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
219 // Delay output by d ms |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
220 out[3] = s->dr[ri]; |
8678 | 221 #else |
222 out[3] = -out[2]; | |
223 #endif | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
224 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
225 // Update delay queues indexes |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
226 UPDATEQI(ri); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
227 UPDATEQI(wi); |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
228 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
229 // Calculate and save surround in circular queue |
8678 | 230 #ifdef SPLITREAR |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
231 ADDQUE(i, s->rq, s->lq, m[6]*in[0]+m[7]*in[1], m[8]*in[0]+m[9]*in[1]); |
8678 | 232 #else |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
233 ADDQUE(i, s->lq, m[4]*in[0]+m[5]*in[1]); |
8678 | 234 #endif |
235 | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
236 // Next sample... |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
237 in = &in[data->nch]; |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
238 out = &out[af->data->nch]; |
8678 | 239 } |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
240 |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
241 // Save indexes |
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
242 s->i = i; s->ri = ri; s->wi = wi; |
8678 | 243 |
244 // Set output data | |
245 data->audio = af->data->audio; | |
246 data->len = (data->len*af->mul.n)/af->mul.d; | |
247 data->nch = af->data->nch; | |
248 | |
249 return data; | |
250 } | |
251 | |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
22176
diff
changeset
|
252 static int af_open(af_instance_t* af){ |
8678 | 253 af->control=control; |
254 af->uninit=uninit; | |
255 af->play=play; | |
256 af->mul.n=2; | |
257 af->mul.d=1; | |
258 af->data=calloc(1,sizeof(af_data_t)); | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
259 af->setup=calloc(1,sizeof(af_surround_t)); |
8678 | 260 if(af->data == NULL || af->setup == NULL) |
261 return AF_ERROR; | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
262 ((af_surround_t*)af->setup)->d = 20; |
8678 | 263 return AF_OK; |
264 } | |
265 | |
266 af_info_t af_info_surround = | |
267 { | |
268 "Surround decoder filter", | |
269 "surround", | |
270 "Steve Davies <steve@daviesfam.org>", | |
271 "", | |
8763
19e96e60a3d0
Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
anders
parents:
8678
diff
changeset
|
272 AF_FLAGS_NOT_REENTRANT, |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
22176
diff
changeset
|
273 af_open |
8678 | 274 }; |