vlc/vlc-3.0 | branch: master | Thomas Guillem <[email protected]> | Mon Mar 11 16:02:53 2019 +0100| [9ee7cfa08097bab36b53491ef424d6f2ff1f9210] | committer: Thomas Guillem
directsound: fix drain Use the same drain emulation than mmdevice.h This fixes draining with directsound output + directsound stream (Windows XP + Vista). (cherry picked from commit 25ba4f58177382f90f31ad64eb8b584c895d5a92) Signed-off-by: Thomas Guillem <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=9ee7cfa08097bab36b53491ef424d6f2ff1f9210 --- modules/audio_output/directsound.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/audio_output/directsound.c b/modules/audio_output/directsound.c index 534c9952e2..4aa9d28d53 100644 --- a/modules/audio_output/directsound.c +++ b/modules/audio_output/directsound.c @@ -140,7 +140,7 @@ struct aout_sys_t } volume; }; -static HRESULT Flush( aout_stream_sys_t *sys, bool drain); +static HRESULT Flush( aout_stream_sys_t *sys ); static HRESULT TimeGet( aout_stream_sys_t *sys, mtime_t *delay ) { DWORD read, status; @@ -171,7 +171,7 @@ static HRESULT TimeGet( aout_stream_sys_t *sys, mtime_t *delay ) if( sys->i_data < 0 ) /* underrun */ - Flush(sys, false); + Flush(sys); *delay = ( sys->i_data / sys->i_bytes_per_sample ) * CLOCK_FREQ / sys->i_rate; @@ -339,10 +339,10 @@ static void OutputPause( audio_output_t *aout, bool pause, mtime_t date ) (void) date; } -static HRESULT Flush( aout_stream_sys_t *sys, bool drain) +static HRESULT Flush( aout_stream_sys_t *sys ) { HRESULT ret = IDirectSoundBuffer_Stop( sys->p_dsbuffer ); - if( ret == DS_OK && !drain ) + if( ret == DS_OK ) { vlc_mutex_lock(&sys->lock); sys->i_data = 0; @@ -356,13 +356,21 @@ static HRESULT Flush( aout_stream_sys_t *sys, bool drain) static HRESULT StreamFlush( aout_stream_t *s ) { - return Flush( s->sys, false ); + return Flush( s->sys ); } static void OutputFlush( audio_output_t *aout, bool drain ) { - aout_stream_sys_t *sys = &aout->sys->s; - Flush( sys, drain ); + aout_sys_t *sys = aout->sys; + if (drain) + { /* Loosy drain emulation */ + mtime_t delay; + + if (OutputTimeGet(aout, &delay) == 0 && delay <= INT64_C(5000000)) + Sleep((delay / (CLOCK_FREQ / 1000)) + 1); + } + else + Flush( &sys->s ); } /** _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
