diff --git a/include/vlc_aout.h b/include/vlc_aout.h index b7d90437847926955bff24332facb9114fe7f4fe..aec1d4b216fb7da53750d8a1c1a5f5ba2cc6d2d6 100644 --- a/include/vlc_aout.h +++ b/include/vlc_aout.h @@ -203,6 +203,8 @@ struct audio_output void (*pf_play)( audio_output_t * ); /**< Audio buffer callback */ void (* pf_pause)( audio_output_t *, bool, mtime_t ); /**< Pause/resume callback (optional, may be NULL) */ + void (* pf_flush)( audio_output_t *, bool ); /**< Flush/drain callback + (optional, may be NULL) */ aout_volume_cb pf_volume_set; /**< Volume setter (or NULL) */ int i_nb_samples; }; diff --git a/modules/audio_output/alsa.c b/modules/audio_output/alsa.c index 696c405908fd939d7ad1eefe437e51a4cd69ed70..bd8e921cbb4921e31b9c78646fcf18c2adc341d0 100644 --- a/modules/audio_output/alsa.c +++ b/modules/audio_output/alsa.c @@ -369,6 +369,7 @@ static int Open (vlc_object_t *obj) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; snd_pcm_hw_params_t *p_hw; snd_pcm_sw_params_t *p_sw; diff --git a/modules/audio_output/amem.c b/modules/audio_output/amem.c index b035b45e9556d5383d5eb913f39bc43b2aebc013..afd9e2abb917850160e0370c73e7a3d5e385741d 100644 --- a/modules/audio_output/amem.c +++ b/modules/audio_output/amem.c @@ -132,6 +132,7 @@ static int Open (vlc_object_t *obj) aout->pf_play = Play; aout->pf_pause = NULL; + aout->pf_flush = NULL; if (sys->set_volume != NULL) aout->pf_volume_set = VolumeSet; else diff --git a/modules/audio_output/audioqueue.c b/modules/audio_output/audioqueue.c index 82cccf2be3b520adb8387564019c5137299cdacb..6356799b38b21eadb4df8e3dd7b30c029aad0954 100644 --- a/modules/audio_output/audioqueue.c +++ b/modules/audio_output/audioqueue.c @@ -124,6 +124,7 @@ static int Open ( vlc_object_t *p_this ) p_aout->format.i_nb_samples = FRAME_SIZE; p_aout->format.pf_play = Play; p_aout->format.pf_pause = NULL; + p_aout->pf_flush = NULL; msg_Dbg(p_aout, "Starting AudioQueue (status = %i)", status); status = AudioQueueStart(p_sys->audioQueue, NULL); diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index 93831482d6e8089591ad6d43cbd84bfa6b41a9e9..387a56b4c661ba98868977e595328ebff2e0726e 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -189,6 +189,7 @@ static int Open( vlc_object_t * p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; aout_FormatPrint( p_aout, "VLC is looking for:", &p_aout->format ); diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c index 77835751b0c2da20ebc90eaf272d88cffcd19010..a2c50fe39d61388d45bc261a003b6c027d517b3d 100644 --- a/modules/audio_output/directx.c +++ b/modules/audio_output/directx.c @@ -175,6 +175,7 @@ static int OpenAudio( vlc_object_t *p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; aout_VolumeSoftInit( p_aout ); /* Retrieve config values */ diff --git a/modules/audio_output/file.c b/modules/audio_output/file.c index 479cea02c57fa9b74f49ce979dcc139cada987fd..2790005db42c3ced4f3f2c1f54bd3a8a4a2e8cda 100644 --- a/modules/audio_output/file.c +++ b/modules/audio_output/file.c @@ -164,6 +164,7 @@ static int Open( vlc_object_t * p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; /* Audio format */ psz_format = var_CreateGetString( p_this, "audiofile-format" ); diff --git a/modules/audio_output/jack.c b/modules/audio_output/jack.c index e5280ba57b33d3b812d27f97c9c493be16d21270..498f3b8ab2c93b2c801212402dbb8bdd867001aa 100644 --- a/modules/audio_output/jack.c +++ b/modules/audio_output/jack.c @@ -135,6 +135,7 @@ static int Open( vlc_object_t *p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; aout_VolumeSoftInit( p_aout ); /* JACK only supports fl32 format */ diff --git a/modules/audio_output/opensles_android.c b/modules/audio_output/opensles_android.c index 2556059115b4911a5eed76f6669c4914f4f788f6..3dbb25008d8a4df299830e096e9e98f27337c52e 100644 --- a/modules/audio_output/opensles_android.c +++ b/modules/audio_output/opensles_android.c @@ -260,7 +260,8 @@ static int Open( vlc_object_t * p_this ) p_aout->i_nb_samples = 2048; p_aout->format.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; p_aout->pf_play = Play; - p_aout->pf_pause = NULL; + p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; aout_FormatPrepare( &p_aout->format ); diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c index 74469458869ac9e03f158fd99ce27c2eb09419bd..5195a1d56a1f170b880b542354fbe60443bccdfa 100644 --- a/modules/audio_output/oss.c +++ b/modules/audio_output/oss.c @@ -300,6 +300,7 @@ static int Open( vlc_object_t *p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; if ( var_Type( p_aout, "audio-device" ) == 0 ) { diff --git a/modules/audio_output/portaudio.c b/modules/audio_output/portaudio.c index 49546b244e9817166e1186af8dc2812c0fdbde73..ae05fa3cd34155b58b65580949654f018eba3f95 100644 --- a/modules/audio_output/portaudio.c +++ b/modules/audio_output/portaudio.c @@ -184,6 +184,7 @@ static int Open( vlc_object_t * p_this ) p_aout->sys = p_sys; p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; /* Retrieve output device id from config */ p_sys->i_device_id = var_CreateGetInteger( p_aout, "portaudio-audio-device" ); diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c index 7917c2bd24d7b06f1adcbe060bf2fc9f8baeacb9..b42e5ce5e4628abb240006a739d451aa6c615ff8 100644 --- a/modules/audio_output/pulse.c +++ b/modules/audio_output/pulse.c @@ -783,6 +783,7 @@ static int Open(vlc_object_t *obj) aout->format.i_format = format; aout->pf_play = Play; aout->pf_pause = Pause; + aout->pf_flush = NULL; aout->pf_volume_set = VolumeSet; return VLC_SUCCESS; diff --git a/modules/audio_output/sdl.c b/modules/audio_output/sdl.c index de71ebeed6dcc2071e3b703c5c25bbe554de29aa..6e51758fc46ddba9e203f12907cbbb63bef40825 100644 --- a/modules/audio_output/sdl.c +++ b/modules/audio_output/sdl.c @@ -216,6 +216,7 @@ static int Open ( vlc_object_t *p_this ) p_aout->i_nb_samples = obtained.samples; p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; return VLC_SUCCESS; } diff --git a/modules/audio_output/waveout.c b/modules/audio_output/waveout.c index 52f1954226582b97ecbae2ccc5537ad01bd83745..d87bd11763e5691c57f3a730a1078981867d617c 100644 --- a/modules/audio_output/waveout.c +++ b/modules/audio_output/waveout.c @@ -156,6 +156,7 @@ static int Open( vlc_object_t *p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; /* initialize/update Device selection List diff --git a/modules/misc/dummy/aout.c b/modules/misc/dummy/aout.c index 510588f3b36152e05e7f4d2f40f8915b8e2ba818..b12450734ee1e4a4b6f2d01c1926c3427679accc 100644 --- a/modules/misc/dummy/aout.c +++ b/modules/misc/dummy/aout.c @@ -52,6 +52,7 @@ int OpenAudio ( vlc_object_t * p_this ) p_aout->pf_play = Play; p_aout->pf_pause = NULL; + p_aout->pf_flush = NULL; aout_VolumeSoftInit( p_aout ); if( AOUT_FMT_NON_LINEAR( &p_aout->format ) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index c94311e935958fea732e60adc902a1add107cde5..d18c6bad78b10f0f3f8223e4efc07630f4554bc5 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -123,6 +123,7 @@ int aout_OutputNew( audio_output_t * p_aout, const audio_sample_format_t * p_format ); void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer ); void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t ); +void aout_OutputFlush( audio_output_t * p_aout, bool ); void aout_OutputDelete( audio_output_t * p_aout ); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 8aad091d552c51c980219ee18f50e766b817d298..ee46b99497dd7ddcbd970f28da52f1d3895f7816 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -242,6 +242,8 @@ void aout_DecFlush( audio_output_t *p_aout, aout_input_t *p_input ) { aout_lock( p_aout ); aout_FifoReset( &p_input->fifo ); + aout_FifoReset( &p_aout->fifo ); + aout_OutputFlush( p_aout, false ); aout_unlock( p_aout ); } diff --git a/src/audio_output/output.c b/src/audio_output/output.c index fb1eed591f379eae3958e06d3772a8a7104ade47..9258fc927559d77409365349848bf9ddc4422641 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -252,6 +252,20 @@ void aout_OutputPause( audio_output_t *aout, bool pause, mtime_t date ) aout->pf_pause( aout, pause, date ); } +/** + * Flushes or drains the audio output buffers. + * This enables the output to expedite seek and stop. + * @param wait if true, wait for buffer playback (i.e. drain), + * if false, discard the buffers immediately (i.e. flush) + */ +void aout_OutputFlush( audio_output_t *aout, bool wait ) +{ + vlc_assert_locked( &aout->lock ); + + if( aout->pf_flush != NULL ) + aout->pf_flush( aout, wait ); +} + /*** Volume handling ***/