Commit 74d6bb34 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout: mix and convert before slicing the audio packets

parent a7def3d5
...@@ -102,8 +102,8 @@ struct aout_input_t ...@@ -102,8 +102,8 @@ struct aout_input_t
/* From input.c : */ /* From input.c : */
int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_request_vout_t * ); int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_request_vout_t * );
int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ); int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input );
void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input,
aout_buffer_t * p_buffer, int i_input_rate ); block_t *p_buffer, int i_input_rate );
void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input ); void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input );
/* From filters.c : */ /* From filters.c : */
...@@ -118,8 +118,6 @@ audio_mixer_t *aout_MixerNew(vlc_object_t *, const audio_sample_format_t * ); ...@@ -118,8 +118,6 @@ audio_mixer_t *aout_MixerNew(vlc_object_t *, const audio_sample_format_t * );
void aout_MixerDelete(audio_mixer_t *); void aout_MixerDelete(audio_mixer_t *);
void aout_MixerRun(audio_mixer_t *, block_t *, float); void aout_MixerRun(audio_mixer_t *, block_t *, float);
block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * );
/* From output.c : */ /* From output.c : */
int aout_OutputNew( audio_output_t * p_aout, int aout_OutputNew( audio_output_t * p_aout,
const audio_sample_format_t * p_format ); const audio_sample_format_t * p_format );
......
...@@ -195,15 +195,20 @@ int aout_DecPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -195,15 +195,20 @@ int aout_DecPlay( audio_output_t * p_aout, aout_input_t * p_input,
return -1; return -1;
} }
/* Input */
aout_InputCheckAndRestart( p_aout, p_input ); aout_InputCheckAndRestart( p_aout, p_input );
aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate ); p_buffer = aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate );
const float amp = p_aout->mixer_multiplier * p_input->multiplier; if( p_buffer != NULL )
while( (p_buffer = aout_OutputSlice( p_aout, &p_input->fifo ) ) != NULL )
{ {
/* Mixer */
float amp = p_aout->mixer_multiplier * p_input->multiplier;
aout_MixerRun( p_aout->mixer, p_buffer, amp ); aout_MixerRun( p_aout->mixer, p_buffer, amp );
/* Output */
aout_OutputPlay( p_aout, p_buffer ); aout_OutputPlay( p_aout, p_buffer );
} }
aout_unlock( p_aout ); aout_unlock( p_aout );
return 0; return 0;
} }
......
...@@ -485,8 +485,8 @@ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input ...@@ -485,8 +485,8 @@ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input
*****************************************************************************/ *****************************************************************************/
/* XXX Do not activate it !! */ /* XXX Do not activate it !! */
//#define AOUT_PROCESS_BEFORE_CHEKS //#define AOUT_PROCESS_BEFORE_CHEKS
void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input,
aout_buffer_t * p_buffer, int i_input_rate ) block_t *p_buffer, int i_input_rate )
{ {
mtime_t start_date; mtime_t start_date;
AOUT_ASSERT_LOCKED; AOUT_ASSERT_LOCKED;
...@@ -494,7 +494,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -494,7 +494,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
if( i_input_rate != INPUT_RATE_DEFAULT && p_input->p_playback_rate_filter == NULL ) if( i_input_rate != INPUT_RATE_DEFAULT && p_input->p_playback_rate_filter == NULL )
{ {
inputDrop( p_input, p_buffer ); inputDrop( p_input, p_buffer );
return; return NULL;
} }
#ifdef AOUT_PROCESS_BEFORE_CHEKS #ifdef AOUT_PROCESS_BEFORE_CHEKS
...@@ -502,7 +502,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -502,7 +502,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
aout_FiltersPlay( p_aout, p_input->pp_filters, p_input->i_nb_filters, aout_FiltersPlay( p_aout, p_input->pp_filters, p_input->i_nb_filters,
&p_buffer ); &p_buffer );
if( !p_buffer ) if( !p_buffer )
return; return NULL;
/* Actually run the resampler now. */ /* Actually run the resampler now. */
if ( p_input->i_nb_resamplers > 0 ) if ( p_input->i_nb_resamplers > 0 )
...@@ -514,11 +514,11 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -514,11 +514,11 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
} }
if( !p_buffer ) if( !p_buffer )
return; return NULL;
if( p_buffer->i_nb_samples <= 0 ) if( p_buffer->i_nb_samples <= 0 )
{ {
block_Release( p_buffer ); block_Release( p_buffer );
return; return NULL;
} }
#endif #endif
...@@ -564,7 +564,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -564,7 +564,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
now - p_buffer->i_pts ); now - p_buffer->i_pts );
inputDrop( p_input, p_buffer ); inputDrop( p_input, p_buffer );
inputResamplingStop( p_input ); inputResamplingStop( p_input );
return; return NULL;
} }
/* If the audio drift is too big then it's not worth trying to resample /* If the audio drift is too big then it's not worth trying to resample
...@@ -593,14 +593,14 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -593,14 +593,14 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
msg_Warn( p_aout, "buffer way too late (%"PRId64"), dropping buffer", msg_Warn( p_aout, "buffer way too late (%"PRId64"), dropping buffer",
drift ); drift );
inputDrop( p_input, p_buffer ); inputDrop( p_input, p_buffer );
return; return NULL;
} }
#ifndef AOUT_PROCESS_BEFORE_CHEKS #ifndef AOUT_PROCESS_BEFORE_CHEKS
/* Run pre-filters. */ /* Run pre-filters. */
aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer ); aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer );
if( !p_buffer ) if( !p_buffer )
return; return NULL;
#endif #endif
/* Run the resampler if needed. /* Run the resampler if needed.
...@@ -682,17 +682,17 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, ...@@ -682,17 +682,17 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
} }
if( !p_buffer ) if( !p_buffer )
return; return NULL;
if( p_buffer->i_nb_samples <= 0 ) if( p_buffer->i_nb_samples <= 0 )
{ {
block_Release( p_buffer ); block_Release( p_buffer );
return; return NULL;
} }
#endif #endif
/* Adding the start date will be managed by aout_FifoPush(). */ /* Adding the start date will be managed by aout_FifoPush(). */
p_buffer->i_pts = start_date; p_buffer->i_pts = start_date;
aout_FifoPush( &p_input->fifo, p_buffer ); return p_buffer;
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -218,6 +218,8 @@ void aout_OutputDelete( audio_output_t * p_aout ) ...@@ -218,6 +218,8 @@ void aout_OutputDelete( audio_output_t * p_aout )
aout_FifoDestroy( &p_aout->fifo ); aout_FifoDestroy( &p_aout->fifo );
} }
static block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * );
/***************************************************************************** /*****************************************************************************
* aout_OutputPlay : play a buffer * aout_OutputPlay : play a buffer
***************************************************************************** *****************************************************************************
...@@ -236,8 +238,15 @@ void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -236,8 +238,15 @@ void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer )
return; return;
} }
aout_FifoPush( &p_aout->fifo, p_buffer ); aout_fifo_t *fifo = &p_aout->p_input->fifo;
p_aout->pf_play( p_aout ); /* XXX: cleanup */
aout_FifoPush( fifo, p_buffer );
while( (p_buffer = aout_OutputSlice( p_aout, fifo ) ) != NULL )
{
aout_FifoPush( &p_aout->fifo, p_buffer );
p_aout->pf_play( p_aout );
}
} }
/** /**
...@@ -375,7 +384,7 @@ void aout_VolumeHardSet (audio_output_t *aout, float volume, bool mute) ...@@ -375,7 +384,7 @@ void aout_VolumeHardSet (audio_output_t *aout, float volume, bool mute)
* @note (FIXME) This is left here for historical reasons. It belongs in the * @note (FIXME) This is left here for historical reasons. It belongs in the
* output code. Besides, this operation should be avoided if possible. * output code. Besides, this operation should be avoided if possible.
*/ */
block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) static block_t *aout_OutputSlice (audio_output_t *p_aout, aout_fifo_t *p_fifo)
{ {
const unsigned samples = p_aout->i_nb_samples; const unsigned samples = p_aout->i_nb_samples;
/* FIXME: Remove this silly constraint. Just pass buffers as they come to /* FIXME: Remove this silly constraint. Just pass buffers as they come to
...@@ -443,14 +452,14 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) ...@@ -443,14 +452,14 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo )
prev_date = p_buffer->i_pts + p_buffer->i_length; prev_date = p_buffer->i_pts + p_buffer->i_length;
} }
if( !AOUT_FMT_NON_LINEAR( &p_aout->mixer_format ) ) if( !AOUT_FMT_NON_LINEAR( &p_aout->format ) )
{ {
p_buffer = p_fifo->p_first; p_buffer = p_fifo->p_first;
/* Additionally check that p_first_byte_to_mix is well located. */ /* Additionally check that p_first_byte_to_mix is well located. */
const unsigned framesize = p_aout->mixer_format.i_bytes_per_frame; const unsigned framesize = p_aout->format.i_bytes_per_frame;
ssize_t delta = (start_date - p_buffer->i_pts) ssize_t delta = (start_date - p_buffer->i_pts)
* p_aout->mixer_format.i_rate / CLOCK_FREQ; * p_aout->format.i_rate / CLOCK_FREQ;
if( delta != 0 ) if( delta != 0 )
msg_Warn( p_aout, "input start is not output end (%zd)", delta ); msg_Warn( p_aout, "input start is not output end (%zd)", delta );
if( delta < 0 ) if( delta < 0 )
...@@ -461,7 +470,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) ...@@ -461,7 +470,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo )
} }
if( delta > 0 ) if( delta > 0 )
{ {
mtime_t t = delta * CLOCK_FREQ / p_aout->mixer_format.i_rate; mtime_t t = delta * CLOCK_FREQ / p_aout->format.i_rate;
p_buffer->i_nb_samples -= delta; p_buffer->i_nb_samples -= delta;
p_buffer->i_pts += t; p_buffer->i_pts += t;
p_buffer->i_length -= t; p_buffer->i_length -= t;
...@@ -498,7 +507,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) ...@@ -498,7 +507,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo )
needed /= framesize; needed /= framesize;
p_fifo->p_first->i_nb_samples -= needed; p_fifo->p_first->i_nb_samples -= needed;
mtime_t t = needed * CLOCK_FREQ / p_aout->mixer_format.i_rate; mtime_t t = needed * CLOCK_FREQ / p_aout->format.i_rate;
p_fifo->p_first->i_pts += t; p_fifo->p_first->i_pts += t;
p_fifo->p_first->i_length -= t; p_fifo->p_first->i_length -= t;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment