summaryrefslogtreecommitdiffstats
path: root/player/audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'player/audio.c')
-rw-r--r--player/audio.c8
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;