]> git.sesse.net Git - vlc/commitdiff
aout: add an optional flush/drain callback
authorRémi Denis-Courmont <remi@remlab.net>
Mon, 1 Aug 2011 17:12:02 +0000 (20:12 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Mon, 1 Aug 2011 17:14:47 +0000 (20:14 +0300)
Audio output plugins can use this to expedite discarding pending
buffers. This reduces latency upon seeking or stopping the input.

This new callback also supports explicit draining, but this is not
used for the time being.

18 files changed:
include/vlc_aout.h
modules/audio_output/alsa.c
modules/audio_output/amem.c
modules/audio_output/audioqueue.c
modules/audio_output/auhal.c
modules/audio_output/directx.c
modules/audio_output/file.c
modules/audio_output/jack.c
modules/audio_output/opensles_android.c
modules/audio_output/oss.c
modules/audio_output/portaudio.c
modules/audio_output/pulse.c
modules/audio_output/sdl.c
modules/audio_output/waveout.c
modules/misc/dummy/aout.c
src/audio_output/aout_internal.h
src/audio_output/dec.c
src/audio_output/output.c

index b7d90437847926955bff24332facb9114fe7f4fe..aec1d4b216fb7da53750d8a1c1a5f5ba2cc6d2d6 100644 (file)
@@ -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;
 };
index 696c405908fd939d7ad1eefe437e51a4cd69ed70..bd8e921cbb4921e31b9c78646fcf18c2adc341d0 100644 (file)
@@ -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;
index b035b45e9556d5383d5eb913f39bc43b2aebc013..afd9e2abb917850160e0370c73e7a3d5e385741d 100644 (file)
@@ -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
index 82cccf2be3b520adb8387564019c5137299cdacb..6356799b38b21eadb4df8e3dd7b30c029aad0954 100644 (file)
@@ -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);
index 93831482d6e8089591ad6d43cbd84bfa6b41a9e9..387a56b4c661ba98868977e595328ebff2e0726e 100644 (file)
@@ -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 );
 
index 77835751b0c2da20ebc90eaf272d88cffcd19010..a2c50fe39d61388d45bc261a003b6c027d517b3d 100644 (file)
@@ -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 */
index 479cea02c57fa9b74f49ce979dcc139cada987fd..2790005db42c3ced4f3f2c1f54bd3a8a4a2e8cda 100644 (file)
@@ -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" );
index e5280ba57b33d3b812d27f97c9c493be16d21270..498f3b8ab2c93b2c801212402dbb8bdd867001aa 100644 (file)
@@ -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 */
index 2556059115b4911a5eed76f6669c4914f4f788f6..3dbb25008d8a4df299830e096e9e98f27337c52e 100644 (file)
@@ -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 );
 
index 74469458869ac9e03f158fd99ce27c2eb09419bd..5195a1d56a1f170b880b542354fbe60443bccdfa 100644 (file)
@@ -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 )
     {
index 49546b244e9817166e1186af8dc2812c0fdbde73..ae05fa3cd34155b58b65580949654f018eba3f95 100644 (file)
@@ -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" );
index 7917c2bd24d7b06f1adcbe060bf2fc9f8baeacb9..b42e5ce5e4628abb240006a739d451aa6c615ff8 100644 (file)
@@ -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;
 
index de71ebeed6dcc2071e3b703c5c25bbe554de29aa..6e51758fc46ddba9e203f12907cbbb63bef40825 100644 (file)
@@ -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;
 }
index 52f1954226582b97ecbae2ccc5537ad01bd83745..d87bd11763e5691c57f3a730a1078981867d617c 100644 (file)
@@ -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
index 510588f3b36152e05e7f4d2f40f8915b8e2ba818..b12450734ee1e4a4b6f2d01c1926c3427679accc 100644 (file)
@@ -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 )
index c94311e935958fea732e60adc902a1add107cde5..d18c6bad78b10f0f3f8223e4efc07630f4554bc5 100644 (file)
@@ -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 );
 
 
index 8aad091d552c51c980219ee18f50e766b817d298..ee46b99497dd7ddcbd970f28da52f1d3895f7816 100644 (file)
@@ -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 );
 }
 
index fb1eed591f379eae3958e06d3772a8a7104ade47..9258fc927559d77409365349848bf9ddc4422641 100644 (file)
@@ -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 ***/