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
/* From input.c : */
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 );
void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
aout_buffer_t * p_buffer, int i_input_rate );
block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input,
block_t *p_buffer, int i_input_rate );
void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input );
/* From filters.c : */
......@@ -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_MixerRun(audio_mixer_t *, block_t *, float);
block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * );
/* From output.c : */
int aout_OutputNew( audio_output_t * p_aout,
const audio_sample_format_t * p_format );
......
......@@ -195,15 +195,20 @@ int aout_DecPlay( audio_output_t * p_aout, aout_input_t * p_input,
return -1;
}
/* 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;
while( (p_buffer = aout_OutputSlice( p_aout, &p_input->fifo ) ) != NULL )
if( p_buffer != NULL )
{
/* Mixer */
float amp = p_aout->mixer_multiplier * p_input->multiplier;
aout_MixerRun( p_aout->mixer, p_buffer, amp );
/* Output */
aout_OutputPlay( p_aout, p_buffer );
}
aout_unlock( p_aout );
return 0;
}
......
......@@ -485,8 +485,8 @@ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input
*****************************************************************************/
/* XXX Do not activate it !! */
//#define AOUT_PROCESS_BEFORE_CHEKS
void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
aout_buffer_t * p_buffer, int i_input_rate )
block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input,
block_t *p_buffer, int i_input_rate )
{
mtime_t start_date;
AOUT_ASSERT_LOCKED;
......@@ -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 )
{
inputDrop( p_input, p_buffer );
return;
return NULL;
}
#ifdef AOUT_PROCESS_BEFORE_CHEKS
......@@ -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,
&p_buffer );
if( !p_buffer )
return;
return NULL;
/* Actually run the resampler now. */
if ( p_input->i_nb_resamplers > 0 )
......@@ -514,11 +514,11 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
}
if( !p_buffer )
return;
return NULL;
if( p_buffer->i_nb_samples <= 0 )
{
block_Release( p_buffer );
return;
return NULL;
}
#endif
......@@ -564,7 +564,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
now - p_buffer->i_pts );
inputDrop( p_input, p_buffer );
inputResamplingStop( p_input );
return;
return NULL;
}
/* 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,
msg_Warn( p_aout, "buffer way too late (%"PRId64"), dropping buffer",
drift );
inputDrop( p_input, p_buffer );
return;
return NULL;
}
#ifndef AOUT_PROCESS_BEFORE_CHEKS
/* Run pre-filters. */
aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer );
if( !p_buffer )
return;
return NULL;
#endif
/* Run the resampler if needed.
......@@ -682,17 +682,17 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input,
}
if( !p_buffer )
return;
return NULL;
if( p_buffer->i_nb_samples <= 0 )
{
block_Release( p_buffer );
return;
return NULL;
}
#endif
/* Adding the start date will be managed by aout_FifoPush(). */
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 )
aout_FifoDestroy( &p_aout->fifo );
}
static block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * );
/*****************************************************************************
* aout_OutputPlay : play a buffer
*****************************************************************************
......@@ -236,8 +238,15 @@ void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer )
return;
}
aout_fifo_t *fifo = &p_aout->p_input->fifo;
/* 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)
* @note (FIXME) This is left here for historical reasons. It belongs in the
* 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;
/* 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 )
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;
/* 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)
* p_aout->mixer_format.i_rate / CLOCK_FREQ;
* p_aout->format.i_rate / CLOCK_FREQ;
if( delta != 0 )
msg_Warn( p_aout, "input start is not output end (%zd)", delta );
if( delta < 0 )
......@@ -461,7 +470,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo )
}
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_pts += t;
p_buffer->i_length -= t;
......@@ -498,7 +507,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo )
needed /= framesize;
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_length -= t;
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