]> git.sesse.net Git - vlc/blobdiff - src/audio_output/aout_ext-dec.c
* Fixed a few warnings with gcc 3.0.
[vlc] / src / audio_output / aout_ext-dec.c
index 337c6a5863e78008a14a8f6e48f918b53f88fbf3..0be3fadc2561760e55616907049d9b838e551567 100644 (file)
@@ -2,7 +2,7 @@
  * 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>
  *
@@ -48,30 +48,44 @@ 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
+    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;
         }
     }
@@ -79,97 +93,101 @@ aout_fifo_t * aout_CreateFifo( int i_type, int i_channels, long l_rate,
     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] );
 }
 
 /*****************************************************************************