Commit 749fa2f4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

aout: simplify input handling, remove dead code

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