annotate libaf/af_hrtf.c @ 35467:364387ae95f4

Fix bug with stop button and playlist. Although the current file was stopped and its information still displayed, play would skip to next file in list. Now, the file stopped can be resumed.
author ib
date Sun, 02 Dec 2012 15:56:19 +0000
parents 318c7824c50d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28229
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
1 /*
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
2 * Experimental audio filter that mixes 5.1 and 5.1 with matrix
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
3 * encoded rear channels into headphone signal using FIR filtering
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
4 * with HRTF.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
5 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
6 * This file is part of MPlayer.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
7 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
8 * MPlayer is free software; you can redistribute it and/or modify
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
9 * it under the terms of the GNU General Public License as published by
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
11 * (at your option) any later version.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
12 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
13 * MPlayer is distributed in the hope that it will be useful,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
16 * GNU General Public License for more details.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
17 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
18 * You should have received a copy of the GNU General Public License along
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
19 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
21 */
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 28057
diff changeset
22
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
23 //#include <stdio.h>
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
24 #include <stdlib.h>
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
25 #include <string.h>
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
26 #include <inttypes.h>
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
27
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
28 #include <math.h>
35210
318c7824c50d af_hrtf: clamp output to relieve noises
upsuper
parents: 34174
diff changeset
29 #include <libavutil/common.h>
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
30
34174
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 32537
diff changeset
31 #include "mp_msg.h"
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
32 #include "af.h"
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
33 #include "dsp.h"
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
34
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
35 /* HRTF filter coefficients and adjustable parameters */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
36 #include "af_hrtf.h"
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
37
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
38 typedef struct af_hrtf_s {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
39 /* Lengths */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
40 int dlbuflen, hrflen, basslen;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
41 /* L, C, R, Ls, Rs channels */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
42 float *lf, *rf, *lr, *rr, *cf, *cr;
28057
e29d1b1afdc7 Add const to avoid warnings about discarded qualifiers.
reimar
parents: 24888
diff changeset
43 const float *cf_ir, *af_ir, *of_ir, *ar_ir, *or_ir, *cr_ir;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
44 int cf_o, af_o, of_o, ar_o, or_o, cr_o;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
45 /* Bass */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
46 float *ba_l, *ba_r;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
47 float *ba_ir;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
48 /* Whether to matrix decode the rear center channel */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
49 int matrix_mode;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
50 /* How to decode the input:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
51 0 = 5/5+1 channels
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
52 1 = 2 channels
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
53 2 = matrix encoded 2 channels */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
54 int decode_mode;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
55 /* Full wave rectified (FWR) amplitudes and gain used to steer the
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
56 active matrix decoding of front channels (variable names
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
57 lpr/lmr means Lt + Rt, Lt - Rt) */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
58 float l_fwr, r_fwr, lpr_fwr, lmr_fwr;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
59 float adapt_l_gain, adapt_r_gain, adapt_lpr_gain, adapt_lmr_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
60 /* Matrix input decoding require special FWR buffer, since the
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
61 decoding is done in place. */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
62 float *fwrbuf_l, *fwrbuf_r, *fwrbuf_lr, *fwrbuf_rr;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
63 /* Rear channel delay buffer for matrix decoding */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
64 float *rear_dlbuf;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
65 /* Full wave rectified amplitude and gain used to steer the active
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
66 matrix decoding of center rear channel */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
67 float lr_fwr, rr_fwr, lrprr_fwr, lrmrr_fwr;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
68 float adapt_lr_gain, adapt_rr_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
69 float adapt_lrprr_gain, adapt_lrmrr_gain;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
70 /* Cyclic position on the ring buffer */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
71 int cyc_pos;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
72 int print_flag;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
73 } af_hrtf_t;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
74
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
75 /* Convolution on a ring buffer
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
76 * nx: length of the ring buffer
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
77 * nk: length of the convolution kernel
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
78 * sx: ring buffer
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
79 * sk: convolution kernel
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
80 * offset: offset on the ring buffer, can be
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
81 */
28057
e29d1b1afdc7 Add const to avoid warnings about discarded qualifiers.
reimar
parents: 24888
diff changeset
82 static float conv(const int nx, const int nk, const float *sx, const float *sk,
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
83 const int offset)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
84 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
85 /* k = reminder of offset / nx */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
86 int k = offset >= 0 ? offset % nx : nx + (offset % nx);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
87
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
88 if(nk + k <= nx)
14275
de13fd557440 less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents: 14245
diff changeset
89 return af_filter_fir(nk, sx + k, sk);
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
90 else
14275
de13fd557440 less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents: 14245
diff changeset
91 return af_filter_fir(nk + k - nx, sx, sk + nx - k) +
de13fd557440 less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents: 14245
diff changeset
92 af_filter_fir(nx - k, sx + k, sk);
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
93 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
94
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
95 /* Detect when the impulse response starts (significantly) */
28057
e29d1b1afdc7 Add const to avoid warnings about discarded qualifiers.
reimar
parents: 24888
diff changeset
96 static int pulse_detect(const float *sx)
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
97 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
98 /* nmax must be the reference impulse response length (128) minus
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
99 s->hrflen */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
100 const int nmax = 128 - HRTFFILTLEN;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
101 const float thresh = IRTHRESH;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
102 int i;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
103
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
104 for(i = 0; i < nmax; i++)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
105 if(fabs(sx[i]) > thresh)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
106 return i;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
107 return 0;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
108 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
109
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
110 /* Fuzzy matrix coefficient transfer function to "lock" the matrix on
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
111 a effectively passive mode if the gain is approximately 1 */
18967
36db63e8e5d7 makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 15384
diff changeset
112 static inline float passive_lock(float x)
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
113 {
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
114 const float x1 = x - 1;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
115 const float ax1s = fabs(x - 1) * (1.0 / MATAGCLOCK);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
116
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
117 return x1 - x1 / (1 + ax1s * ax1s) + 1;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
118 }
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
119
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
120 /* Unified active matrix decoder for 2 channel matrix encoded surround
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
121 sources */
18967
36db63e8e5d7 makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 15384
diff changeset
122 static inline void matrix_decode(short *in, const int k, const int il,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
123 const int ir, const int decode_rear,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
124 const int dlbuflen,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
125 float l_fwr, float r_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
126 float lpr_fwr, float lmr_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
127 float *adapt_l_gain, float *adapt_r_gain,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
128 float *adapt_lpr_gain, float *adapt_lmr_gain,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
129 float *lf, float *rf, float *lr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
130 float *rr, float *cf)
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
131 {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
132 const int kr = (k + MATREARDELAY) % dlbuflen;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
133 float l_gain = (l_fwr + r_fwr) /
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
134 (1 + l_fwr + l_fwr);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
135 float r_gain = (l_fwr + r_fwr) /
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
136 (1 + r_fwr + r_fwr);
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
137 /* The 2nd axis has strong gain fluctuations, and therefore require
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
138 limits. The factor corresponds to the 1 / amplification of (Lt
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
139 - Rt) when (Lt, Rt) is strongly correlated. (e.g. during
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
140 dialogues). It should be bigger than -12 dB to prevent
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
141 distortion. */
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
142 float lmr_lim_fwr = lmr_fwr > M9_03DB * lpr_fwr ?
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
143 lmr_fwr : M9_03DB * lpr_fwr;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
144 float lpr_gain = (lpr_fwr + lmr_lim_fwr) /
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
145 (1 + lpr_fwr + lpr_fwr);
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
146 float lmr_gain = (lpr_fwr + lmr_lim_fwr) /
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
147 (1 + lmr_lim_fwr + lmr_lim_fwr);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
148 float lmr_unlim_gain = (lpr_fwr + lmr_fwr) /
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
149 (1 + lmr_fwr + lmr_fwr);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
150 float lpr, lmr;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
151 float l_agc, r_agc, lpr_agc, lmr_agc;
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
152 float f, d_gain, c_gain, c_agc_cfk;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
153
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
154 #if 0
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
155 static int counter = 0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
156 static FILE *fp_out;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
157
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
158 if(counter == 0)
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
159 fp_out = fopen("af_hrtf.log", "w");
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
160 if(counter % 240 == 0)
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
161 fprintf(fp_out, "%g %g %g %g %g ", counter * (1.0 / 48000),
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
162 l_gain, r_gain, lpr_gain, lmr_gain);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
163 #endif
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
164
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
165 /*** AXIS NO. 1: (Lt, Rt) -> (C, Ls, Rs) ***/
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
166 /* AGC adaption */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
167 d_gain = (fabs(l_gain - *adapt_l_gain) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
168 fabs(r_gain - *adapt_r_gain)) * 0.5;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
169 f = d_gain * (1.0 / MATAGCTRIG);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
170 f = MATAGCDECAY - MATAGCDECAY / (1 + f * f);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
171 *adapt_l_gain = (1 - f) * *adapt_l_gain + f * l_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
172 *adapt_r_gain = (1 - f) * *adapt_r_gain + f * r_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
173 /* Matrix */
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
174 l_agc = in[il] * passive_lock(*adapt_l_gain);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
175 r_agc = in[ir] * passive_lock(*adapt_r_gain);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
176 cf[k] = (l_agc + r_agc) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
177 if(decode_rear) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
178 lr[kr] = rr[kr] = (l_agc - r_agc) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
179 /* Stereo rear channel is steered with the same AGC steering as
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
180 the decoding matrix. Note this requires a fast updating AGC
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
181 at the order of 20 ms (which is the case here). */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
182 lr[kr] *= (l_fwr + l_fwr) /
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
183 (1 + l_fwr + r_fwr);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
184 rr[kr] *= (r_fwr + r_fwr) /
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
185 (1 + l_fwr + r_fwr);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
186 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
187
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
188 /*** AXIS NO. 2: (Lt + Rt, Lt - Rt) -> (L, R) ***/
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
189 lpr = (in[il] + in[ir]) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
190 lmr = (in[il] - in[ir]) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
191 /* AGC adaption */
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
192 d_gain = fabs(lmr_unlim_gain - *adapt_lmr_gain);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
193 f = d_gain * (1.0 / MATAGCTRIG);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
194 f = MATAGCDECAY - MATAGCDECAY / (1 + f * f);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
195 *adapt_lpr_gain = (1 - f) * *adapt_lpr_gain + f * lpr_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
196 *adapt_lmr_gain = (1 - f) * *adapt_lmr_gain + f * lmr_gain;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
197 /* Matrix */
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
198 lpr_agc = lpr * passive_lock(*adapt_lpr_gain);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
199 lmr_agc = lmr * passive_lock(*adapt_lmr_gain);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
200 lf[k] = (lpr_agc + lmr_agc) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
201 rf[k] = (lpr_agc - lmr_agc) * M_SQRT1_2;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
202
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
203 /*** CENTER FRONT CANCELLATION ***/
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
204 /* A heuristic approach exploits that Lt + Rt gain contains the
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
205 information about Lt, Rt correlation. This effectively reshapes
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
206 the front and rear "cones" to concentrate Lt + Rt to C and
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
207 introduce Lt - Rt in L, R. */
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
208 /* 0.67677 is the emprical lower bound for lpr_gain. */
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
209 c_gain = 8 * (*adapt_lpr_gain - 0.67677);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
210 c_gain = c_gain > 0 ? c_gain : 0;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
211 /* c_gain should not be too high, not even reaching full
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
212 cancellation (~ 0.50 - 0.55 at current AGC implementation), or
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
213 the center will s0und too narrow. */
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
214 c_gain = MATCOMPGAIN / (1 + c_gain * c_gain);
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
215 c_agc_cfk = c_gain * cf[k];
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
216 lf[k] -= c_agc_cfk;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
217 rf[k] -= c_agc_cfk;
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
218 cf[k] += c_agc_cfk + c_agc_cfk;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
219 #if 0
15124
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
220 if(counter % 240 == 0)
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
221 fprintf(fp_out, "%g %g %g %g %g\n",
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
222 *adapt_l_gain, *adapt_r_gain,
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
223 *adapt_lpr_gain, *adapt_lmr_gain,
e267fad254fb More HRTF enhancements
henry
parents: 15082
diff changeset
224 c_gain);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
225 counter++;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
226 #endif
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
227 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
228
18967
36db63e8e5d7 makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 15384
diff changeset
229 static inline void update_ch(af_hrtf_t *s, short *in, const int k)
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
230 {
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
231 const int fwr_pos = (k + FWRDURATION) % s->dlbuflen;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
232 /* Update the full wave rectified total amplitude */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
233 /* Input matrix decoder */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
234 if(s->decode_mode == HRTF_MIX_MATRIX2CH) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
235 s->l_fwr += abs(in[0]) - fabs(s->fwrbuf_l[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
236 s->r_fwr += abs(in[1]) - fabs(s->fwrbuf_r[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
237 s->lpr_fwr += abs(in[0] + in[1]) -
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
238 fabs(s->fwrbuf_l[fwr_pos] + s->fwrbuf_r[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
239 s->lmr_fwr += abs(in[0] - in[1]) -
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
240 fabs(s->fwrbuf_l[fwr_pos] - s->fwrbuf_r[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
241 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
242 /* Rear matrix decoder */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
243 if(s->matrix_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
244 s->lr_fwr += abs(in[2]) - fabs(s->fwrbuf_lr[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
245 s->rr_fwr += abs(in[3]) - fabs(s->fwrbuf_rr[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
246 s->lrprr_fwr += abs(in[2] + in[3]) -
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
247 fabs(s->fwrbuf_lr[fwr_pos] + s->fwrbuf_rr[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
248 s->lrmrr_fwr += abs(in[2] - in[3]) -
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
249 fabs(s->fwrbuf_lr[fwr_pos] - s->fwrbuf_rr[fwr_pos]);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
250 }
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
251
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
252 switch (s->decode_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
253 case HRTF_MIX_51:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
254 /* 5/5+1 channel sources */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
255 s->lf[k] = in[0];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
256 s->cf[k] = in[4];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
257 s->rf[k] = in[1];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
258 s->fwrbuf_lr[k] = s->lr[k] = in[2];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
259 s->fwrbuf_rr[k] = s->rr[k] = in[3];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
260 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
261 case HRTF_MIX_MATRIX2CH:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
262 /* Matrix encoded 2 channel sources */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
263 s->fwrbuf_l[k] = in[0];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
264 s->fwrbuf_r[k] = in[1];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
265 matrix_decode(in, k, 0, 1, 1, s->dlbuflen,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
266 s->l_fwr, s->r_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
267 s->lpr_fwr, s->lmr_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
268 &(s->adapt_l_gain), &(s->adapt_r_gain),
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
269 &(s->adapt_lpr_gain), &(s->adapt_lmr_gain),
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
270 s->lf, s->rf, s->lr, s->rr, s->cf);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
271 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
272 case HRTF_MIX_STEREO:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
273 /* Stereo sources */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
274 s->lf[k] = in[0];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
275 s->rf[k] = in[1];
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
276 s->cf[k] = s->lr[k] = s->rr[k] = 0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
277 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
278 }
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
279
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
280 /* We need to update the bass compensation delay line, too. */
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
281 s->ba_l[k] = in[0] + in[4] + in[2];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
282 s->ba_r[k] = in[4] + in[1] + in[3];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
283 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
284
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
285 /* Initialization and runtime control */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
286 static int control(struct af_instance_s *af, int cmd, void* arg)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
287 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
288 af_hrtf_t *s = af->setup;
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
289 int test_output_res;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
290 char mode;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
291
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
292 switch(cmd) {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
293 case AF_CONTROL_REINIT:
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
294 af->data->rate = ((af_data_t*)arg)->rate;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
295 if(af->data->rate != 48000) {
14213
3c56b18bbb0c Make filters request a supported input format instead of failing.
reimar
parents: 13996
diff changeset
296 // automatic samplerate adjustment in the filter chain
3c56b18bbb0c Make filters request a supported input format instead of failing.
reimar
parents: 13996
diff changeset
297 // is not yet supported.
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
298 mp_msg(MSGT_AFILTER, MSGL_ERR,
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
299 "[hrtf] ERROR: Sampling rate is not 48000 Hz (%d)!\n",
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
300 af->data->rate);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
301 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
302 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
303 af->data->nch = ((af_data_t*)arg)->nch;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
304 if(af->data->nch == 2) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
305 /* 2 channel input */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
306 if(s->decode_mode != HRTF_MIX_MATRIX2CH) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
307 /* Default behavior is stereo mixing. */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
308 s->decode_mode = HRTF_MIX_STEREO;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
309 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
310 }
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
311 else if (af->data->nch < 5)
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
312 af->data->nch = 5;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14213
diff changeset
313 af->data->format = AF_FORMAT_S16_NE;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
314 af->data->bps = 2;
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
315 test_output_res = af_test_output(af, (af_data_t*)arg);
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 22748
diff changeset
316 af->mul = 2.0 / af->data->nch;
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
317 // after testing input set the real output format
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
318 af->data->nch = 2;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
319 s->print_flag = 1;
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
320 return test_output_res;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
321 case AF_CONTROL_COMMAND_LINE:
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
322 sscanf((char*)arg, "%c", &mode);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
323 switch(mode) {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
324 case 'm':
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
325 /* Use matrix rear decoding. */
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
326 s->matrix_mode = 1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
327 break;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
328 case 's':
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
329 /* Input needs matrix decoding. */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
330 s->decode_mode = HRTF_MIX_MATRIX2CH;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
331 break;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
332 case '0':
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
333 s->matrix_mode = 0;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
334 break;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
335 default:
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
336 mp_msg(MSGT_AFILTER, MSGL_ERR,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
337 "[hrtf] Mode is neither 'm', 's', nor '0' (%c).\n",
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
338 mode);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
339 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
340 }
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
341 s->print_flag = 1;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
342 return AF_OK;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
343 }
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
344
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
345 return AF_UNKNOWN;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
346 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
347
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
348 /* Deallocate memory */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
349 static void uninit(struct af_instance_s *af)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
350 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
351 if(af->setup) {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
352 af_hrtf_t *s = af->setup;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
353
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
354 free(s->lf);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
355 free(s->rf);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
356 free(s->lr);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
357 free(s->rr);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
358 free(s->cf);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
359 free(s->cr);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
360 free(s->ba_l);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
361 free(s->ba_r);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
362 free(s->ba_ir);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
363 free(s->fwrbuf_l);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
364 free(s->fwrbuf_r);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
365 free(s->fwrbuf_lr);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 29263
diff changeset
366 free(s->fwrbuf_rr);
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
367 free(af->setup);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
368 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
369 if(af->data)
22179
ecf562795caf Fix memory leaks.
uau
parents: 18967
diff changeset
370 free(af->data->audio);
ecf562795caf Fix memory leaks.
uau
parents: 18967
diff changeset
371 free(af->data);
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
372 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
373
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
374 /* Filter data through filter
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
375
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
376 Two "tricks" are used to compensate the "color" of the KEMAR data:
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
377
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
378 1. The KEMAR data is refiltered to ensure that the front L, R channels
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
379 on the same side of the ear are equalized (especially in the high
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
380 frequencies).
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
381
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
382 2. A bass compensation is introduced to ensure that 0-200 Hz are not
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
383 damped (without any real 3D acoustical image, however).
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
384 */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
385 static af_data_t* play(struct af_instance_s *af, af_data_t *data)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
386 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
387 af_hrtf_t *s = af->setup;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
388 short *in = data->audio; // Input audio data
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
389 short *out = NULL; // Output audio data
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
390 short *end = in + data->len / sizeof(short); // Loop end
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
391 float common, left, right, diff, left_b, right_b;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
392 const int dblen = s->dlbuflen, hlen = s->hrflen, blen = s->basslen;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
393
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
394 if(AF_OK != RESIZE_LOCAL_BUFFER(af, data))
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
395 return NULL;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
396
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
397 if(s->print_flag) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
398 s->print_flag = 0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
399 switch (s->decode_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
400 case HRTF_MIX_51:
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
401 mp_msg(MSGT_AFILTER, MSGL_INFO,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
402 "[hrtf] Using HRTF to mix %s discrete surround into "
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
403 "L, R channels\n", s->matrix_mode ? "5+1" : "5");
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
404 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
405 case HRTF_MIX_STEREO:
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
406 mp_msg(MSGT_AFILTER, MSGL_INFO,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
407 "[hrtf] Using HRTF to mix stereo into "
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
408 "L, R channels\n");
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
409 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
410 case HRTF_MIX_MATRIX2CH:
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
411 mp_msg(MSGT_AFILTER, MSGL_INFO,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
412 "[hrtf] Using active matrix to decode 2 channel "
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
413 "input, HRTF to mix %s matrix surround into "
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
414 "L, R channels\n", "3/2");
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
415 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
416 default:
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
417 mp_msg(MSGT_AFILTER, MSGL_WARN,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
418 "[hrtf] bogus decode_mode: %d\n", s->decode_mode);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
419 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
420 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
421
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
422 if(s->matrix_mode)
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
423 mp_msg(MSGT_AFILTER, MSGL_INFO,
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
424 "[hrtf] Using active matrix to decode rear center "
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
425 "channel\n");
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
426 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
427
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
428 out = af->data->audio;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
429
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
430 /* MPlayer's 5 channel layout (notation for the variable):
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
431 *
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
432 * 0: L (LF), 1: R (RF), 2: Ls (LR), 3: Rs (RR), 4: C (CF), matrix
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
433 * encoded: Cs (CR)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
434 *
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
435 * or: L = left, C = center, R = right, F = front, R = rear
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
436 *
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
437 * Filter notation:
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
438 *
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
439 * CF
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
440 * OF AF
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
441 * Ear->
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
442 * OR AR
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
443 * CR
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
444 *
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
445 * or: C = center, A = same side, O = opposite, F = front, R = rear
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
446 */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
447
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
448 while(in < end) {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
449 const int k = s->cyc_pos;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
450
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
451 update_ch(s, in, k);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
452
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
453 /* Simulate a 7.5 ms -20 dB echo of the center channel in the
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
454 front channels (like reflection from a room wall) - a kind of
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
455 psycho-acoustically "cheating" to focus the center front
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
456 channel, which is normally hard to be perceived as front */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
457 s->lf[k] += CFECHOAMPL * s->cf[(k + CFECHODELAY) % s->dlbuflen];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
458 s->rf[k] += CFECHOAMPL * s->cf[(k + CFECHODELAY) % s->dlbuflen];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
459
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
460 switch (s->decode_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
461 case HRTF_MIX_51:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
462 case HRTF_MIX_MATRIX2CH:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
463 /* Mixer filter matrix */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
464 common = conv(dblen, hlen, s->cf, s->cf_ir, k + s->cf_o);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
465 if(s->matrix_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
466 /* In matrix decoding mode, the rear channel gain must be
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
467 renormalized, as there is an additional channel. */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
468 matrix_decode(in, k, 2, 3, 0, s->dlbuflen,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
469 s->lr_fwr, s->rr_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
470 s->lrprr_fwr, s->lrmrr_fwr,
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
471 &(s->adapt_lr_gain), &(s->adapt_rr_gain),
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
472 &(s->adapt_lrprr_gain), &(s->adapt_lrmrr_gain),
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
473 s->lr, s->rr, NULL, NULL, s->cr);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
474 common +=
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
475 conv(dblen, hlen, s->cr, s->cr_ir, k + s->cr_o) *
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
476 M1_76DB;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
477 left =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
478 ( conv(dblen, hlen, s->lf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
479 conv(dblen, hlen, s->rf, s->of_ir, k + s->of_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
480 (conv(dblen, hlen, s->lr, s->ar_ir, k + s->ar_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
481 conv(dblen, hlen, s->rr, s->or_ir, k + s->or_o)) *
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
482 M1_76DB + common);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
483 right =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
484 ( conv(dblen, hlen, s->rf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
485 conv(dblen, hlen, s->lf, s->of_ir, k + s->of_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
486 (conv(dblen, hlen, s->rr, s->ar_ir, k + s->ar_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
487 conv(dblen, hlen, s->lr, s->or_ir, k + s->or_o)) *
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
488 M1_76DB + common);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
489 } else {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
490 left =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
491 ( conv(dblen, hlen, s->lf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
492 conv(dblen, hlen, s->rf, s->of_ir, k + s->of_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
493 conv(dblen, hlen, s->lr, s->ar_ir, k + s->ar_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
494 conv(dblen, hlen, s->rr, s->or_ir, k + s->or_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
495 common);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
496 right =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
497 ( conv(dblen, hlen, s->rf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
498 conv(dblen, hlen, s->lf, s->of_ir, k + s->of_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
499 conv(dblen, hlen, s->rr, s->ar_ir, k + s->ar_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
500 conv(dblen, hlen, s->lr, s->or_ir, k + s->or_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
501 common);
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
502 }
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
503 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
504 case HRTF_MIX_STEREO:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
505 left =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
506 ( conv(dblen, hlen, s->lf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
507 conv(dblen, hlen, s->rf, s->of_ir, k + s->of_o));
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
508 right =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
509 ( conv(dblen, hlen, s->rf, s->af_ir, k + s->af_o) +
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
510 conv(dblen, hlen, s->lf, s->of_ir, k + s->of_o));
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
511 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
512 default:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
513 /* make gcc happy */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
514 left = 0.0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
515 right = 0.0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
516 break;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
517 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
518
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
519 /* Bass compensation for the lower frequency cut of the HRTF. A
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
520 cross talk of the left and right channel is introduced to
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
521 match the directional characteristics of higher frequencies.
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
522 The bass will not have any real 3D perception, but that is
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
523 OK (note at 180 Hz, the wavelength is about 2 m, and any
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
524 spatial perception is impossible). */
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
525 left_b = conv(dblen, blen, s->ba_l, s->ba_ir, k);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
526 right_b = conv(dblen, blen, s->ba_r, s->ba_ir, k);
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
527 left += (1 - BASSCROSS) * left_b + BASSCROSS * right_b;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
528 right += (1 - BASSCROSS) * right_b + BASSCROSS * left_b;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
529 /* Also mix the LFE channel (if available) */
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
530 if(data->nch >= 6) {
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
531 left += in[5] * M3_01DB;
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
532 right += in[5] * M3_01DB;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
533 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
534
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
535 /* Amplitude renormalization. */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
536 left *= AMPLNORM;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
537 right *= AMPLNORM;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
538
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
539 switch (s->decode_mode) {
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
540 case HRTF_MIX_51:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
541 case HRTF_MIX_STEREO:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
542 /* "Cheating": linear stereo expansion to amplify the 3D
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
543 perception. Note: Too much will destroy the acoustic space
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
544 and may even result in headaches. */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
545 diff = STEXPAND2 * (left - right);
35210
318c7824c50d af_hrtf: clamp output to relieve noises
upsuper
parents: 34174
diff changeset
546 out[0] = av_clip_int16(left + diff);
318c7824c50d af_hrtf: clamp output to relieve noises
upsuper
parents: 34174
diff changeset
547 out[1] = av_clip_int16(right - diff);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
548 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
549 case HRTF_MIX_MATRIX2CH:
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
550 /* Do attempt any stereo expansion with matrix encoded
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
551 sources. The L, R channels are already stereo expanded
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
552 by the steering, any further stereo expansion will sound
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
553 very unnatural. */
35210
318c7824c50d af_hrtf: clamp output to relieve noises
upsuper
parents: 34174
diff changeset
554 out[0] = av_clip_int16(left);
318c7824c50d af_hrtf: clamp output to relieve noises
upsuper
parents: 34174
diff changeset
555 out[1] = av_clip_int16(right);
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
556 break;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
557 }
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
558
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
559 /* Next sample... */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
560 in = &in[data->nch];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
561 out = &out[af->data->nch];
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
562 (s->cyc_pos)--;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
563 if(s->cyc_pos < 0)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
564 s->cyc_pos += dblen;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
565 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
566
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
567 /* Set output data */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
568 data->audio = af->data->audio;
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 22748
diff changeset
569 data->len = data->len / data->nch * 2;
15384
0189ac5804b9 actually output 2 channel audio (instead of 6 channel with 4 empty channels)
reimar
parents: 15124
diff changeset
570 data->nch = 2;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
571
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
572 return data;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
573 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
574
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
575 static int allocate(af_hrtf_t *s)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
576 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
577 if ((s->lf = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
578 if ((s->rf = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
579 if ((s->lr = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
580 if ((s->rr = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
581 if ((s->cf = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
582 if ((s->cr = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
583 if ((s->ba_l = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
584 if ((s->ba_r = malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
585 if ((s->fwrbuf_l =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
586 malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
587 if ((s->fwrbuf_r =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
588 malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
589 if ((s->fwrbuf_lr =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
590 malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
591 if ((s->fwrbuf_rr =
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
592 malloc(s->dlbuflen * sizeof(float))) == NULL) return -1;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
593 return 0;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
594 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
595
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
596 /* Allocate memory and set function pointers */
22746
fd6f824ef894 Rename open to af_open so as not to conflict with a previous header definition.
diego
parents: 22179
diff changeset
597 static int af_open(af_instance_t* af)
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
598 {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
599 int i;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
600 af_hrtf_t *s;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
601 float fc;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
602
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
603 af->control = control;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
604 af->uninit = uninit;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
605 af->play = play;
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 22748
diff changeset
606 af->mul = 1;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
607 af->data = calloc(1, sizeof(af_data_t));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
608 af->setup = calloc(1, sizeof(af_hrtf_t));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
609 if((af->data == NULL) || (af->setup == NULL))
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
610 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
611
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
612 s = af->setup;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
613
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
614 s->dlbuflen = DELAYBUFLEN;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
615 s->hrflen = HRTFFILTLEN;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
616 s->basslen = BASSFILTLEN;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
617
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
618 s->cyc_pos = s->dlbuflen - 1;
15082
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
619 /* With a full (two axis) steering matrix decoder, s->matrix_mode
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
620 should not be enabled lightly (it will also steer the Ls, Rs
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
621 channels). */
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
622 s->matrix_mode = 0;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
623 s->decode_mode = HRTF_MIX_51;
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
624
71570687c1a3 HRTF filter updates:
henry
parents: 14396
diff changeset
625 s->print_flag = 1;
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
626
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
627 if (allocate(s) != 0) {
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
628 mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Memory allocation error.\n");
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
629 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
630 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
631
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
632 for(i = 0; i < s->dlbuflen; i++)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
633 s->lf[i] = s->rf[i] = s->lr[i] = s->rr[i] = s->cf[i] =
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
634 s->cr[i] = 0;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
635
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
636 s->lr_fwr =
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
637 s->rr_fwr = 0;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
638
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
639 s->cf_ir = cf_filt + (s->cf_o = pulse_detect(cf_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
640 s->af_ir = af_filt + (s->af_o = pulse_detect(af_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
641 s->of_ir = of_filt + (s->of_o = pulse_detect(of_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
642 s->ar_ir = ar_filt + (s->ar_o = pulse_detect(ar_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
643 s->or_ir = or_filt + (s->or_o = pulse_detect(or_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
644 s->cr_ir = cr_filt + (s->cr_o = pulse_detect(cr_filt));
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
645
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
646 if((s->ba_ir = malloc(s->basslen * sizeof(float))) == NULL) {
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
647 mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Memory allocation error.\n");
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
648 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
649 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
650 fc = 2.0 * BASSFILTFREQ / (float)af->data->rate;
14275
de13fd557440 less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents: 14245
diff changeset
651 if(af_filter_design_fir(s->basslen, s->ba_ir, &fc, LP | KAISER, 4 * M_PI) ==
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
652 -1) {
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
653 mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Unable to design low-pass "
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
654 "filter.\n");
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
655 return AF_ERROR;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
656 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
657 for(i = 0; i < s->basslen; i++)
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
658 s->ba_ir[i] *= BASSGAIN;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
659
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
660 return AF_OK;
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
661 }
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
662
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
663 /* Description of this filter */
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
664 af_info_t af_info_hrtf = {
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
665 "HRTF Headphone",
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
666 "hrtf",
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
667 "ylai",
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
668 "",
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
669 AF_FLAGS_REENTRANT,
22746
fd6f824ef894 Rename open to af_open so as not to conflict with a previous header definition.
diego
parents: 22179
diff changeset
670 af_open
13996
be8f4abbe960 head related transfer function
henry
parents:
diff changeset
671 };