From db1fc3628fdd57bb9f2600779ee61bbd096b4383 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 4 Nov 2015 16:47:11 +0100 Subject: audio: strictly align audio on spdif frames We still have a sample-based buffer between filters and audio outputs. In order to avoid cutting frames into half (which can upset receivers), we strictly need to align the boundaries on which we cut the audio. --- player/audio.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'player') diff --git a/player/audio.c b/player/audio.c index 067bbece7d..260c4fead4 100644 --- a/player/audio.c +++ b/player/audio.c @@ -485,7 +485,7 @@ static bool get_sync_samples(struct MPContext *mpctx, int *skip) } int align = af_format_sample_alignment(out_format.format); - *skip = (-ptsdiff * play_samplerate) / align * align; + *skip = (int)(-ptsdiff * play_samplerate) / align * align; return true; } @@ -538,6 +538,7 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) struct mp_audio out_format = {0}; ao_get_format(mpctx->ao, &out_format); double play_samplerate = out_format.rate / mpctx->audio_speed; + int align = af_format_sample_alignment(out_format.format); // If audio is infinitely fast, somehow try keeping approximate A/V sync. if (mpctx->audio_status == STATUS_PLAYING && ao_untimed(mpctx->ao) && @@ -563,7 +564,6 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) 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; @@ -573,6 +573,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) mpctx->audio_drop_throttle += 1 - drop_limit - samples / play_samplerate; } + playsize = playsize / align * align; + int status = AD_OK; bool working = false; if (playsize > mp_audio_buffer_samples(mpctx->ao_buffer)) { @@ -664,7 +666,7 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) double samples = (endpts - written_audio_pts(mpctx) - opts->audio_delay) * play_samplerate; if (playsize > samples) { - playsize = MPMAX(samples, 0); + playsize = MPMAX((int)samples / align * align, 0); audio_eof = true; partial_fill = true; } @@ -684,6 +686,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) struct mp_audio data; mp_audio_buffer_peek(mpctx->ao_buffer, &data); + if (audio_eof || data.samples >= align) + data.samples = data.samples / align * align; data.samples = MPMIN(data.samples, mpctx->paused ? 0 : playsize); int played = write_to_ao(mpctx, &data, playflags); assert(played >= 0 && played <= data.samples); -- cgit v1.2.3