* aout_ext-dec.c : exported fifo management functions
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: aout_ext-dec.c,v 1.1 2001/05/01 04:18:18 sam Exp $
+ * $Id: aout_ext-dec.c,v 1.2 2001/05/06 04:32:02 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
*
long l_units, long l_frame_size,
void *p_buffer )
{
-#define P_AOUT p_main->p_aout
+ aout_thread_t *p_aout;
int i_fifo;
/* Spawn an audio output if there is none */
- if( P_AOUT == NULL )
+ vlc_mutex_lock( &p_aout_bank->lock );
+
+ if( p_aout_bank->i_count == 0 )
{
- P_AOUT = aout_CreateThread( NULL );
+ intf_Msg( "aout: no aout present, spawning one" );
+
+ p_aout = aout_CreateThread( NULL );
- if( P_AOUT == NULL )
+ /* Everything failed */
+ if( p_aout == NULL )
{
+ vlc_mutex_unlock( &p_aout_bank->lock );
return NULL;
}
+
+ p_aout_bank->pp_aout[ p_aout_bank->i_count ] = p_aout;
+ p_aout_bank->i_count++;
+ }
+ else
+ {
+ /* Take the first audio output FIXME: take the best one */
+ p_aout = p_aout_bank->pp_aout[ 0 ];
}
/* Take the fifos lock */
- vlc_mutex_lock( &P_AOUT->fifos_lock );
+ vlc_mutex_lock( &p_aout->fifos_lock );
/* Looking for a free fifo structure */
for( i_fifo = 0; i_fifo < AOUT_MAX_FIFOS; i_fifo++ )
{
- if( P_AOUT->fifo[i_fifo].i_type == AOUT_EMPTY_FIFO )
+ if( p_aout->fifo[i_fifo].i_type == AOUT_EMPTY_FIFO )
{
/* Not very clever, but at least we know which fifo it is */
- P_AOUT->fifo[i_fifo].i_fifo = i_fifo;
+ p_aout->fifo[i_fifo].i_fifo = i_fifo;
break;
}
}
if( i_fifo == AOUT_MAX_FIFOS )
{
intf_ErrMsg( "aout error: no fifo available" );
- vlc_mutex_unlock( &P_AOUT->fifos_lock );
+ vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &p_aout_bank->lock );
return( NULL );
}
/* Initialize the new fifo structure */
- switch ( P_AOUT->fifo[i_fifo].i_type = i_type )
+ switch ( p_aout->fifo[i_fifo].i_type = i_type )
{
case AOUT_INTF_MONO_FIFO:
case AOUT_INTF_STEREO_FIFO:
- P_AOUT->fifo[i_fifo].b_die = 0;
+ p_aout->fifo[i_fifo].b_die = 0;
- P_AOUT->fifo[i_fifo].i_channels = i_channels;
- P_AOUT->fifo[i_fifo].b_stereo = ( i_channels == 2 );
- P_AOUT->fifo[i_fifo].l_rate = l_rate;
+ p_aout->fifo[i_fifo].i_channels = i_channels;
+ p_aout->fifo[i_fifo].b_stereo = ( i_channels == 2 );
+ p_aout->fifo[i_fifo].l_rate = l_rate;
- P_AOUT->fifo[i_fifo].buffer = p_buffer;
+ p_aout->fifo[i_fifo].buffer = p_buffer;
- P_AOUT->fifo[i_fifo].l_unit = 0;
- InitializeIncrement( &P_AOUT->fifo[i_fifo].unit_increment,
- l_rate, P_AOUT->l_rate );
- P_AOUT->fifo[i_fifo].l_units = l_units;
+ p_aout->fifo[i_fifo].l_unit = 0;
+ InitializeIncrement( &p_aout->fifo[i_fifo].unit_increment,
+ l_rate, p_aout->l_rate );
+ p_aout->fifo[i_fifo].l_units = l_units;
break;
case AOUT_ADEC_MONO_FIFO:
case AOUT_ADEC_STEREO_FIFO:
- P_AOUT->fifo[i_fifo].b_die = 0;
+ p_aout->fifo[i_fifo].b_die = 0;
- P_AOUT->fifo[i_fifo].i_channels = i_channels;
- P_AOUT->fifo[i_fifo].b_stereo = ( i_channels == 2 );
- P_AOUT->fifo[i_fifo].l_rate = l_rate;
+ p_aout->fifo[i_fifo].i_channels = i_channels;
+ p_aout->fifo[i_fifo].b_stereo = ( i_channels == 2 );
+ p_aout->fifo[i_fifo].l_rate = l_rate;
- P_AOUT->fifo[i_fifo].l_frame_size = l_frame_size;
+ p_aout->fifo[i_fifo].l_frame_size = l_frame_size;
/* Allocate the memory needed to store the audio frames. As the
* fifo is a rotative fifo, we must be able to find out whether
* the fifo is full or empty, that's why we must in fact allocate
* memory for (AOUT_FIFO_SIZE+1) audio frames. */
- P_AOUT->fifo[i_fifo].buffer = malloc( sizeof(s16) *
+ p_aout->fifo[i_fifo].buffer = malloc( sizeof(s16) *
( AOUT_FIFO_SIZE + 1 ) * l_frame_size );
- if ( P_AOUT->fifo[i_fifo].buffer == NULL )
+ if ( p_aout->fifo[i_fifo].buffer == NULL )
{
intf_ErrMsg( "aout error: cannot create frame buffer" );
- P_AOUT->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
- vlc_mutex_unlock( &P_AOUT->fifos_lock );
+ p_aout->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
+ vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &p_aout_bank->lock );
return( NULL );
}
/* Allocate the memory needed to store the dates of the frames */
- P_AOUT->fifo[i_fifo].date =
+ p_aout->fifo[i_fifo].date =
malloc( sizeof(mtime_t) * ( AOUT_FIFO_SIZE + 1) );
- if ( P_AOUT->fifo[i_fifo].date == NULL )
+ if ( p_aout->fifo[i_fifo].date == NULL )
{
intf_ErrMsg( "aout error: cannot create date buffer");
- free( P_AOUT->fifo[i_fifo].buffer );
- P_AOUT->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
- vlc_mutex_unlock( &P_AOUT->fifos_lock );
+ free( p_aout->fifo[i_fifo].buffer );
+ p_aout->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
+ vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &p_aout_bank->lock );
return( NULL );
}
/* Set the fifo's buffer as empty (the first frame that is to be
* played is also the first frame that is not to be played) */
- P_AOUT->fifo[i_fifo].l_start_frame = 0;
- /* P_AOUT->fifo[i_fifo].l_next_frame = 0; */
- P_AOUT->fifo[i_fifo].l_end_frame = 0;
+ p_aout->fifo[i_fifo].l_start_frame = 0;
+ /* p_aout->fifo[i_fifo].l_next_frame = 0; */
+ p_aout->fifo[i_fifo].l_end_frame = 0;
/* Waiting for the audio decoder to compute enough frames to work
* out the fifo's current rate (as soon as the decoder has decoded
* enough frames, the members of the fifo structure that are not
* initialized now will be calculated) */
- P_AOUT->fifo[i_fifo].b_start_frame = 0;
- P_AOUT->fifo[i_fifo].b_next_frame = 0;
+ p_aout->fifo[i_fifo].b_start_frame = 0;
+ p_aout->fifo[i_fifo].b_next_frame = 0;
break;
default:
intf_ErrMsg( "aout error: unknown fifo type 0x%x",
- P_AOUT->fifo[i_fifo].i_type );
- P_AOUT->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
- vlc_mutex_unlock( &P_AOUT->fifos_lock );
+ p_aout->fifo[i_fifo].i_type );
+ p_aout->fifo[i_fifo].i_type = AOUT_EMPTY_FIFO;
+ vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &p_aout_bank->lock );
return( NULL );
}
/* Release the fifos lock */
- vlc_mutex_unlock( &P_AOUT->fifos_lock );
+ vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &p_aout_bank->lock );
intf_WarnMsg( 2, "aout info: fifo #%i allocated, %i channels, rate %li",
- P_AOUT->fifo[i_fifo].i_fifo, P_AOUT->fifo[i_fifo].i_channels,
- P_AOUT->fifo[i_fifo].l_rate );
+ p_aout->fifo[i_fifo].i_fifo, p_aout->fifo[i_fifo].i_channels,
+ p_aout->fifo[i_fifo].l_rate );
/* Return the pointer to the fifo structure */
- return( &P_AOUT->fifo[i_fifo] );
-#undef P_AOUT
+ return( &p_aout->fifo[i_fifo] );
}
/*****************************************************************************