]> git.sesse.net Git - vlc/commitdiff
aout: simplify input handling, remove dead code
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 31 May 2011 17:10:50 +0000 (20:10 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 31 May 2011 17:11:16 +0000 (20:11 +0300)
include/vlc_aout.h
src/audio_output/aout_internal.h
src/audio_output/common.c
src/audio_output/dec.c
src/audio_output/input.c
src/audio_output/intf.c
src/audio_output/mixer.c
src/audio_output/output.c

index 1016794a59309c2ca61fe5990596cdfe585cc681..953702a7ac066b7508df5f481f37acf208106da9 100644 (file)
@@ -195,8 +195,7 @@ struct aout_instance_t
     vlc_mutex_t             volume_vars_lock;
 
     /* Input streams & pre-filters */
-    aout_input_t *          pp_inputs[1];
-    int                     i_nb_inputs;
+    aout_input_t *          p_input;
 
     /* Mixer */
     audio_sample_format_t   mixer_format;
index 74578ea1467beb27b5ddc9d0277ef98d010ed0dc..3e66f0d1858fb08d03356df8c159a722205264b1 100644 (file)
@@ -239,10 +239,9 @@ static inline void aout_unlock_volume( aout_instance_t *p_aout )
  * possible to take configuration changes into account */
 static inline void AoutInputsMarkToRestart( aout_instance_t *p_aout )
 {
-    int i;
     aout_lock_mixer( p_aout );
-    for( i = 0; i < p_aout->i_nb_inputs; i++ )
-        p_aout->pp_inputs[i]->b_restart = true;
+    if( p_aout->p_input != NULL )
+        p_aout->p_input->b_restart = true;
     aout_unlock_mixer( p_aout );
 }
 
index 1e0fa5a40c3a813dd8ef6acdb9bd32d960b2e78e..45ef3b32ee7313ed12f1e1ace71c8ba33d99dc47 100644 (file)
@@ -50,19 +50,11 @@ static inline void aout_assert_fifo_locked( aout_instance_t * p_aout, aout_fifo_
     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 );
-    }
+    if( p_aout->p_input != NULL
+     && p_fifo == &p_aout->p_input->mixer.fifo )
+        vlc_assert_locked( &p_aout->input_fifos_lock );
+    else
+        vlc_assert_locked( &p_aout->mixer_lock );
 #else
     (void)p_aout;
     (void)p_fifo;
@@ -92,7 +84,7 @@ aout_instance_t * __aout_New( vlc_object_t * p_parent )
     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->p_input = NULL;
     p_aout->mixer_multiplier = 1.0;
     p_aout->p_mixer = NULL;
     p_aout->output.b_starving = 1;
index cdd1844de9e38fdbfcd4317cec48583a241c1557..663fd80c8ad87e1fb6972ec63b7d34e6350e4bad 100644 (file)
@@ -46,8 +46,6 @@ aout_input_t *aout_DecNew( aout_instance_t *p_aout,
                            const audio_replay_gain_t *p_replay_gain,
                            const aout_request_vout_t *p_request_vout )
 {
-    aout_input_t * p_input;
-
     /* Sanitize audio format */
     if( p_format->i_channels > 32 )
     {
@@ -79,17 +77,11 @@ aout_input_t *aout_DecNew( aout_instance_t *p_aout,
         return NULL;
     }
 
-    /* We can only be called by the decoder, so no need to lock
-     * p_input->lock. */
-    aout_lock_mixer( p_aout );
-    assert( p_aout->i_nb_inputs == 0 );
-
-    p_input = calloc( 1, sizeof(aout_input_t));
+    aout_input_t *p_input = calloc( 1, sizeof(aout_input_t));
     if( !p_input )
-        goto error;
+        return NULL;
 
     vlc_mutex_init( &p_input->lock );
-
     p_input->b_error = true;
     p_input->b_paused = false;
     p_input->i_pause_date = 0;
@@ -101,64 +93,35 @@ aout_input_t *aout_DecNew( aout_instance_t *p_aout,
     if( p_replay_gain )
         p_input->replay_gain = *p_replay_gain;
 
+    /* We can only be called by the decoder, so no need to lock
+     * p_input->lock. */
+    aout_lock_mixer( p_aout );
     aout_lock_input_fifos( p_aout );
-    p_aout->pp_inputs[p_aout->i_nb_inputs] = p_input;
-    p_aout->i_nb_inputs++;
+    assert( p_aout->p_input == NULL );
+    p_aout->p_input = p_input;
 
-    if ( !p_aout->p_mixer )
-    {
-        int i;
-
-        var_Destroy( p_aout, "audio-device" );
-        var_Destroy( p_aout, "audio-channels" );
-
-        /* Recreate the output using the new format. */
-        if ( aout_OutputNew( p_aout, p_format ) < 0 )
-        {
-            for ( i = 0; i < p_aout->i_nb_inputs - 1; i++ )
-            {
-                aout_lock_input( p_aout, p_aout->pp_inputs[i] );
-                aout_InputDelete( p_aout, p_aout->pp_inputs[i] );
-                aout_unlock_input( p_aout, p_aout->pp_inputs[i] );
-            }
-            aout_unlock_input_fifos( p_aout );
-            aout_unlock_mixer( p_aout );
-            return p_input;
-        }
+    var_Destroy( p_aout, "audio-device" );
+    var_Destroy( p_aout, "audio-channels" );
 
-        /* Create other input streams. */
-        for ( i = 0; i < p_aout->i_nb_inputs - 1; i++ )
-        {
-            aout_input_t *p_input = p_aout->pp_inputs[i];
-
-            aout_lock_input( p_aout, p_input );
-            aout_InputDelete( p_aout, p_input );
-            aout_InputNew( p_aout, p_input, &p_input->request_vout );
-            aout_unlock_input( p_aout, p_input );
-        }
-    }
-    else
-    {
-        aout_MixerDelete( p_aout );
-    }
+    /* Recreate the output using the new format. */
+    if( aout_OutputNew( p_aout, p_format ) < 0 )
+#warning Input without output and mixer = bad idea.
+        goto out;
 
-    if ( aout_MixerNew( p_aout ) == -1 )
+    assert( p_aout->p_mixer == NULL );
+    if( aout_MixerNew( p_aout ) == -1 )
     {
         aout_OutputDelete( p_aout );
-        aout_unlock_input_fifos( p_aout );
-        goto error;
+#warning Memory leak.
+        p_input = NULL;
+        goto out;
     }
 
     aout_InputNew( p_aout, p_input, p_request_vout );
+out:
     aout_unlock_input_fifos( p_aout );
-
     aout_unlock_mixer( p_aout );
-
     return p_input;
-
-error:
-    aout_unlock_mixer( p_aout );
-    return NULL;
 }
 
 /*****************************************************************************
@@ -166,46 +129,30 @@ error:
  *****************************************************************************/
 int aout_DecDelete( aout_instance_t * p_aout, aout_input_t * p_input )
 {
-    int i_input;
-
     /* This function can only be called by the decoder itself, so no need
      * to lock p_input->lock. */
     aout_lock_mixer( p_aout );
 
-    for ( i_input = 0; i_input < p_aout->i_nb_inputs; i_input++ )
-    {
-        if ( p_aout->pp_inputs[i_input] == p_input )
-        {
-            break;
-        }
-    }
-
-    if ( i_input == p_aout->i_nb_inputs )
+    if( p_input != p_aout->p_input )
     {
         msg_Err( p_aout, "cannot find an input to delete" );
         aout_unlock_mixer( p_aout );
         return -1;
     }
 
-    /* Remove the input from the list. */
-    p_aout->i_nb_inputs--;
-    assert( p_aout->i_nb_inputs == 0 );
-
+    /* Remove the input. */
+    p_aout->p_input = NULL;
     aout_InputDelete( p_aout, p_input );
 
-    vlc_mutex_destroy( &p_input->lock );
-    free( p_input );
-
-    if ( !p_aout->i_nb_inputs )
-    {
-        aout_OutputDelete( p_aout );
-        aout_MixerDelete( p_aout );
-        var_Destroy( p_aout, "audio-device" );
-        var_Destroy( p_aout, "audio-channels" );
-    }
+    aout_OutputDelete( p_aout );
+    aout_MixerDelete( p_aout );
+    var_Destroy( p_aout, "audio-device" );
+    var_Destroy( p_aout, "audio-channels" );
 
     aout_unlock_mixer( p_aout );
 
+    vlc_mutex_destroy( &p_input->lock );
+    free( p_input );
     return 0;
 }
 
index a212502f532bf70c7ee9b209d6c5729b7cc22fba..ab0fe61436c5974af9b784cbcdb80ba978ace1dd 100644 (file)
@@ -896,11 +896,10 @@ static int ReplayGainCallback( vlc_object_t *p_this, char const *psz_cmd,
     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
     VLC_UNUSED(newval); VLC_UNUSED(p_data);
     aout_instance_t *p_aout = (aout_instance_t *)p_this;
-    int i;
 
     aout_lock_mixer( p_aout );
-    for( i = 0; i < p_aout->i_nb_inputs; i++ )
-        ReplayGainSelect( p_aout, p_aout->pp_inputs[i] );
+    if( p_aout->p_input != NULL )
+        ReplayGainSelect( p_aout, p_aout->p_input );
     aout_unlock_mixer( p_aout );
 
     return VLC_SUCCESS;
index 56c468bb67d616a9bc2e364b14f2dcf6081e0c4e..9b6afa52a6f554c38162bdde85d3d9324fe37380 100644 (file)
@@ -291,25 +291,21 @@ void aout_VolumeNoneInit( aout_instance_t * p_aout )
  *****************************************************************************/
 static int aout_Restart( aout_instance_t * p_aout )
 {
-    int i;
     bool b_error = 0;
 
     aout_lock_mixer( p_aout );
 
-    if ( p_aout->i_nb_inputs == 0 )
+    if( p_aout->p_input == NULL )
     {
         aout_unlock_mixer( p_aout );
         msg_Err( p_aout, "no decoder thread" );
         return -1;
     }
 
-    for ( i = 0; i < p_aout->i_nb_inputs; i++ )
-    {
-        aout_lock_input( p_aout, p_aout->pp_inputs[i] );
-        aout_lock_input_fifos( p_aout );
-        aout_InputDelete( p_aout, p_aout->pp_inputs[i] );
-        aout_unlock_input_fifos( p_aout );
-    }
+    aout_lock_input( p_aout, p_aout->p_input );
+    aout_lock_input_fifos( p_aout );
+    aout_InputDelete( p_aout, p_aout->p_input );
+    aout_unlock_input_fifos( p_aout );
 
     /* Lock all inputs. */
     aout_lock_input_fifos( p_aout );
@@ -320,13 +316,10 @@ static int aout_Restart( aout_instance_t * p_aout )
 
     /* FIXME: This function is notoriously dangerous/unsafe.
      * By the way, if OutputNew or MixerNew fails, we are totally screwed. */
-    if ( aout_OutputNew( p_aout, &p_aout->pp_inputs[0]->input ) == -1 )
+    if ( aout_OutputNew( p_aout, &p_aout->p_input->input ) == -1 )
     {
         /* Release all locks and report the error. */
-        for ( i = 0; i < p_aout->i_nb_inputs; i++ )
-        {
-            vlc_mutex_unlock( &p_aout->pp_inputs[i]->lock );
-        }
+        vlc_mutex_unlock( &p_aout->p_input->lock );
         aout_unlock_input_fifos( p_aout );
         aout_unlock_mixer( p_aout );
         return -1;
@@ -335,22 +328,16 @@ static int aout_Restart( aout_instance_t * p_aout )
     if ( aout_MixerNew( p_aout ) == -1 )
     {
         aout_OutputDelete( p_aout );
-        for ( i = 0; i < p_aout->i_nb_inputs; i++ )
-        {
-            vlc_mutex_unlock( &p_aout->pp_inputs[i]->lock );
-        }
+        vlc_mutex_unlock( &p_aout->p_input->lock );
         aout_unlock_input_fifos( p_aout );
         aout_unlock_mixer( p_aout );
         return -1;
     }
 
-    /* Re-open all inputs. */
-    for ( i = 0; i < p_aout->i_nb_inputs; i++ )
-    {
-        aout_input_t * p_input = p_aout->pp_inputs[i];
-        b_error |= aout_InputNew( p_aout, p_input, &p_input->request_vout );
-        aout_unlock_input( p_aout, p_input );
-    }
+    /* Re-open the input. */
+    aout_input_t * p_input = p_aout->p_input;
+    b_error |= aout_InputNew( p_aout, p_input, &p_input->request_vout );
+    aout_unlock_input( p_aout, p_input );
 
     aout_unlock_input_fifos( p_aout );
     aout_unlock_mixer( p_aout );
index e8f52532654d06b85e71e2787b55f3c86b1d4060..287df6422a4e0af04126d56306d9751b05c7817f 100644 (file)
@@ -51,7 +51,7 @@ int aout_MixerNew( aout_instance_t * p_aout )
         return VLC_EGENERIC;
 
     p_mixer->fmt = p_aout->mixer_format;
-    p_mixer->input = &p_aout->pp_inputs[0]->mixer;
+    p_mixer->input = &p_aout->p_input->mixer;
     p_mixer->mix = NULL;
     p_mixer->sys = NULL;
 
@@ -95,9 +95,9 @@ static int MixBuffer( aout_instance_t * p_aout, float volume )
 {
     aout_mixer_t *p_mixer = p_aout->p_mixer;
 
-    assert( p_aout->i_nb_inputs == 1 );
+    assert( p_aout->p_input != NULL );
 
-    aout_input_t *p_input = p_aout->pp_inputs[0];
+    aout_input_t *p_input = p_aout->p_input;
     if( p_input->b_paused )
         return -1;
 
index 223aec7b91ba1a825dff209895f45c32d3e5981d..38f3b84c8084621df2a36ef43119dce8fdb46b0a 100644 (file)
@@ -337,7 +337,7 @@ aout_buffer_t * aout_OutputNextBuffer( aout_instance_t * p_aout,
             aout_unlock_output_fifo( p_aout );
 
             aout_lock_input_fifos( p_aout );
-            aout_fifo_t *p_fifo = &p_aout->pp_inputs[0]->mixer.fifo;
+            aout_fifo_t *p_fifo = &p_aout->p_input->mixer.fifo;
             aout_FifoMoveDates( p_aout, p_fifo, difference );
             aout_unlock_input_fifos( p_aout );
             return p_buffer;