+static int getfilter_float(AVFilterContext *ctx, float x, float y, float z,
+ float *left, float *right,
+ float *delay_left, float *delay_right)
+{
+ struct SOFAlizerContext *s = ctx->priv;
+ float c[3], delays[2];
+ float *fl, *fr;
+ int nearest;
+ int *neighbors;
+ float *res;
+
+ c[0] = x, c[1] = y, c[2] = z;
+ nearest = mysofa_lookup(s->sofa.lookup, c);
+ if (nearest < 0)
+ return AVERROR(EINVAL);
+
+ if (s->interpolate) {
+ neighbors = mysofa_neighborhood(s->sofa.neighborhood, nearest);
+ res = mysofa_interpolate(s->sofa.hrtf, c,
+ nearest, neighbors,
+ s->sofa.fir, delays);
+ } else {
+ if (s->sofa.hrtf->DataDelay.elements > s->sofa.hrtf->R) {
+ delays[0] = s->sofa.hrtf->DataDelay.values[nearest * s->sofa.hrtf->R];
+ delays[1] = s->sofa.hrtf->DataDelay.values[nearest * s->sofa.hrtf->R + 1];
+ } else {
+ delays[0] = s->sofa.hrtf->DataDelay.values[0];
+ delays[1] = s->sofa.hrtf->DataDelay.values[1];
+ }
+ res = s->sofa.hrtf->DataIR.values + nearest * s->sofa.hrtf->N * s->sofa.hrtf->R;
+ }
+
+ *delay_left = delays[0];
+ *delay_right = delays[1];
+
+ fl = res;
+ fr = res + s->sofa.hrtf->N;
+
+ memcpy(left, fl, sizeof(float) * s->sofa.hrtf->N);
+ memcpy(right, fr, sizeof(float) * s->sofa.hrtf->N);
+
+ return 0;
+}
+