diff options
Diffstat (limited to 'player/audio.c')
-rw-r--r-- | player/audio.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/player/audio.c b/player/audio.c index 0204cd8287..12f9d03cb4 100644 --- a/player/audio.c +++ b/player/audio.c @@ -154,6 +154,7 @@ void reset_audio_state(struct MPContext *mpctx) mp_audio_buffer_clear(mpctx->ao_buffer); mpctx->audio_status = mpctx->d_audio ? STATUS_SYNCING : STATUS_EOF; mpctx->delay = 0; + mpctx->audio_drop_throttle = 0; mpctx->audio_stat_start = 0; } @@ -554,8 +555,11 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) } int skip_duplicate = 0; // >0: skip, <0: duplicate + double drop_limit = + (opts->sync_max_audio_change + opts->sync_max_video_change) / 100; if (mpctx->display_sync_active && opts->video_sync == VS_DISP_ADROP && fabs(mpctx->last_av_difference) >= opts->sync_audio_drop_size && + mpctx->audio_drop_throttle < drop_limit && mpctx->audio_status == STATUS_PLAYING) { int samples = ceil(opts->sync_audio_drop_size * play_samplerate); @@ -565,6 +569,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) skip_duplicate = mpctx->last_av_difference >= 0 ? -samples : samples; playsize = MPMAX(playsize, samples); + + mpctx->audio_drop_throttle += 1 - drop_limit - samples / play_samplerate; } int status = AD_OK; @@ -683,6 +689,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) assert(played >= 0 && played <= data.samples); mp_audio_buffer_skip(mpctx->ao_buffer, played); + mpctx->audio_drop_throttle -= played / play_samplerate; + dump_audio_stats(mpctx); mpctx->audio_status = STATUS_PLAYING; |