From e071592a4439419db7d70a7beff805379c9cb73b Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Tue, 2 Aug 2011 23:39:13 +0300 Subject: [PATCH] aout: pass audio buffer explicitly to pf_play --- include/vlc_aout.h | 3 +- modules/audio_output/alsa.c | 13 +++---- modules/audio_output/amem.c | 12 +++---- modules/audio_output/audioqueue.c | 6 ++-- modules/audio_output/auhal.c | 6 ++-- modules/audio_output/directx.c | 18 ++++------ modules/audio_output/file.c | 8 ++--- modules/audio_output/jack.c | 6 ++-- modules/audio_output/opensles_android.c | 46 +++++++++++-------------- modules/audio_output/oss.c | 6 ++-- modules/audio_output/portaudio.c | 6 ++-- modules/audio_output/pulse.c | 6 +--- modules/audio_output/sdl.c | 6 ++-- modules/audio_output/waveout.c | 9 ++--- src/audio_output/aout_internal.h | 2 +- src/audio_output/output.c | 5 +-- src/libvlccore.sym | 1 + 17 files changed, 68 insertions(+), 91 deletions(-) diff --git a/include/vlc_aout.h b/include/vlc_aout.h index 90e8edc338..52691fd6b4 100644 --- a/include/vlc_aout.h +++ b/include/vlc_aout.h @@ -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 * ); diff --git a/modules/audio_output/alsa.c b/modules/audio_output/alsa.c index ead207919a..db04ab41cc 100644 --- a/modules/audio_output/alsa.c +++ b/modules/audio_output/alsa.c @@ -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 ); diff --git a/modules/audio_output/amem.c b/modules/audio_output/amem.c index afd9e2abb9..ac4a11e7ea 100644 --- a/modules/audio_output/amem.c +++ b/modules/audio_output/amem.c @@ -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) diff --git a/modules/audio_output/audioqueue.c b/modules/audio_output/audioqueue.c index 6356799b38..b6ce4dba5d 100644 --- a/modules/audio_output/audioqueue.c +++ b/modules/audio_output/audioqueue.c @@ -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 ); } /***************************************************************************** diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c index 387a56b4c6..8f96ef9395 100644 --- a/modules/audio_output/auhal.c +++ b/modules/audio_output/auhal.c @@ -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 ); } diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c index a2c50fe39d..cbba399707 100644 --- a/modules/audio_output/directx.c +++ b/modules/audio_output/directx.c @@ -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 ); } /***************************************************************************** diff --git a/modules/audio_output/file.c b/modules/audio_output/file.c index 2790005db4..a9aa5f1713 100644 --- a/modules/audio_output/file.c +++ b/modules/audio_output/file.c @@ -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 ) { diff --git a/modules/audio_output/jack.c b/modules/audio_output/jack.c index 498f3b8ab2..4e87d7fb04 100644 --- a/modules/audio_output/jack.c +++ b/modules/audio_output/jack.c @@ -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 ); } /***************************************************************************** diff --git a/modules/audio_output/opensles_android.c b/modules/audio_output/opensles_android.c index 3dbb25008d..b2f016a436 100644 --- a/modules/audio_output/opensles_android.c +++ b/modules/audio_output/opensles_android.c @@ -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 ) diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c index 5195a1d56a..4608c8c69e 100644 --- a/modules/audio_output/oss.c +++ b/modules/audio_output/oss.c @@ -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 ); } /***************************************************************************** diff --git a/modules/audio_output/portaudio.c b/modules/audio_output/portaudio.c index ae05fa3cd3..7f9b01ec60 100644 --- a/modules/audio_output/portaudio.c +++ b/modules/audio_output/portaudio.c @@ -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 diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c index a3da6d46a9..595fb54cb0 100644 --- a/modules/audio_output/pulse.c +++ b/modules/audio_output/pulse.c @@ -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; diff --git a/modules/audio_output/sdl.c b/modules/audio_output/sdl.c index 6e51758fc4..470eb24c58 100644 --- a/modules/audio_output/sdl.c +++ b/modules/audio_output/sdl.c @@ -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 ); } /***************************************************************************** diff --git a/modules/audio_output/waveout.c b/modules/audio_output/waveout.c index d87bd11763..97e5c4371f 100644 --- a/modules/audio_output/waveout.c +++ b/modules/audio_output/waveout.c @@ -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."); diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 2494e35b96..64b34edb93 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -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 ); diff --git a/src/audio_output/output.c b/src/audio_output/output.c index a44a67a7a6..1923c6f339 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -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); } /** diff --git a/src/libvlccore.sym b/src/libvlccore.sym index a7673aa31c..a12dd531d7 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -15,6 +15,7 @@ aout_CheckChannelReorder aout_EnableFilter aout_FifoFirstDate aout_FifoPop +aout_FifoPush aout_filter_RequestVout aout_FormatPrepare aout_FormatPrint -- 2.39.2