X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_mixer%2Fspdif.c;h=c21e6e6094c74f95b04f52a0a8c8620cf37a07fe;hb=e0fa673d823a064e44e51c04985ba9accdfc5389;hp=1ac2cad76762446326e9c44c3cdafc29a60542bd;hpb=a6bb3a1fe860e3925aef91ee9f67c50e669803e0;p=vlc diff --git a/modules/audio_mixer/spdif.c b/modules/audio_mixer/spdif.c index 1ac2cad767..c21e6e6094 100644 --- a/modules/audio_mixer/spdif.c +++ b/modules/audio_mixer/spdif.c @@ -1,8 +1,8 @@ /***************************************************************************** * spdif.c : dummy mixer for S/PDIF output (1 input only) ***************************************************************************** - * Copyright (C) 2002 VideoLAN - * $Id: spdif.c,v 1.8 2002/11/20 16:43:33 sam Exp $ + * Copyright (C) 2002 the VideoLAN team + * $Id$ * * Authors: Christophe Massiot * @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,51 +18,57 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include -#include -#include "audio_output.h" -#include "aout_internal.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include +#include /***************************************************************************** * Local prototypes *****************************************************************************/ 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_description( _("dummy spdif audio mixer module") ); - 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; } @@ -70,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 ); } }