Commit 69b16593 authored by Laurent Aimar's avatar Laurent Aimar

Updated "audio mixer" to new aout_mixer_t module API.

parent ebfb9a5a
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
*****************************************************************************/ *****************************************************************************/
static int Create ( vlc_object_t * ); static int Create ( vlc_object_t * );
static void DoWork ( aout_instance_t *, aout_buffer_t * ); static void DoWork ( aout_mixer_t *, aout_buffer_t * );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -57,27 +57,25 @@ vlc_module_end () ...@@ -57,27 +57,25 @@ vlc_module_end ()
*****************************************************************************/ *****************************************************************************/
static int Create( vlc_object_t *p_this ) static int Create( vlc_object_t *p_this )
{ {
aout_instance_t * p_aout = (aout_instance_t *)p_this; aout_mixer_t * p_mixer = (aout_mixer_t *)p_this;
if ( p_aout->mixer.mixer.i_format != VLC_CODEC_FL32 ) if ( p_mixer->fmt.i_format != VLC_CODEC_FL32 )
{
return -1; return -1;
}
/* Use the trivial mixer when we can */ /* Use the trivial mixer when we can */
if ( p_aout->i_nb_inputs == 1 && p_aout->mixer.f_multiplier == 1.0 ) if ( p_mixer->input_count == 1 && p_mixer->multiplier == 1.0 )
{ {
int i; int i;
for( i = 0; i < p_aout->i_nb_inputs; i++ ) for( i = 0; i < p_mixer->input_count; i++ )
{ {
if( p_aout->pp_inputs[i]->f_multiplier != 1.0 ) if( p_mixer->input[i]->multiplier != 1.0 )
break; break;
} }
if( i >= p_aout->i_nb_inputs ) if( i >= p_mixer->input_count )
return -1; return -1;
} }
p_aout->mixer.pf_do_work = DoWork; p_mixer->mix = DoWork;
return 0; return 0;
} }
...@@ -117,23 +115,23 @@ static void MeanWords( float * p_out, const float * p_in, size_t i_nb_words, ...@@ -117,23 +115,23 @@ static void MeanWords( float * p_out, const float * p_in, size_t i_nb_words,
* Terminology : in this function a word designates a single float32, eg. * Terminology : in this function a word designates a single float32, eg.
* a stereo sample is consituted of two words. * a stereo sample is consituted of two words.
*****************************************************************************/ *****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) static void DoWork( aout_mixer_t * p_mixer, aout_buffer_t * p_buffer )
{ {
const int i_nb_inputs = p_aout->i_nb_inputs; const int i_nb_inputs = p_mixer->input_count;
const float f_multiplier_global = p_aout->mixer.f_multiplier; const float f_multiplier_global = p_mixer->multiplier;
const int i_nb_channels = aout_FormatNbChannels( &p_aout->mixer.mixer ); const int i_nb_channels = aout_FormatNbChannels( &p_mixer->fmt );
int i_input; int i_input;
for ( i_input = 0; i_input < i_nb_inputs; i_input++ ) for ( i_input = 0; i_input < i_nb_inputs; i_input++ )
{ {
int i_nb_words = p_buffer->i_nb_samples * i_nb_channels; int i_nb_words = p_buffer->i_nb_samples * i_nb_channels;
aout_input_t * p_input = p_aout->pp_inputs[i_input]; aout_mixer_input_t * p_input = p_mixer->input[i_input];
float f_multiplier = f_multiplier_global * p_input->f_multiplier; float f_multiplier = f_multiplier_global * p_input->multiplier;
float * p_out = (float *)p_buffer->p_buffer; float * p_out = (float *)p_buffer->p_buffer;
float * p_in = (float *)p_input->p_first_byte_to_mix; float * p_in = (float *)p_input->begin;
if ( p_input->b_error || p_input->b_paused ) if ( p_input->is_invalid )
continue; continue;
for ( ; ; ) for ( ; ; )
...@@ -165,11 +163,11 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -165,11 +163,11 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
p_out += i_available_words; p_out += i_available_words;
/* Next buffer */ /* Next buffer */
p_old_buffer = aout_FifoPop( p_aout, &p_input->fifo ); p_old_buffer = aout_FifoPop( NULL, &p_input->fifo );
aout_BufferFree( p_old_buffer ); aout_BufferFree( p_old_buffer );
if ( p_input->fifo.p_first == NULL ) if ( p_input->fifo.p_first == NULL )
{ {
msg_Err( p_aout, "internal amix error" ); msg_Err( p_mixer, "internal amix error" );
return; return;
} }
p_in = (float *)p_input->fifo.p_first->p_buffer; p_in = (float *)p_input->fifo.p_first->p_buffer;
...@@ -189,8 +187,7 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -189,8 +187,7 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
f_multiplier ); f_multiplier );
} }
} }
p_input->p_first_byte_to_mix = (void *)(p_in p_input->begin = (void *)(p_in + i_nb_words);
+ i_nb_words);
break; break;
} }
} }
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
*****************************************************************************/ *****************************************************************************/
static int Create ( vlc_object_t * ); static int Create ( vlc_object_t * );
static void DoWork ( aout_instance_t *, aout_buffer_t * ); static void DoWork ( aout_mixer_t *, aout_buffer_t * );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -56,17 +56,17 @@ vlc_module_end () ...@@ -56,17 +56,17 @@ vlc_module_end ()
*****************************************************************************/ *****************************************************************************/
static int Create( vlc_object_t *p_this ) static int Create( vlc_object_t *p_this )
{ {
aout_instance_t * p_aout = (aout_instance_t *)p_this; aout_mixer_t *p_mixer = (aout_mixer_t *)p_this;
if ( !AOUT_FMT_NON_LINEAR(&p_aout->mixer.mixer) ) if ( !AOUT_FMT_NON_LINEAR(&p_mixer->fmt) )
{ {
return -1; return -1;
} }
p_aout->mixer.pf_do_work = DoWork; p_mixer->mix = DoWork;
/* This is a bit kludgy - do not ask for a new buffer, since the one /* This is a bit kludgy - do not ask for a new buffer, since the one
* provided by the first input will be good enough. */ * provided by the first input will be good enough. */
p_aout->mixer.output_alloc.i_alloc_type = AOUT_ALLOC_NONE; p_mixer->allocation.i_alloc_type = AOUT_ALLOC_NONE;
return 0; return 0;
} }
...@@ -74,25 +74,25 @@ static int Create( vlc_object_t *p_this ) ...@@ -74,25 +74,25 @@ static int Create( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* DoWork: mix a new output buffer - this does nothing, indeed * DoWork: mix a new output buffer - this does nothing, indeed
*****************************************************************************/ *****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) static void DoWork( aout_mixer_t * p_mixer, aout_buffer_t * p_buffer )
{ {
VLC_UNUSED( p_buffer ); VLC_UNUSED( p_buffer );
int i = 0; unsigned i = 0;
aout_input_t * p_input = p_aout->pp_inputs[i]; aout_mixer_input_t * p_input = p_mixer->input[i];
while ( p_input->b_error || p_input->b_paused ) while ( p_input->is_invalid )
p_input = p_aout->pp_inputs[++i]; p_input = p_mixer->input[++i];
aout_buffer_t * p_old_buffer = aout_FifoPop( p_aout, &p_input->fifo ); aout_buffer_t * p_old_buffer = aout_FifoPop( NULL, &p_input->fifo );
aout_BufferFree( p_old_buffer ); aout_BufferFree( p_old_buffer );
/* Empty other FIFOs to avoid a memory leak. */ /* Empty other FIFOs to avoid a memory leak. */
for ( i++; i < p_aout->i_nb_inputs; i++ ) for ( i++; i < p_mixer->input_count; i++ )
{ {
p_input = p_aout->pp_inputs[i]; p_input = p_mixer->input[i];
if ( p_input->b_error || p_input->b_paused ) if ( p_input->is_invalid )
continue; continue;
while ((p_old_buffer = aout_FifoPop( p_aout, &p_input->fifo ))) while ((p_old_buffer = aout_FifoPop( NULL, &p_input->fifo )))
aout_BufferFree( p_old_buffer ); aout_BufferFree( p_old_buffer );
} }
} }
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
*****************************************************************************/ *****************************************************************************/
static int Create ( vlc_object_t * ); static int Create ( vlc_object_t * );
static void DoWork ( aout_instance_t *, aout_buffer_t * ); static void DoWork ( aout_mixer_t *, aout_buffer_t * );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -57,15 +57,15 @@ vlc_module_end () ...@@ -57,15 +57,15 @@ vlc_module_end ()
*****************************************************************************/ *****************************************************************************/
static int Create( vlc_object_t *p_this ) static int Create( vlc_object_t *p_this )
{ {
aout_instance_t * p_aout = (aout_instance_t *)p_this; aout_mixer_t *p_mixer = (aout_mixer_t *)p_this;
if ( p_aout->mixer.mixer.i_format != VLC_CODEC_FL32 if ( p_mixer->fmt.i_format != VLC_CODEC_FL32
&& p_aout->mixer.mixer.i_format != VLC_CODEC_FI32 ) && p_mixer->fmt.i_format != VLC_CODEC_FI32 )
{ {
return -1; return -1;
} }
p_aout->mixer.pf_do_work = DoWork; p_mixer->mix = DoWork;
return 0; return 0;
} }
...@@ -73,23 +73,23 @@ static int Create( vlc_object_t *p_this ) ...@@ -73,23 +73,23 @@ static int Create( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* DoWork: mix a new output buffer * DoWork: mix a new output buffer
*****************************************************************************/ *****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) static void DoWork( aout_mixer_t *p_mixer, aout_buffer_t * p_buffer )
{ {
int i = 0; unsigned i = 0;
aout_input_t * p_input = p_aout->pp_inputs[i]; aout_mixer_input_t * p_input = p_mixer->input[i];
int i_nb_channels = aout_FormatNbChannels( &p_aout->mixer.mixer ); int i_nb_channels = aout_FormatNbChannels( &p_mixer->fmt );
int i_nb_bytes = p_buffer->i_nb_samples * sizeof(int32_t) int i_nb_bytes = p_buffer->i_nb_samples * sizeof(int32_t)
* i_nb_channels; * i_nb_channels;
uint8_t * p_in; uint8_t * p_in;
uint8_t * p_out; uint8_t * p_out;
while ( p_input->b_error || p_input->b_paused ) while ( p_input->is_invalid )
{ {
p_input = p_aout->pp_inputs[++i]; p_input = p_mixer->input[++i];
/* This can't crash because if no input has b_error == 0, the /* This can't crash because if no input has b_error == 0, the
* audio mixer cannot run and we can't be here. */ * audio mixer cannot run and we can't be here. */
} }
p_in = p_input->p_first_byte_to_mix; p_in = p_input->begin;
p_out = p_buffer->p_buffer; p_out = p_buffer->p_buffer;
for ( ; ; ) for ( ; ; )
...@@ -109,11 +109,11 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -109,11 +109,11 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
p_out += i_available_bytes; p_out += i_available_bytes;
/* Next buffer */ /* Next buffer */
p_old_buffer = aout_FifoPop( p_aout, &p_input->fifo ); p_old_buffer = aout_FifoPop( NULL, &p_input->fifo );
aout_BufferFree( p_old_buffer ); aout_BufferFree( p_old_buffer );
if ( p_input->fifo.p_first == NULL ) if ( p_input->fifo.p_first == NULL )
{ {
msg_Err( p_aout, "internal amix error" ); msg_Err( p_mixer, "internal amix error" );
return; return;
} }
p_in = p_input->fifo.p_first->p_buffer; p_in = p_input->fifo.p_first->p_buffer;
...@@ -121,19 +121,19 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -121,19 +121,19 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
else else
{ {
vlc_memcpy( p_out, p_in, i_nb_bytes ); vlc_memcpy( p_out, p_in, i_nb_bytes );
p_input->p_first_byte_to_mix = p_in + i_nb_bytes; p_input->begin = p_in + i_nb_bytes;
break; break;
} }
} }
/* Empty other FIFOs to avoid a memory leak. */ /* Empty other FIFOs to avoid a memory leak. */
for ( i++; i < p_aout->i_nb_inputs; i++ ) for ( i++; i < p_mixer->input_count; i++ )
{ {
aout_fifo_t * p_fifo; aout_fifo_t * p_fifo;
aout_buffer_t * p_deleted; aout_buffer_t * p_deleted;
p_input = p_aout->pp_inputs[i]; p_input = p_mixer->input[i];
if ( p_input->b_error || p_input->b_paused ) if ( p_input->is_invalid )
continue; continue;
p_fifo = &p_input->fifo; p_fifo = &p_input->fifo;
p_deleted = p_fifo->p_first; p_deleted = p_fifo->p_first;
......
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