]> git.sesse.net Git - vlc/commitdiff
aout: pass audio buffer explicitly to pf_play
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 2 Aug 2011 20:39:13 +0000 (23:39 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 2 Aug 2011 21:01:29 +0000 (00:01 +0300)
17 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
src/audio_output/aout_internal.h
src/audio_output/output.c
src/libvlccore.sym

index 90e8edc338b12c2ad8108892e8ba0ac6f530807c..52691fd6b472785f13908f980d9af9b9f02e4b01 100644 (file)
@@ -179,7 +179,7 @@ struct audio_output
     aout_fifo_t             fifo;
 
     struct aout_sys_t *sys; /**< Output plugin private data */
-    void (*pf_play)( audio_output_t * ); /**< Audio buffer callback */
+    void (*pf_play)(audio_output_t *, block_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
@@ -254,6 +254,7 @@ VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) V
 
 VLC_API mtime_t aout_FifoFirstDate( const aout_fifo_t * ) VLC_USED;
 VLC_API aout_buffer_t *aout_FifoPop( aout_fifo_t * p_fifo ) VLC_USED;
+VLC_API void aout_FifoPush( aout_fifo_t *, block_t * );
 
 VLC_API void aout_VolumeNoneInit( audio_output_t * );
 VLC_API void aout_VolumeSoftInit( audio_output_t * );
index ead207919a4417517ab34c3a7ab22bd167ab6c62..db04ab41cc49f5029d00bcd1ff390b7432a1b986 100644 (file)
@@ -85,7 +85,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int   Open         ( vlc_object_t * );
 static void  Close        ( vlc_object_t * );
-static void  Play         ( audio_output_t * );
+static void  Play         ( audio_output_t *, block_t * );
 static void* ALSAThread   ( void * );
 static void  ALSAFill     ( audio_output_t * );
 static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
@@ -522,20 +522,21 @@ error:
     return VLC_EGENERIC;
 }
 
-static void PlayIgnore( audio_output_t *p_aout )
-{   /* Already playing - nothing to do */
-    (void) p_aout;
+static void PlayIgnore( audio_output_t *p_aout, block_t *block )
+{
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 /*****************************************************************************
  * Play: start playback
  *****************************************************************************/
-static void Play( audio_output_t *p_aout )
+static void Play( audio_output_t *p_aout, block_t *block )
 {
     p_aout->pf_play = PlayIgnore;
 
     /* get the playing date of the first aout buffer */
-    p_aout->sys->start_date = aout_FifoFirstDate( &p_aout->fifo );
+    p_aout->sys->start_date = block->i_pts;
+    aout_FifoPush( &p_aout->fifo, block );
 
     /* wake up the audio output thread */
     sem_post( &p_aout->sys->wait );
index afd9e2abb917850160e0370c73e7a3d5e385741d..ac4a11e7ead4e955e6c440439e6870403b46fe93 100644 (file)
@@ -59,17 +59,13 @@ struct aout_sys_t
     void (*cleanup) (void *opaque);
 };
 
-static void Play (audio_output_t *aout)
+static void Play (audio_output_t *aout, block_t *block)
 {
     aout_sys_t *sys = aout->sys;
-    block_t *block;
 
-    while ((block = aout_FifoPop(&aout->fifo)) != NULL)
-    {
-        sys->play (sys->opaque, block->p_buffer, block->i_nb_samples,
-                   block->i_pts);
-        block_Release (block);
-    }
+    sys->play (sys->opaque, block->p_buffer, block->i_nb_samples,
+               block->i_pts);
+    block_Release (block);
 }
 
 static int VolumeSet (audio_output_t *aout, float vol, bool mute)
index 6356799b38b21eadb4df8e3dd7b30c029aad0954..b6ce4dba5df5eeb0989c21281e94f293d04812be 100644 (file)
@@ -54,7 +54,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int  Open               ( vlc_object_t * );
 static void Close              ( vlc_object_t * );
-static void Play               ( audio_output_t * );
+static void Play               ( audio_output_t *, block_t * );
 static void AudioQueueCallback (void *, AudioQueueRef, AudioQueueBufferRef);
 
 /*****************************************************************************
@@ -135,9 +135,9 @@ static int Open ( vlc_object_t *p_this )
 /*****************************************************************************
  * Play: play a sound samples buffer
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *block )
 {
-    VLC_UNUSED(p_aout);
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 /*****************************************************************************
index 387a56b4c661ba98868977e595328ebff2e0726e..8f96ef93952ddbbe1903ecfc57589e9cc74f46ac 100644 (file)
@@ -112,7 +112,7 @@ static int      OpenAnalog              ( audio_output_t * );
 static int      OpenSPDIF               ( audio_output_t * );
 static void     Close                   ( vlc_object_t * );
 
-static void     Play                    ( audio_output_t * );
+static void     Play                    ( audio_output_t *, block_t * );
 static void     Probe                   ( audio_output_t * );
 
 static int      AudioDeviceHasOutput    ( AudioDeviceID );
@@ -910,9 +910,9 @@ static void Close( vlc_object_t * p_this )
 /*****************************************************************************
  * Play: nothing to do
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *block )
 {
-    VLC_UNUSED(p_aout);
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 
index a2c50fe39d61388d45bc261a003b6c027d517b3d..cbba3997076a93c0d265449d2c9e4021f03bbaea 100644 (file)
@@ -94,7 +94,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int  OpenAudio  ( vlc_object_t * );
 static void CloseAudio ( vlc_object_t * );
-static void Play       ( audio_output_t * );
+static void Play       ( audio_output_t *, block_t * );
 
 /* local functions */
 static void Probe             ( audio_output_t * );
@@ -569,29 +569,23 @@ static void Probe( audio_output_t * p_aout )
  *       we know the first buffer has been put in the aout fifo and we also
  *       know its date.
  *****************************************************************************/
-static void Play( audio_output_t *p_aout )
+static void Play( audio_output_t *p_aout, block_t *p_buffer )
 {
     if( !p_aout->sys->b_playing )
     {
-        aout_buffer_t *p_buffer;
-
         p_aout->sys->b_playing = 1;
 
         /* get the playing date of the first aout buffer */
-        p_aout->sys->p_notif->start_date =
-            aout_FifoFirstDate( &p_aout->fifo );
+        p_aout->sys->p_notif->start_date = p_buffer->i_pts;
 
         /* fill in the first samples */
-        for( int i = 0; i < FRAMES_NUM; i++ )
-        {
-            p_buffer = aout_FifoPop( &p_aout->fifo );
-            if( !p_buffer ) break;
-            FillBuffer( p_aout, i, p_buffer );
-        }
+        FillBuffer( p_aout, 0, p_buffer );
 
         /* wake up the audio output thread */
         SetEvent( p_aout->sys->p_notif->event );
     }
+    else
+        aout_FifoPush( &p_aout->fifo, p_buffer );
 }
 
 /*****************************************************************************
index 2790005db42c3ced4f3f2c1f54bd3a8a4a2e8cda..a9aa5f17133de803b237bf4859520e85db3435f1 100644 (file)
@@ -73,7 +73,7 @@ static const int pi_channels_maps[CHANNELS_MAX+1] =
  *****************************************************************************/
 static int     Open        ( vlc_object_t * );
 static void    Close       ( vlc_object_t * );
-static void    Play        ( audio_output_t * );
+static void    Play        ( audio_output_t *, block_t * );
 
 /*****************************************************************************
  * Module descriptor
@@ -316,12 +316,8 @@ static void Close( vlc_object_t * p_this )
 /*****************************************************************************
  * Play: pretend to play a sound
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *p_buffer )
 {
-    aout_buffer_t * p_buffer;
-
-    p_buffer = aout_FifoPop( &p_aout->fifo );
-
     if( fwrite( p_buffer->p_buffer, p_buffer->i_buffer, 1,
                 p_aout->sys->p_file ) != 1 )
     {
index 498f3b8ab2c93b2c801212402dbb8bdd867001aa..4e87d7fb04079b08ee7e9e9413e5b9cb6912bd3d 100644 (file)
@@ -62,7 +62,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int  Open         ( vlc_object_t * );
 static void Close        ( vlc_object_t * );
-static void Play         ( audio_output_t * );
+static void Play         ( audio_output_t *, block_t * );
 static int  Process      ( jack_nframes_t i_frames, void *p_arg );
 static int  GraphChange  ( void *p_arg );
 
@@ -334,9 +334,9 @@ static int GraphChange( void *p_arg )
 /*****************************************************************************
  * Play: nothing to do
  *****************************************************************************/
-static void Play( audio_output_t *p_aout )
+static void Play( audio_output_t *p_aout, block_t *block )
 {
-    VLC_UNUSED( p_aout );
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 /*****************************************************************************
index 3dbb25008d8a4df299830e096e9e98f27337c52e..b2f016a43600de8931e3abffd7f742d0afb38d0e 100644 (file)
@@ -75,7 +75,7 @@ typedef SLresult (*slCreateEngine_t)(
  *****************************************************************************/
 static int  Open        ( vlc_object_t * );
 static void Close       ( vlc_object_t * );
-static void Play        ( audio_output_t * );
+static void Play        ( audio_output_t *, block_t * );
 static void PlayedCallback ( SLAndroidSimpleBufferQueueItf caller,  void *pContext);
 
 /*****************************************************************************
@@ -291,42 +291,36 @@ static void Close( vlc_object_t * p_this )
 /*****************************************************************************
  * Play: play a sound
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *p_buffer )
 {
     aout_sys_t * p_sys = p_aout->sys;
     aout_buffer_t *p_buffer;
 
     SLresult result;
 
-    p_buffer = aout_FifoPop(&p_aout->fifo);
-    if( p_buffer != NULL )
+    for (;;)
     {
-        for (;;)
-        {
-            result = (*p_sys->playerBufferQueue)->Enqueue(
+        result = (*p_sys->playerBufferQueue)->Enqueue(
                             p_sys->playerBufferQueue, p_buffer->p_buffer,
                             p_buffer->i_buffer );
-            if( result == SL_RESULT_SUCCESS )
-                break;
-            if ( result != SL_RESULT_BUFFER_INSUFFICIENT )
-            {
-                msg_Warn( p_aout, "Dropping invalid buffer" );
-                aout_BufferFree( p_buffer );
-                return ;
-            }
-
-            msg_Err( p_aout, "write error (%lu)", result );
-
-            // Wait a bit to retry. might miss calls to *cancel
-            // but this is supposed to be rare anyway
-            msleep(CLOCK_FREQ);
+        if( result == SL_RESULT_SUCCESS )
+            break;
+        if ( result != SL_RESULT_BUFFER_INSUFFICIENT )
+        {
+            msg_Warn( p_aout, "Dropping invalid buffer" );
+            aout_BufferFree( p_buffer );
+            return ;
         }
-        p_sys->p_buffer_array[p_sys->i_toappend_buffer] = p_buffer;
-        if( ++p_sys->i_toappend_buffer == BUFF_QUEUE )
-            p_sys->i_toappend_buffer = 0;
+
+        msg_Err( p_aout, "write error (%lu)", result );
+
+        // Wait a bit to retry. might miss calls to *cancel
+        // but this is supposed to be rare anyway
+        msleep(CLOCK_FREQ);
     }
-    else
-        msg_Err( p_aout, "nothing to play?" );
+    p_sys->p_buffer_array[p_sys->i_toappend_buffer] = p_buffer;
+    if( ++p_sys->i_toappend_buffer == BUFF_QUEUE )
+        p_sys->i_toappend_buffer = 0;
 }
 
 static void PlayedCallback (SLAndroidSimpleBufferQueueItf caller, void *pContext )
index 5195a1d56a1f170b880b542354fbe60443bccdfa..4608c8c69e1fbc7c4d4c7c8cd26fd92a7da072d7 100644 (file)
@@ -86,7 +86,7 @@ struct aout_sys_t
 static int  Open         ( vlc_object_t * );
 static void Close        ( vlc_object_t * );
 
-static void Play         ( audio_output_t * );
+static void Play         ( audio_output_t *, block_t * );
 static void* OSSThread   ( void * );
 
 static mtime_t BufferDuration( audio_output_t * p_aout );
@@ -520,9 +520,9 @@ static int Open( vlc_object_t *p_this )
 /*****************************************************************************
  * Play: nothing to do
  *****************************************************************************/
-static void Play( audio_output_t *p_aout )
+static void Play( audio_output_t *p_aout, block_t *block )
 {
-    VLC_UNUSED(p_aout);
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 /*****************************************************************************
index ae05fa3cd34155b58b65580949654f018eba3f95..7f9b01ec604b26cb0a950141c883de50c6c3406b 100644 (file)
@@ -95,7 +95,7 @@ static void* PORTAUDIOThread( void * );
  *****************************************************************************/
 static int  Open        ( vlc_object_t * );
 static void Close       ( vlc_object_t * );
-static void Play        ( audio_output_t * );
+static void Play        ( audio_output_t *, block_t * );
 
 static int PAOpenDevice( audio_output_t * );
 static int PAOpenStream( audio_output_t * );
@@ -559,9 +559,9 @@ static int PAOpenStream( audio_output_t *p_aout )
 /*****************************************************************************
  * Play: play sound
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *block )
 {
-    VLC_UNUSED( p_aout );
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 #ifdef PORTAUDIO_IS_SERIOUSLY_BROKEN
index a3da6d46a9a8611604a5dc7519b77e1267fe0246..595fb54cb091a702fb9f131f2a61b6085c2530aa 100644 (file)
@@ -444,15 +444,11 @@ static void *data_convert(block_t **pp)
 /**
  * Queue one audio frame to the playabck stream
  */
-static void Play(audio_output_t *aout)
+static void Play(audio_output_t *aout, block_t *block)
 {
     aout_sys_t *sys = aout->sys;
     pa_stream *s = sys->stream;
 
-    /* This function is called exactly once per block in the output FIFO. */
-    block_t *block = aout_FifoPop(&aout->fifo);
-    assert (block != NULL);
-
     const void *ptr = data_convert(&block);
     if (unlikely(ptr == NULL))
         return;
index 6e51758fc46ddba9e203f12907cbbb63bef40825..470eb24c58911c091f067270117fc3c70a6b7a79 100644 (file)
@@ -58,7 +58,7 @@ struct aout_sys_t
  *****************************************************************************/
 static int  Open        ( vlc_object_t * );
 static void Close       ( vlc_object_t * );
-static void Play        ( audio_output_t * );
+static void Play        ( audio_output_t *, block_t * );
 static void SDLCallback ( void *, uint8_t *, int );
 
 /*****************************************************************************
@@ -224,9 +224,9 @@ static int Open ( vlc_object_t *p_this )
 /*****************************************************************************
  * Play: play a sound samples buffer
  *****************************************************************************/
-static void Play( audio_output_t * p_aout )
+static void Play( audio_output_t * p_aout, block_t *block )
 {
-    VLC_UNUSED(p_aout);
+    aout_FifoPush( &p_aout->fifo, block );
 }
 
 /*****************************************************************************
index d87bd11763e5691c57f3a730a1078981867d617c..97e5c4371f550b4690069f01edcc8de909667704 100644 (file)
@@ -46,7 +46,7 @@
  *****************************************************************************/
 static int  Open         ( vlc_object_t * );
 static void Close        ( vlc_object_t * );
-static void Play         ( audio_output_t * );
+static void Play         ( audio_output_t *, block_t * );
 
 /*****************************************************************************
  * notification_thread_t: waveOut event thread
@@ -473,15 +473,16 @@ static void Probe( audio_output_t * p_aout )
  * This doesn't actually play the buffer. This just stores the buffer so it
  * can be played by the callback thread.
  *****************************************************************************/
-static void Play( audio_output_t *_p_aout )
+static void Play( audio_output_t *_p_aout, block_t *block )
 {
+    aout_FifoPush( &_p_aout->fifo, block );
+
     if( !_p_aout->sys->b_playing )
     {
         _p_aout->sys->b_playing = 1;
 
         /* get the playing date of the first aout buffer */
-        _p_aout->sys->start_date =
-            aout_FifoFirstDate( &_p_aout->fifo );
+        _p_aout->sys->start_date = block->i_pts;
 
         msg_Dbg( _p_aout, "Wakeup sleeping output thread.");
 
index 2494e35b96833e3b0837319ce281fbdb0615463b..64b34edb936e4b9b47cbf2f771d2aff86692e762 100644 (file)
@@ -167,7 +167,7 @@ audio_output_t *aout_New ( vlc_object_t * );
 void aout_FifoInit( vlc_object_t *, aout_fifo_t *, uint32_t );
 #define aout_FifoInit(o, f, r) aout_FifoInit(VLC_OBJECT(o), f, r)
 mtime_t aout_FifoNextStart( const aout_fifo_t * ) VLC_USED;
-void aout_FifoPush( aout_fifo_t *, aout_buffer_t * );
+//void aout_FifoPush( aout_fifo_t *, aout_buffer_t * );
 void aout_FifoReset( aout_fifo_t * );
 void aout_FifoMoveDates( aout_fifo_t *, mtime_t );
 void aout_FifoDestroy( aout_fifo_t * p_fifo );
index a44a67a7a65f939071edab1ad217b72c257d6595..1923c6f3397851417b220fb2208f37f3e91c5473 100644 (file)
@@ -250,10 +250,7 @@ void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer )
     aout_FifoPush (&owner->partial, p_buffer );
 
     while ((p_buffer = aout_OutputSlice (p_aout, &owner->partial)) != NULL)
-    {
-        aout_FifoPush( &p_aout->fifo, p_buffer );
-        p_aout->pf_play( p_aout );
-    }
+        p_aout->pf_play (p_aout, p_buffer);
 }
 
 /**
index a7673aa31c1cda771314b2a60ea8c89a2f30f23c..a12dd531d7b96feba4a836d518db017733a47907 100644 (file)
@@ -15,6 +15,7 @@ aout_CheckChannelReorder
 aout_EnableFilter
 aout_FifoFirstDate
 aout_FifoPop
+aout_FifoPush
 aout_filter_RequestVout
 aout_FormatPrepare
 aout_FormatPrint