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;
* 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 );
}
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;
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;
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 )
{
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;
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;
}
/*****************************************************************************
*****************************************************************************/
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;
}
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;
*****************************************************************************/
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 );
/* 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;
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 );
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;
{
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;
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;