X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Faout_ext-dec.c;fp=src%2Faudio_output%2Faout_fifo.c;h=337c6a5863e78008a14a8f6e48f918b53f88fbf3;hb=a70f8bb371466209770c4c3bcdb7137b94acef66;hp=712a8461fc663f98244812743f10b811635f1a7d;hpb=7f1f24b3aa593a6c426a86e9b707b162372a1b9f;p=vlc diff --git a/src/audio_output/aout_fifo.c b/src/audio_output/aout_ext-dec.c similarity index 59% rename from src/audio_output/aout_fifo.c rename to src/audio_output/aout_ext-dec.c index 712a8461fc..337c6a5863 100644 --- a/src/audio_output/aout_fifo.c +++ b/src/audio_output/aout_ext-dec.c @@ -1,8 +1,8 @@ /***************************************************************************** - * 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 * @@ -39,115 +39,137 @@ #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 } /*****************************************************************************