summaryrefslogtreecommitdiffstats
path: root/player/audio.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-10-27 20:56:46 +0100
committerwm4 <wm4@nowhere>2015-10-27 20:56:46 +0100
commitaaec2aba3890e1b2ea8f4dc158d884bc85a59517 (patch)
tree61d9e3464aa0777bb7e58257e24b290c4b2146bd /player/audio.c
parent3b95dd47d53d4d9b5a247f2dda550b5470e62b48 (diff)
downloadmpv-aaec2aba3890e1b2ea8f4dc158d884bc85a59517.tar.bz2
mpv-aaec2aba3890e1b2ea8f4dc158d884bc85a59517.tar.xz
player: add audio drop/duplicate mode
Not very robust in the moment.
Diffstat (limited to 'player/audio.c')
-rw-r--r--player/audio.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/player/audio.c b/player/audio.c
index ce72e3d0f1..9207986892 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -551,6 +551,27 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
playsize = MPMAX(1, playsize + skip); // silence will be prepended
}
+ int skip_duplicate = 0; // >0: skip, <0: duplicate
+ if (mpctx->display_sync_active && opts->video_sync == VS_DISP_ADROP &&
+ fabs(mpctx->last_av_difference) >= opts->sync_audio_drop_size &&
+ mpctx->audio_status == STATUS_PLAYING)
+ {
+ int samples = ceil(opts->sync_audio_drop_size * play_samplerate);
+ int align = af_format_sample_alignment(out_format.format);
+ samples = (samples + align / 2) / align * align;
+
+ skip_duplicate = mpctx->last_av_difference >= 0 ? -samples : samples;
+
+ // safeguard against excessively growing audio buffer sizes
+ if (skip_duplicate < 0 && mp_audio_buffer_seconds(mpctx->ao_buffer) > 5) {
+ skip_duplicate = 0;
+ samples = 0;
+ }
+
+ if (playsize < samples)
+ playsize = samples;
+ }
+
int status = AD_OK;
bool working = false;
if (playsize > mp_audio_buffer_samples(mpctx->ao_buffer)) {
@@ -598,6 +619,21 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
end_sync = true;
}
+ if (skip_duplicate) {
+ int max = mp_audio_buffer_samples(mpctx->ao_buffer);
+ if (abs(skip_duplicate) > max)
+ skip_duplicate = skip_duplicate >= 0 ? max : -max;
+ mpctx->last_av_difference += skip_duplicate / play_samplerate;
+ if (skip_duplicate >= 0) {
+ mp_audio_buffer_skip(mpctx->ao_buffer, skip_duplicate);
+ MP_STATS(mpctx, "drop-audio");
+ } else {
+ mp_audio_buffer_duplicate(mpctx->ao_buffer, -skip_duplicate);
+ MP_STATS(mpctx, "duplicate-audio");
+ }
+ MP_VERBOSE(mpctx, "audio skip_duplicate=%d\n", skip_duplicate);
+ }
+
if (mpctx->audio_status == STATUS_SYNCING) {
if (end_sync)
mpctx->audio_status = STATUS_FILLING;