-#include "libvlc.h"
-
-/*
- * Instances management (internal and external)
- */
-
-#define AOUT_ASSERT_FIFO_LOCKED aout_assert_fifo_locked(p_aout, p_fifo)
-static inline void aout_assert_fifo_locked( aout_instance_t * p_aout, aout_fifo_t * p_fifo )
-{
-#ifndef NDEBUG
- if( !p_aout )
- return;
-
- if( p_fifo == &p_aout->output.fifo )
- vlc_assert_locked( &p_aout->output_fifo_lock );
- else
- {
- int i;
- for( i = 0; i < p_aout->i_nb_inputs; i++ )
- {
- if( p_fifo == &p_aout->pp_inputs[i]->mixer.fifo)
- {
- vlc_assert_locked( &p_aout->input_fifos_lock );
- break;
- }
- }
- if( i == p_aout->i_nb_inputs )
- vlc_assert_locked( &p_aout->mixer_lock );
- }
-#else
- (void)p_aout;
- (void)p_fifo;
-#endif
-}
-
-/* Local functions */
-static void aout_Destructor( vlc_object_t * p_this );
-
-/*****************************************************************************
- * aout_New: initialize aout structure
- *****************************************************************************/
-aout_instance_t * __aout_New( vlc_object_t * p_parent )
-{
- aout_instance_t * p_aout;
-
- /* Allocate descriptor. */
- p_aout = vlc_custom_create( p_parent, sizeof( *p_aout ), VLC_OBJECT_AOUT,
- "audio output" );
- if( p_aout == NULL )
- {
- return NULL;
- }
-
- /* Initialize members. */
- vlc_mutex_init( &p_aout->input_fifos_lock );
- vlc_mutex_init( &p_aout->mixer_lock );
- vlc_mutex_init( &p_aout->volume_vars_lock );
- vlc_mutex_init( &p_aout->output_fifo_lock );
- p_aout->i_nb_inputs = 0;
- p_aout->mixer_multiplier = 1.0;
- p_aout->p_mixer = NULL;
- p_aout->output.b_error = 1;
- p_aout->output.b_starving = 1;
-
- var_Create( p_aout, "intf-change", VLC_VAR_BOOL );
- var_SetBool( p_aout, "intf-change", true );
-
- vlc_object_set_destructor( p_aout, aout_Destructor );
-
- return p_aout;
-}
-
-/*****************************************************************************
- * aout_Destructor: destroy aout structure
- *****************************************************************************/
-static void aout_Destructor( vlc_object_t * p_this )
-{
- aout_instance_t * p_aout = (aout_instance_t *)p_this;
- vlc_mutex_destroy( &p_aout->input_fifos_lock );
- vlc_mutex_destroy( &p_aout->mixer_lock );
- vlc_mutex_destroy( &p_aout->volume_vars_lock );
- vlc_mutex_destroy( &p_aout->output_fifo_lock );
-}
-
-/* Lock ordering rules:
- *
- * Vars Mixer Input IFIFO OFIFO (< Inner lock)
- * Vars No! Yes Yes Yes Yes
- * Mixer No! No! Yes Yes Yes
- * Input No! No! No! Yes Yes
- * In FIFOs No! No! No! No! Yes
- * Out FIFOs No! No! No! No! No!
- * (^ Outer lock)
- */
-#ifdef AOUT_DEBUG
-/* Lock debugging */
-static __thread unsigned aout_locks = 0;
-
-void aout_lock (unsigned i)
-{
- unsigned allowed;
- switch (i)
- {
- case VOLUME_VARS_LOCK:
- allowed = 0;
- break;
- case MIXER_LOCK:
- allowed = VOLUME_VARS_LOCK;
- break;
- case INPUT_LOCK:
- allowed = VOLUME_VARS_LOCK|MIXER_LOCK;
- break;
- case INPUT_FIFO_LOCK:
- allowed = VOLUME_VARS_LOCK|MIXER_LOCK|INPUT_LOCK;
- break;
- case OUTPUT_FIFO_LOCK:
- allowed = VOLUME_VARS_LOCK|MIXER_LOCK|INPUT_LOCK|INPUT_FIFO_LOCK;
- break;
- default:
- abort ();
- }
-
- if (aout_locks & ~allowed)
- {
- fprintf (stderr, "Illegal audio lock transition (%x -> %x)\n",
- aout_locks, aout_locks|i);
- vlc_backtrace ();
- abort ();
- }
- aout_locks |= i;
-}
-
-void aout_unlock (unsigned i)
-{
- assert (aout_locks & i);
- aout_locks &= ~i;
-}
-#endif