|
|
@@ -567,7 +567,7 @@ static int compensate_volume(AVFilterContext *ctx) |
|
|
|
float compensate; |
|
|
|
float energy = 0; |
|
|
|
float *ir; |
|
|
|
int m, j; |
|
|
|
int m; |
|
|
|
|
|
|
|
if (s->sofa.ncid) { |
|
|
|
/* find IR at front center position in the SOFA file (IR closest to 0°,0°,1m) */ |
|
|
@@ -575,15 +575,17 @@ static int compensate_volume(AVFilterContext *ctx) |
|
|
|
m = find_m(s, 0, 0, 1); |
|
|
|
/* get energy of that IR and compensate volume */ |
|
|
|
ir = sofa->data_ir + 2 * m * sofa->n_samples; |
|
|
|
for (j = 0; j < sofa->n_samples; j++) { |
|
|
|
energy += *(ir + j) * *(ir + j); |
|
|
|
if (sofa->n_samples & 31) { |
|
|
|
energy = avpriv_scalarproduct_float_c(ir, ir, sofa->n_samples); |
|
|
|
} else { |
|
|
|
energy = s->fdsp->scalarproduct_float(ir, ir, sofa->n_samples); |
|
|
|
} |
|
|
|
compensate = 256 / (sofa->n_samples * sqrt(energy)); |
|
|
|
av_log(ctx, AV_LOG_DEBUG, "Compensate-factor: %f\n", compensate); |
|
|
|
ir = sofa->data_ir; |
|
|
|
for (j = 0; j < sofa->n_samples * sofa->m_dim * 2; j++) { |
|
|
|
ir[j] *= compensate; /* apply volume compensation to IRs */ |
|
|
|
} |
|
|
|
/* apply volume compensation to IRs */ |
|
|
|
s->fdsp->vector_fmul_scalar(ir, ir, compensate, sofa->n_samples * sofa->m_dim * 2); |
|
|
|
emms_c(); |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|