/*****************************************************************************
- * aout_fifo.c : exported fifo management functions
+ * aout_ext-dec.c : exported fifo management functions
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: aout_fifo.c,v 1.2 2001/03/21 13:42:34 sam Exp $
+ * $Id: aout_ext-dec.c,v 1.1 2001/05/01 04:18:18 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
*
#include "audio_output.h"
#include "aout_common.h"
+#include "main.h"
+
/*****************************************************************************
* aout_CreateFifo
*****************************************************************************/
-aout_fifo_t * aout_CreateFifo( aout_thread_t * p_aout, aout_fifo_t * p_fifo )
+aout_fifo_t * aout_CreateFifo( int i_type, int i_channels, long l_rate,
+ long l_units, long l_frame_size,
+ void *p_buffer )
{
+#define P_AOUT p_main->p_aout
int i_fifo;
+ /* Spawn an audio output if there is none */
+ if( P_AOUT == NULL )
+ {
+ P_AOUT = aout_CreateThread( NULL );
+
+ if( P_AOUT == NULL )
+ {
+ return NULL;
+ }
+ }
+
/* 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++ )
+ 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 )
+ 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 );
return( NULL );
}
/* Initialize the new fifo structure */
- switch ( p_aout->fifo[i_fifo].i_type = p_fifo->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 = p_fifo->i_channels;
- p_aout->fifo[i_fifo].b_stereo = p_fifo->b_stereo;
- p_aout->fifo[i_fifo].l_rate = p_fifo->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_fifo->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,
- p_fifo->l_rate, p_aout->l_rate );
- p_aout->fifo[i_fifo].l_units = p_fifo->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 = p_fifo->i_channels;
- p_aout->fifo[i_fifo].b_stereo = p_fifo->b_stereo;
- p_aout->fifo[i_fifo].l_rate = p_fifo->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 = p_fifo->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)*(AOUT_FIFO_SIZE+1)*p_fifo->l_frame_size );
- if ( p_aout->fifo[i_fifo].buffer == NULL )
+ * 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) *
+ ( AOUT_FIFO_SIZE + 1 ) * l_frame_size );
+ 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 );
return( NULL );
}
/* Allocate the memory needed to store the dates of the frames */
- p_aout->fifo[i_fifo].date = (mtime_t *)malloc( sizeof(mtime_t)*(AOUT_FIFO_SIZE+1) );
- if ( p_aout->fifo[i_fifo].date == NULL )
+ P_AOUT->fifo[i_fifo].date =
+ malloc( sizeof(mtime_t) * ( AOUT_FIFO_SIZE + 1) );
+
+ 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 );
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 );
+ 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 );
return( NULL );
}
/* Release the fifos lock */
- vlc_mutex_unlock( &p_aout->fifos_lock );
+ vlc_mutex_unlock( &P_AOUT->fifos_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( &FIFO );
+ return( &P_AOUT->fifo[i_fifo] );
+#undef P_AOUT
}
/*****************************************************************************