diff --git a/audio/decode/ad_mpg123.c b/audio/decode/ad_mpg123.c index 777c20c2c9..8ea06dd5ab 100644 --- a/audio/decode/ad_mpg123.c +++ b/audio/decode/ad_mpg123.c @@ -310,6 +310,11 @@ static int decode_audio(sh_audio_t *sh, struct mp_audio *buffer, int maxlen) return -1; } + if (sh->samplerate != buffer->rate || + !mp_chmap_equals(&sh->channels, &buffer->channels) || + sh->sample_format != buffer->format) + return 0; + size_t got_now = 0; ret = mpg123_replace_buffer(con->handle, buf, maxlen * con->sample_size); if (ret != MPG123_OK) diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 0aee681def..c79e4ffc42 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -267,7 +267,6 @@ static int filter_n_bytes(sh_audio_t *sh, struct mp_audio_buffer *outbuf, // first, and don't signal a format change to the caller yet. if (mp_audio_buffer_samples(sh->decode_buffer) > 0) break; - reinit_audio_buffer(sh); error = -2; break; } @@ -288,6 +287,11 @@ static int filter_n_bytes(sh_audio_t *sh, struct mp_audio_buffer *outbuf, // remove processed data from decoder buffer: mp_audio_buffer_skip(sh->decode_buffer, len); + // Assume the filter chain is drained from old data at this point. + // (If not, the remaining old data is discarded.) + if (error == -2) + reinit_audio_buffer(sh); + return error; } diff --git a/audio/filter/af.c b/audio/filter/af.c index 63013e81d9..c315ea8f7c 100644 --- a/audio/filter/af.c +++ b/audio/filter/af.c @@ -695,9 +695,11 @@ struct af_instance *af_add(struct af_stream *s, char *name, char **args) struct mp_audio *af_play(struct af_stream *s, struct mp_audio *data) { struct af_instance *af = s->first; + assert(mp_audio_config_equals(af->data, data)); // Iterate through all filters do { data = af->play(af, data); + assert(mp_audio_config_equals(af->data, data)); af = af->next; } while (af && data); return data;