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
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 * );
*****************************************************************************/
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,
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 );
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)
*****************************************************************************/
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);
/*****************************************************************************
/*****************************************************************************
* 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 );
}
/*****************************************************************************
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 );
/*****************************************************************************
* 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 );
}
*****************************************************************************/
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 * );
* 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 );
}
/*****************************************************************************
*****************************************************************************/
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
/*****************************************************************************
* 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 )
{
*****************************************************************************/
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 );
/*****************************************************************************
* 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 );
}
/*****************************************************************************
*****************************************************************************/
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);
/*****************************************************************************
/*****************************************************************************
* 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 )
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 );
/*****************************************************************************
* 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 );
}
/*****************************************************************************
*****************************************************************************/
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 * );
/*****************************************************************************
* 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
/**
* 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;
*****************************************************************************/
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 );
/*****************************************************************************
/*****************************************************************************
* 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 );
}
/*****************************************************************************
*****************************************************************************/
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
* 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.");
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 );
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);
}
/**
aout_EnableFilter
aout_FifoFirstDate
aout_FifoPop
+aout_FifoPush
aout_filter_RequestVout
aout_FormatPrepare
aout_FormatPrint