- s->fdsp->vector_fmul_scalar(ptr, ptr, s->wet_gain, FFALIGN(out->nb_samples, 4));
- emms_c();
+ if (s->min_part_size >= 8) {
+ s->fdsp->vector_fmul_scalar(ptr, ptr, s->wet_gain, FFALIGN(nb_samples, 4));
+ emms_c();
+ } else {
+ for (n = 0; n < nb_samples; n++)
+ ptr[n] *= s->wet_gain;
+ }
+
+ return 0;
+}
+
+static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
+{
+ AudioFIRContext *s = ctx->priv;
+
+ for (int offset = 0; offset < out->nb_samples; offset += s->min_part_size) {
+ fir_quantum(ctx, out, ch, offset);
+ }
+
+ return 0;
+}
+
+static int fir_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+ AVFrame *out = arg;
+ const int start = (out->channels * jobnr) / nb_jobs;
+ const int end = (out->channels * (jobnr+1)) / nb_jobs;
+
+ for (int ch = start; ch < end; ch++) {
+ fir_channel(ctx, out, ch);
+ }