vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Nov 13 21:35:50 2012 +0200| [62a75145b729b80b5f44931739338ef8a1812947] | committer: Rémi Denis-Courmont
aout: fix flawed resampling logic > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=62a75145b729b80b5f44931739338ef8a1812947 --- src/audio_output/dec.c | 63 ++++++++++++++++++-------------------------- src/audio_output/filters.c | 2 +- 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 87310e6..8d72e27 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -333,61 +333,50 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts, } /* Resampling */ - - if (drift > +AOUT_MAX_PTS_DELAY) + if (drift > +AOUT_MAX_PTS_DELAY + && owner->sync.resamp_type != AOUT_RESAMPLING_UP) { - if (owner->sync.resamp_type == AOUT_RESAMPLING_NONE) - { - msg_Warn (aout, "playback too late (%"PRId64"): up-sampling", - drift); - owner->sync.resamp_start_drift = +drift; - } + msg_Warn (aout, "playback too late (%"PRId64"): up-sampling", + drift); owner->sync.resamp_type = AOUT_RESAMPLING_UP; + owner->sync.resamp_start_drift = +drift; } - - if (drift < -AOUT_MAX_PTS_ADVANCE) + if (drift < -AOUT_MAX_PTS_ADVANCE + && owner->sync.resamp_type != AOUT_RESAMPLING_DOWN) { - if (owner->sync.resamp_type == AOUT_RESAMPLING_NONE) - { - msg_Warn (aout, "playback too early (%"PRId64"): down-sampling", - drift); - owner->sync.resamp_start_drift = -drift; - } + msg_Warn (aout, "playback too early (%"PRId64"): down-sampling", + drift); owner->sync.resamp_type = AOUT_RESAMPLING_DOWN; + owner->sync.resamp_start_drift = -drift; } if (owner->sync.resamp_type == AOUT_RESAMPLING_NONE) return; /* Everything is fine. Nothing to do. */ + if (llabs (drift) > 2 * owner->sync.resamp_start_drift) + { /* If the drift is ever increasing, then something is seriously wrong. + * Cease resampling and hope for the best. */ + msg_Warn (aout, "timing screwed (drift: %"PRId64" us): " + "stopping resampling", drift); + aout_StopResampling (aout); + return; + } + /* Resampling has been triggered earlier. This checks if it needs to be * increased or decreased. Resampling rate changes must be kept slow for * the comfort of listeners. */ - const int adj = (owner->sync.resamp_type == AOUT_RESAMPLING_UP) ? +2 : -2; + int adj = (owner->sync.resamp_type == AOUT_RESAMPLING_UP) ? +2 : -2; + + if (2 * llabs (drift) <= owner->sync.resamp_start_drift) + /* If the drift has been reduced from more than half its initial + * value, then it is time to switch back the resampling direction. */ + adj *= -1; - /* Check if everything is back to normal, then stop resampling. */ if (!aout_FiltersAdjustResampling (aout, adj)) - { + { /* Everything is back to normal: stop resampling. */ owner->sync.resamp_type = AOUT_RESAMPLING_NONE; msg_Dbg (aout, "resampling stopped (drift: %"PRId64" us)", drift); } - else - if (2 * llabs (drift) <= owner->sync.resamp_start_drift) - { /* If the drift has been reduced from more than half its initial - * value, then it is time to switch back the resampling direction. */ - if (owner->sync.resamp_type == AOUT_RESAMPLING_UP) - owner->sync.resamp_type = AOUT_RESAMPLING_DOWN; - else - owner->sync.resamp_type = AOUT_RESAMPLING_UP; - owner->sync.resamp_start_drift = 0; - } - else - if (llabs (drift) > 2 * owner->sync.resamp_start_drift) - { /* If the drift is ever increasing, then something is seriously wrong. - * Cease resampling and hope for the best. */ - msg_Warn (aout, "timing screwed (drift: %"PRId64" us): " - "stopping resampling", drift); - aout_StopResampling (aout); - } } /***************************************************************************** diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c index 056b9d0..14f9e66 100644 --- a/src/audio_output/filters.c +++ b/src/audio_output/filters.c @@ -550,7 +550,7 @@ bool aout_FiltersAdjustResampling (audio_output_t *aout, int adjust) owner->resampling += adjust; else owner->resampling = 0; - return !owner->resampling; + return owner->resampling != 0; } block_t *aout_FiltersPlay (audio_output_t *aout, block_t *block, int rate) _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
