/* */
int i_buffer_lost;
- /* */
- mtime_t i_pause_date;
-
/* */
bool b_recycle_vout;
aout_request_vout_t request_vout;
/* */
- aout_fifo_t fifo;
+ date_t date;
};
typedef struct
/* Indicates whether the audio output is currently starving, to avoid
* printing a 1,000 "output is starving" messages. */
bool b_starving;
+
+ mtime_t pause_date;
+ aout_fifo_t partial;
} aout_owner_t;
typedef struct
vlc_mutex_init (&owner->volume.lock);
owner->volume.multiplier = 1.0;
owner->volume.mixer = NULL;
- owner->b_starving = true;
vlc_mutex_init (&aout->lock);
return NULL;
p_input->b_error = true;
- p_input->i_pause_date = VLC_TS_INVALID;
aout_FormatPrepare( p_format );
aout_lock( p_aout );
assert (owner->input == p_input);
+ /* XXX: Should the input date be offset by the pause duration instead? */
+ date_Set (&p_input->date, VLC_TS_INVALID);
aout_OutputPause( p_aout, b_paused, i_date );
-
- if( b_paused )
- {
- p_input->i_pause_date = i_date;
- }
- else
- {
- assert( p_input->i_pause_date != VLC_TS_INVALID );
-
- mtime_t i_duration = i_date - p_input->i_pause_date;
- p_input->i_pause_date = VLC_TS_INVALID;
- aout_FifoMoveDates( &p_input->fifo, i_duration );
- }
aout_unlock( p_aout );
}
void aout_DecFlush( audio_output_t *p_aout, aout_input_t *p_input )
{
aout_lock( p_aout );
- aout_FifoReset( &p_input->fifo );
+ date_Set (&p_input->date, VLC_TS_INVALID);
aout_OutputFlush( p_aout, false );
aout_unlock( p_aout );
}
mtime_t end_date;
aout_lock( p_aout );
- end_date = aout_FifoNextStart( &p_input->fifo );
+ /* FIXME: tell output to drain */
+ end_date = date_Get (&p_input->date);
aout_unlock( p_aout );
return end_date == VLC_TS_INVALID || end_date <= mdate();
}
p_input->i_nb_resamplers = p_input->i_nb_filters = 0;
- /* Prepare FIFO. */
- aout_FifoInit (p_aout, &p_input->fifo, owner->mixer_format.i_rate);
+ date_Init (&p_input->date, owner->mixer_format.i_rate, 1);
+ date_Set (&p_input->date, VLC_TS_INVALID);
/* */
if( p_request_vout )
aout_FiltersDestroyPipeline( p_input->pp_resamplers,
p_input->i_nb_resamplers );
p_input->i_nb_resamplers = 0;
- aout_FifoDestroy( &p_input->fifo );
return 0;
}
*****************************************************************************/
void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input )
{
- aout_owner_t *owner = aout_owner (p_aout);
AOUT_ASSERT_LOCKED;
if( !p_input->b_restart )
return;
- /* A little trick to avoid loosing our input fifo and properties */
-
- aout_fifo_t fifo = p_input->fifo;
- mtime_t i_pause_date = p_input->i_pause_date;
-
- aout_FifoInit (p_aout, &p_input->fifo, owner->mixer_format.i_rate);
+ /* A little trick to avoid loosing our input properties */
+ date_t date = p_input->date;
aout_InputDelete( p_aout, p_input );
-
aout_InputNew( p_aout, p_input, &p_input->request_vout );
- p_input->fifo = fifo;
- p_input->i_pause_date = i_pause_date;
+ p_input->date = date;
p_input->b_restart = false;
}
/*****************************************************************************
/* We don't care if someone changes the start date behind our back after
* this. We'll deal with that when pushing the buffer, and compensate
* with the next incoming buffer. */
- start_date = aout_FifoNextStart( &p_input->fifo );
+ start_date = date_Get (&p_input->date);
if ( start_date != VLC_TS_INVALID && start_date < now )
{
* happen :). */
msg_Warn( p_aout, "computed PTS is out of range (%"PRId64"), "
"clearing out", now - start_date );
- aout_FifoReset( &p_input->fifo );
aout_OutputFlush( p_aout, false );
if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE )
msg_Warn( p_aout, "timing screwed, stopping resampling" );
/* If the audio drift is too big then it's not worth trying to resample
* the audio. */
if( start_date == VLC_TS_INVALID )
+ {
start_date = p_buffer->i_pts;
+ date_Set (&p_input->date, start_date);
+ }
mtime_t drift = start_date - p_buffer->i_pts;
{
msg_Warn( p_aout, "buffer way too early (%"PRId64"), clearing queue",
drift );
- aout_FifoReset( &p_input->fifo );
aout_OutputFlush( p_aout, false );
if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE )
msg_Warn( p_aout, "timing screwed, stopping resampling" );
inputResamplingStop( p_input );
p_buffer->i_flags |= BLOCK_FLAG_DISCONTINUITY;
start_date = p_buffer->i_pts;
+ date_Set (&p_input->date, start_date);
drift = 0;
}
else
}
#endif
- /* Adding the start date will be managed by aout_FifoPush(). */
p_buffer->i_pts = start_date;
+ date_Increment (&p_input->date, p_buffer->i_nb_samples);
return p_buffer;
}
aout_FiltersDestroyPipeline( p_input->pp_filters, p_input->i_nb_filters );
aout_FiltersDestroyPipeline( p_input->pp_resamplers,
p_input->i_nb_resamplers );
- aout_FifoDestroy( &p_input->fifo );
var_Destroy( p_aout, "visual" );
var_Destroy( p_aout, "equalizer" );
var_Destroy( p_aout, "audio-filter" );
var_TriggerCallback( p_aout, "intf-change" );
aout_FormatPrepare( &p_aout->format );
+ aout_FormatPrint( p_aout, "output", &p_aout->format );
/* Prepare FIFO. */
- aout_FifoInit( p_aout, &p_aout->fifo, p_aout->format.i_rate );
- aout_FormatPrint( p_aout, "output", &p_aout->format );
+ aout_FifoInit (p_aout, &p_aout->fifo, p_aout->format.i_rate);
+ aout_FifoInit (p_aout, &owner->partial, p_aout->format.i_rate);
+ owner->pause_date = VLC_TS_INVALID;
+ owner->b_starving = true;
/* Choose the mixer format. */
owner->mixer_format = p_aout->format;
aout_VolumeNoneInit( p_aout ); /* clear volume callback */
owner->module = NULL;
aout_FiltersDestroyPipeline (owner->filters, owner->nb_filters);
- aout_FifoDestroy( &p_aout->fifo );
+ aout_FifoDestroy (&p_aout->fifo);
+ aout_FifoDestroy (&owner->partial);
}
static block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * );
return;
}
- aout_fifo_t *fifo = &owner->input->fifo;
- /* XXX: cleanup */
- aout_FifoPush( fifo, p_buffer );
+ aout_FifoPush (&owner->partial, p_buffer );
- while( (p_buffer = aout_OutputSlice( p_aout, fifo ) ) != NULL )
+ while ((p_buffer = aout_OutputSlice (p_aout, &owner->partial)) != NULL)
{
aout_FifoPush( &p_aout->fifo, p_buffer );
p_aout->pf_play( p_aout );
*/
void aout_OutputPause( audio_output_t *aout, bool pause, mtime_t date )
{
- aout_owner_t *owner = aout_owner (aout);
-
vlc_assert_locked( &aout->lock );
-
if( aout->pf_pause != NULL )
aout->pf_pause( aout, pause, date );
- if( !pause )
+
+ aout_owner_t *owner = aout_owner (aout);
+ if (pause)
{
- mtime_t duration = date - owner->input->i_pause_date;
- /* XXX: ^ onk onk! gruik! ^ */
- aout_FifoMoveDates( &aout->fifo, duration );
+ owner->pause_date = date;
+ }
+ else
+ {
+ assert (owner->pause_date != VLC_TS_INVALID);
+
+ mtime_t duration = date - owner->pause_date;
+
+ owner->pause_date = VLC_TS_INVALID;
+ aout_FifoMoveDates (&owner->partial, duration);
+ aout_FifoMoveDates (&aout->fifo, duration);
}
}
if( aout->pf_flush != NULL )
aout->pf_flush( aout, wait );
- aout_FifoReset( &aout->fifo );
+
+ aout_owner_t *owner = aout_owner (aout);
+ aout_FifoReset (&aout->fifo);
+ aout_FifoReset (&owner->partial);
}
msg_Warn( p_aout, "output date isn't PTS date, requesting "
"resampling (%"PRId64")", delta );
- aout_FifoMoveDates (&owner->input->fifo, delta);
- aout_FifoMoveDates( p_fifo, delta );
+ aout_FifoMoveDates (&owner->partial, delta);
+ aout_FifoMoveDates (p_fifo, delta);
}
out:
aout_unlock( p_aout );