[vlc-commits] aout: add an optional flush/drain callback

Rémi Denis-Courmont git at videolan.org
Mon Aug 1 19:18:29 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Aug  1 20:12:02 2011 +0300| [cba93dafca0f1789ed29015e8a7feb0d75047154] | committer: Rémi Denis-Courmont

aout: add an optional flush/drain callback

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.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cba93dafca0f1789ed29015e8a7feb0d75047154
---

 include/vlc_aout.h                      |    2 ++
 modules/audio_output/alsa.c             |    1 +
 modules/audio_output/amem.c             |    1 +
 modules/audio_output/audioqueue.c       |    1 +
 modules/audio_output/auhal.c            |    1 +
 modules/audio_output/directx.c          |    1 +
 modules/audio_output/file.c             |    1 +
 modules/audio_output/jack.c             |    1 +
 modules/audio_output/opensles_android.c |    3 ++-
 modules/audio_output/oss.c              |    1 +
 modules/audio_output/portaudio.c        |    1 +
 modules/audio_output/pulse.c            |    1 +
 modules/audio_output/sdl.c              |    1 +
 modules/audio_output/waveout.c          |    1 +
 modules/misc/dummy/aout.c               |    1 +
 src/audio_output/aout_internal.h        |    1 +
 src/audio_output/dec.c                  |    2 ++
 src/audio_output/output.c               |   14 ++++++++++++++
 18 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index b7d9043..aec1d4b 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 696c405..bd8e921 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 b035b45..afd9e2a 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 82cccf2..6356799 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 9383148..387a56b 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 7783575..a2c50fe 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 479cea0..2790005 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 e5280ba..498f3b8 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 2556059..3dbb250 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 7446945..5195a1d 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 49546b2..ae05fa3 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 7917c2b..b42e5ce 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 de71ebe..6e51758 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 52f1954..d87bd11 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 510588f..b124507 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 c94311e..d18c6ba 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 8aad091..ee46b99 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 fb1eed5..9258fc9 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 ***/
 



More information about the vlc-commits mailing list