vlc | branch: master | David Fuhrmann <[email protected]> | Sun Mar 24 21:00:08 2013 +0100| [329788450245402e38928cf2a9f09e05ad2e603b] | committer: David Fuhrmann
auhal: implement drain > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=329788450245402e38928cf2a9f09e05ad2e603b --- modules/audio_output/auhal.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index d7db191..370473e 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -110,6 +110,7 @@ struct aout_sys_t struct audio_device_t *devices; vlc_mutex_t lock; + vlc_cond_t cond; }; struct audio_device_t @@ -181,6 +182,7 @@ static int Open(vlc_object_t *obj) return VLC_ENOMEM; vlc_mutex_init(&sys->lock); + vlc_cond_init(&sys->cond); aout->sys = sys; aout->start = Start; @@ -216,6 +218,7 @@ static void Close(vlc_object_t *obj) } vlc_mutex_destroy(&sys->lock); + vlc_cond_destroy(&sys->cond); free(sys); } @@ -1225,14 +1228,23 @@ static void Pause (audio_output_t *p_aout, bool pause, mtime_t date) static void Flush(audio_output_t *p_aout, bool wait) { - struct aout_sys_t * p_sys = p_aout->sys; - VLC_UNUSED(wait); + struct aout_sys_t *p_sys = p_aout->sys; - p_sys->b_got_first_sample = false; + if (wait) { + int32_t availableBytes; + vlc_mutex_lock(&p_sys->lock); + while (TPCircularBufferTail(&p_sys->circular_buffer, &availableBytes) != NULL) { + vlc_cond_wait(&p_sys->cond, &p_sys->lock); + } + vlc_mutex_unlock(&p_sys->lock); - /* flush circular buffer */ - AudioOutputUnitStop(p_aout->sys->au_unit); - TPCircularBufferClear(&p_aout->sys->circular_buffer); + } else { + p_sys->b_got_first_sample = false; + + /* flush circular buffer */ + AudioOutputUnitStop(p_aout->sys->au_unit); + TPCircularBufferClear(&p_aout->sys->circular_buffer); + } } static int TimeGet(audio_output_t *p_aout, mtime_t *delay) @@ -1287,6 +1299,10 @@ static OSStatus RenderCallbackAnalog(vlc_object_t *p_obj, VLC_UNUSED(inNumberFrames); } + vlc_mutex_lock(&p_sys->lock); + vlc_cond_signal(&p_sys->cond); + vlc_mutex_unlock(&p_sys->lock); + return noErr; } @@ -1326,6 +1342,10 @@ static OSStatus RenderCallbackSPDIF (AudioDeviceID inDevice, TPCircularBufferConsume(&p_sys->circular_buffer, __MIN(bytesToCopy, availableBytes)); } + vlc_mutex_lock(&p_sys->lock); + vlc_cond_signal(&p_sys->cond); + vlc_mutex_unlock(&p_sys->lock); + return noErr; } _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
