Commit f4bd2584 authored by Christophe Massiot's avatar Christophe Massiot

* Several stability patches for multiple input streams aout.

parent ef6c706b
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* spdif.c : dummy mixer for S/PDIF output (1 input only) * spdif.c : dummy mixer for S/PDIF output (1 input only)
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: spdif.c,v 1.6 2002/09/20 23:27:03 massiot Exp $ * $Id: spdif.c,v 1.7 2002/09/28 13:05:16 massiot Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -73,8 +73,32 @@ static int Create( vlc_object_t *p_this ) ...@@ -73,8 +73,32 @@ static int Create( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
{ {
aout_input_t * p_input = p_aout->pp_inputs[0]; int i = 0;
if ( p_input->b_error ) return; 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 ); aout_FifoPop( p_aout, &p_input->fifo );
/* Empty other FIFOs to avoid a memory leak. */
for ( i++; i < p_aout->i_nb_inputs; 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;
}
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* trivial.c : trivial mixer plug-in (1 input, no downmixing) * trivial.c : trivial mixer plug-in (1 input, no downmixing)
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: trivial.c,v 1.7 2002/09/20 23:27:03 massiot Exp $ * $Id: trivial.c,v 1.8 2002/09/28 13:05:16 massiot Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -71,13 +71,21 @@ static int Create( vlc_object_t *p_this ) ...@@ -71,13 +71,21 @@ static int Create( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
{ {
aout_input_t * p_input = p_aout->pp_inputs[0]; int i = 0;
aout_input_t * p_input = p_aout->pp_inputs[i];
int i_nb_bytes = p_buffer->i_nb_samples * sizeof(s32) int i_nb_bytes = p_buffer->i_nb_samples * sizeof(s32)
* p_aout->mixer.mixer.i_channels; * p_aout->mixer.mixer.i_channels;
byte_t * p_in = p_input->p_first_byte_to_mix; byte_t * p_in;
byte_t * p_out = p_buffer->p_buffer; byte_t * p_out;
if ( p_input->b_error ) return; while ( p_input->b_error )
{
p_input = p_aout->pp_inputs[++i];
/* This can't crash because if no input has b_error == 0, the
* audio mixer cannot run and we can't be here. */
}
p_in = p_input->p_first_byte_to_mix;
p_out = p_buffer->p_buffer;
for ( ; ; ) for ( ; ; )
{ {
...@@ -114,5 +122,25 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) ...@@ -114,5 +122,25 @@ static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
break; break;
} }
} }
/* Empty other FIFOs to avoid a memory leak. */
for ( i++; i < p_aout->i_nb_inputs; 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;
}
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* decoder.c: AAC decoder using libfaad2 * decoder.c: AAC decoder using libfaad2
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * Copyright (C) 2001, 2002 VideoLAN
* $Id: decoder.c,v 1.3 2002/09/26 22:40:21 massiot Exp $ * $Id: decoder.c,v 1.4 2002/09/28 13:05:16 massiot Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -329,6 +329,8 @@ static int InitThread( adec_thread_t * p_adec ) ...@@ -329,6 +329,8 @@ static int InitThread( adec_thread_t * p_adec )
p_adec->output_format.i_format = AOUT_FMT_FLOAT32; p_adec->output_format.i_format = AOUT_FMT_FLOAT32;
p_adec->output_format.i_rate = i_rate; p_adec->output_format.i_rate = i_rate;
p_adec->output_format.i_channels = i_channels; p_adec->output_format.i_channels = i_channels;
p_adec->p_aout = NULL;
p_adec->p_aout_input = NULL;
#if 0 #if 0
if( !p_adec->format.p_data ) if( !p_adec->format.p_data )
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* lpcm.c: lpcm decoder module * lpcm.c: lpcm decoder module
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: lpcm.c,v 1.2 2002/09/26 22:40:20 massiot Exp $ * $Id: lpcm.c,v 1.3 2002/09/28 13:05:16 massiot Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* Henri Fallon <henri@videolan.org> * Henri Fallon <henri@videolan.org>
...@@ -131,6 +131,7 @@ static int RunDecoder( decoder_fifo_t * p_fifo ) ...@@ -131,6 +131,7 @@ static int RunDecoder( decoder_fifo_t * p_fifo )
p_dec->output_format.i_rate = 48000; p_dec->output_format.i_rate = 48000;
aout_DateInit( &p_dec->end_date, 48000 ); aout_DateInit( &p_dec->end_date, 48000 );
p_dec->p_aout = NULL;
p_dec->p_aout_input = aout_DecNew( p_dec->p_fifo, p_dec->p_aout_input = aout_DecNew( p_dec->p_fifo,
&p_dec->p_aout, &p_dec->p_aout,
&p_dec->output_format ); &p_dec->output_format );
......
...@@ -190,7 +190,7 @@ static void EndThread (mad_adec_thread_t * p_dec) ...@@ -190,7 +190,7 @@ static void EndThread (mad_adec_thread_t * p_dec)
/* If the audio output fifo was created, we destroy it */ /* If the audio output fifo was created, we destroy it */
if (p_dec->p_aout_input != NULL) if (p_dec->p_aout_input != NULL)
{ {
aout_InputDelete( p_dec->p_aout, p_dec->p_aout_input ); aout_DecDelete( p_dec->p_aout, p_dec->p_aout_input );
} }
/* mad_decoder_finish releases the memory allocated inside the struct */ /* mad_decoder_finish releases the memory allocated inside the struct */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mixer.c : audio output mixing operations * mixer.c : audio output mixing operations
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: mixer.c,v 1.16 2002/09/26 22:40:25 massiot Exp $ * $Id: mixer.c,v 1.17 2002/09/28 13:05:16 massiot Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* *
...@@ -74,7 +74,7 @@ int aout_MixerDelete( aout_instance_t * p_aout ) ...@@ -74,7 +74,7 @@ int aout_MixerDelete( aout_instance_t * p_aout )
*****************************************************************************/ *****************************************************************************/
static int MixBuffer( aout_instance_t * p_aout ) static int MixBuffer( aout_instance_t * p_aout )
{ {
int i, i_nb_real_inputs = 0; int i, i_first_input = 0;
aout_buffer_t * p_output_buffer; aout_buffer_t * p_output_buffer;
mtime_t start_date, end_date; mtime_t start_date, end_date;
audio_date_t exact_start_date; audio_date_t exact_start_date;
...@@ -168,8 +168,11 @@ static int MixBuffer( aout_instance_t * p_aout ) ...@@ -168,8 +168,11 @@ static int MixBuffer( aout_instance_t * p_aout )
mtime_t prev_date; mtime_t prev_date;
vlc_bool_t b_drop_buffers; vlc_bool_t b_drop_buffers;
if ( p_input->b_error ) continue; if ( p_input->b_error )
i_nb_real_inputs++; {
if ( i_first_input == i ) i_first_input++;
continue;
}
p_buffer = p_fifo->p_first; p_buffer = p_fifo->p_first;
if ( p_buffer == NULL ) if ( p_buffer == NULL )
...@@ -268,7 +271,7 @@ static int MixBuffer( aout_instance_t * p_aout ) ...@@ -268,7 +271,7 @@ static int MixBuffer( aout_instance_t * p_aout )
if ( p_buffer == NULL ) break; if ( p_buffer == NULL ) break;
} }
if ( i < p_aout->i_nb_inputs || !i_nb_real_inputs ) if ( i < p_aout->i_nb_inputs || i_first_input == p_aout->i_nb_inputs )
{ {
/* Interrupted before the end... We can't run. */ /* Interrupted before the end... We can't run. */
vlc_mutex_unlock( &p_aout->input_fifos_lock ); vlc_mutex_unlock( &p_aout->input_fifos_lock );
...@@ -281,7 +284,7 @@ static int MixBuffer( aout_instance_t * p_aout ) ...@@ -281,7 +284,7 @@ static int MixBuffer( aout_instance_t * p_aout )
/ p_aout->output.output.i_rate, / p_aout->output.output.i_rate,
/* This is a bit kludgy, but is actually only used /* This is a bit kludgy, but is actually only used
* for the S/PDIF dummy mixer : */ * for the S/PDIF dummy mixer : */
p_aout->pp_inputs[0]->fifo.p_first, p_aout->pp_inputs[i_first_input]->fifo.p_first,
p_output_buffer ); p_output_buffer );
if ( p_output_buffer == NULL ) if ( p_output_buffer == NULL )
{ {
......
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