]> git.sesse.net Git - vlc/blobdiff - src/audio_output/aout_ext-dec.c
* Mandatory step for video output IV and the audio output quality
[vlc] / 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 712a8461fc663f98244812743f10b811635f1a7d..337c6a5863e78008a14a8f6e48f918b53f88fbf3 100644 (file)
@@ -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 <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
 }
 
 /*****************************************************************************