X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_mixer%2Fspdif.c;h=c21e6e6094c74f95b04f52a0a8c8620cf37a07fe;hb=8744dc3050ea60d250de033d5b827ba2fb29b8bd;hp=201df71945b83159e45c4935146da5b1e5f49d2c;hpb=99fab9089e9e1709d9c3a4bc5ced0c137ac59134;p=vlc diff --git a/modules/audio_mixer/spdif.c b/modules/audio_mixer/spdif.c index 201df71945..c21e6e6094 100644 --- a/modules/audio_mixer/spdif.c +++ b/modules/audio_mixer/spdif.c @@ -29,7 +29,10 @@ # include "config.h" #endif -#include +#include + +#include +#include #include /***************************************************************************** @@ -37,35 +40,35 @@ *****************************************************************************/ 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 *****************************************************************************/ -vlc_module_begin(); - set_category( CAT_AUDIO ); - set_subcategory( SUBCAT_AUDIO_MISC ); - set_description( _("Dummy S/PDIF audio mixer") ); - set_capability( "audio mixer", 1 ); - set_callbacks( Create, NULL ); -vlc_module_end(); +vlc_module_begin () + set_category( CAT_AUDIO ) + set_subcategory( SUBCAT_AUDIO_MISC ) + set_description( N_("Dummy S/PDIF audio mixer") ) + set_capability( "audio mixer", 1 ) + set_callbacks( Create, NULL ) +vlc_module_end () /***************************************************************************** * Create: allocate spdif mixer *****************************************************************************/ 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; } - 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 * provided by the first input will be good enough. */ - p_aout->mixer.output_alloc.i_alloc_type = AOUT_ALLOC_NONE; + p_mixer->allocation.b_alloc = false; return 0; } @@ -73,34 +76,30 @@ static int Create( vlc_object_t *p_this ) /***************************************************************************** * 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 ) { - int i = 0; - aout_input_t * p_input = p_aout->pp_inputs[i]; - while ( p_input->b_error ) - { - p_input = p_aout->pp_inputs[++i]; - } - aout_FifoPop( p_aout, &p_input->fifo ); + VLC_UNUSED( p_buffer ); + + unsigned i = 0; + aout_mixer_input_t * p_input = p_mixer->input[i]; + while ( p_input->is_invalid ) + p_input = p_mixer->input[++i]; + + aout_buffer_t * p_old_buffer = aout_FifoPop( NULL, &p_input->fifo ); + /* We don't free the old buffer because, + * The aout core use a hack to avoid useless memcpy: the buffer in which + * to mix is the same as the one in the first active input fifo. + * So the ownership of that buffer belongs to our caller */ + assert( p_old_buffer == p_buffer ); /* 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_buffer_t * p_deleted; - - p_input = p_aout->pp_inputs[i]; - if ( p_input->b_error ) continue; - p_fifo = &p_input->fifo; - p_deleted = p_fifo->p_first; - while ( p_deleted != NULL ) - { - aout_buffer_t * p_next = p_deleted->p_next; - aout_BufferFree( p_deleted ); - p_deleted = p_next; - } - p_fifo->p_first = NULL; - p_fifo->pp_last = &p_fifo->p_first; + p_input = p_mixer->input[i]; + if ( p_input->is_invalid ) + continue; + while ((p_old_buffer = aout_FifoPop( NULL, &p_input->fifo ))) + aout_BufferFree( p_old_buffer ); } }