summaryrefslogtreecommitdiffstats
path: root/audio/filter/af_scaletempo.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/filter/af_scaletempo.c')
-rw-r--r--audio/filter/af_scaletempo.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/audio/filter/af_scaletempo.c b/audio/filter/af_scaletempo.c
index 456de89812..c8560af502 100644
--- a/audio/filter/af_scaletempo.c
+++ b/audio/filter/af_scaletempo.c
@@ -256,7 +256,8 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
// This filter can have a negative delay when scale > 1:
// output corresponding to some length of input can be decided and written
// after receiving only a part of that input.
- af->delay = s->bytes_queued - s->bytes_to_slide;
+ af->delay = (s->bytes_queued - s->bytes_to_slide) / s->scale
+ / af->data->sstride / af->data->rate;
data->planes[0] = af->data->planes[0];
data->samples = (pout - (int8_t *)af->data->planes[0]) / af->data->sstride;
@@ -299,9 +300,8 @@ static int control(struct af_instance *af, int cmd, void *arg)
s->frames_stride = srate * s->ms_stride;
s->bytes_stride = s->frames_stride * bps * nch;
s->frames_stride_scaled = s->scale * s->frames_stride;
- int bytes_stride_scaled = s->scale * s->bytes_stride;
s->frames_stride_error = 0;
- af->mul = (double)s->bytes_stride / bytes_stride_scaled;
+ af->mul = 1.0 / s->scale;
af->delay = 0;
int frames_overlap = s->frames_stride * s->percent_overlap;
@@ -462,7 +462,6 @@ static int af_open(struct af_instance *af)
af->control = control;
af->uninit = uninit;
af->play = play;
- af->mul = 1;
s->speed_tempo = !!(s->speed_opt & SCALE_TEMPO);
s->speed_pitch = !!(s->speed_opt & SCALE_PITCH);