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

aout: handle filters creation/deletion from decoder, fix memory leak

parent 5864ae43
...@@ -108,10 +108,8 @@ static inline aout_owner_t *aout_owner (audio_output_t *aout) ...@@ -108,10 +108,8 @@ static inline aout_owner_t *aout_owner (audio_output_t *aout)
*****************************************************************************/ *****************************************************************************/
/* From input.c : */ /* From input.c : */
aout_input_t *aout_InputNew(audio_output_t *, const audio_sample_format_t *, aout_input_t *aout_InputNew(const audio_sample_format_t *);
const audio_sample_format_t *, void aout_InputDelete(aout_input_t *);
const aout_request_vout_t *);
int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input );
block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input, block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input,
block_t *p_buffer, int i_input_rate, date_t * ); block_t *p_buffer, int i_input_rate, date_t * );
...@@ -125,7 +123,7 @@ void aout_FiltersPlay( filter_t *const *, unsigned, block_t ** ); ...@@ -125,7 +123,7 @@ void aout_FiltersPlay( filter_t *const *, unsigned, block_t ** );
int aout_FiltersNew(audio_output_t *, const audio_sample_format_t *, int aout_FiltersNew(audio_output_t *, const audio_sample_format_t *,
const audio_sample_format_t *, const aout_request_vout_t *); const audio_sample_format_t *, const aout_request_vout_t *);
void aout_FiltersDestroy(audio_output_t *); void aout_FiltersDelete(audio_output_t *);
/* From mixer.c : */ /* From mixer.c : */
aout_volume_t *aout_volume_New(vlc_object_t *, const audio_replay_gain_t *); aout_volume_t *aout_volume_New(vlc_object_t *, const audio_replay_gain_t *);
......
...@@ -83,19 +83,21 @@ int aout_DecNew( audio_output_t *p_aout, ...@@ -83,19 +83,21 @@ int aout_DecNew( audio_output_t *p_aout,
aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
/* Create the audio filtering "input" pipeline */ /* Create the audio filtering "input" pipeline */
date_Init (&owner->sync.date, owner->mixer_format.i_rate, 1); if (aout_FiltersNew (p_aout, p_format, &owner->mixer_format,
date_Set (&owner->sync.date, VLC_TS_INVALID); p_request_vout))
assert (owner->input == NULL);
owner->input = aout_InputNew (p_aout, p_format, &owner->mixer_format,
p_request_vout);
if (owner->input == NULL)
{ {
aout_OutputDelete (p_aout); aout_OutputDelete (p_aout);
error: error:
aout_volume_Delete (owner->volume); aout_volume_Delete (owner->volume);
ret = -1; ret = -1;
goto error;
} }
date_Init (&owner->sync.date, owner->mixer_format.i_rate, 1);
date_Set (&owner->sync.date, VLC_TS_INVALID);
assert (owner->input == NULL);
owner->input = aout_InputNew (p_format);
aout_unlock( p_aout ); aout_unlock( p_aout );
return ret; return ret;
} }
...@@ -111,17 +113,16 @@ void aout_DecDelete (audio_output_t *p_aout) ...@@ -111,17 +113,16 @@ void aout_DecDelete (audio_output_t *p_aout)
aout_lock( p_aout ); aout_lock( p_aout );
/* Remove the input. */ /* Remove the input. */
input = owner->input; input = owner->input;
if (likely(input != NULL)) aout_InputDelete (input);
aout_InputDelete (p_aout, input);
owner->input = NULL; owner->input = NULL;
aout_FiltersDelete (p_aout);
aout_OutputDelete( p_aout ); aout_OutputDelete( p_aout );
aout_volume_Delete (owner->volume); aout_volume_Delete (owner->volume);
var_Destroy( p_aout, "stereo-mode" ); var_Destroy( p_aout, "stereo-mode" );
aout_unlock( p_aout ); aout_unlock( p_aout );
free (input);
} }
#define AOUT_RESTART_OUTPUT 1 #define AOUT_RESTART_OUTPUT 1
...@@ -140,10 +141,11 @@ static void aout_CheckRestart (audio_output_t *aout) ...@@ -140,10 +141,11 @@ static void aout_CheckRestart (audio_output_t *aout)
const aout_request_vout_t request_vout = owner->request_vout; const aout_request_vout_t request_vout = owner->request_vout;
if (likely(owner->input != NULL)) aout_InputDelete (owner->input);
aout_InputDelete (aout, owner->input);
owner->input = NULL; owner->input = NULL;
aout_FiltersDelete (aout);
/* Reinitializes the output */ /* Reinitializes the output */
if (restart & AOUT_RESTART_OUTPUT) if (restart & AOUT_RESTART_OUTPUT)
{ {
...@@ -156,8 +158,9 @@ static void aout_CheckRestart (audio_output_t *aout) ...@@ -156,8 +158,9 @@ static void aout_CheckRestart (audio_output_t *aout)
aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
} }
owner->input = aout_InputNew (aout, &owner->input_format, if (aout_FiltersNew (aout, &owner->input_format, &owner->mixer_format,
&owner->mixer_format, &request_vout); &request_vout) == 0)
owner->input = aout_InputNew (&owner->input_format);
} }
/** /**
......
...@@ -518,7 +518,7 @@ error: ...@@ -518,7 +518,7 @@ error:
/** /**
* Destroys the audio filters. * Destroys the audio filters.
*/ */
void aout_FiltersDestroy (audio_output_t *aout) void aout_FiltersDelete (audio_output_t *aout)
{ {
aout_owner_t *owner = aout_owner (aout); aout_owner_t *owner = aout_owner (aout);
......
...@@ -43,23 +43,12 @@ static void inputResamplingStop( audio_output_t *, aout_input_t * ); ...@@ -43,23 +43,12 @@ static void inputResamplingStop( audio_output_t *, aout_input_t * );
/***************************************************************************** /*****************************************************************************
* aout_InputNew : allocate a new input and rework the filter pipeline * aout_InputNew : allocate a new input and rework the filter pipeline
*****************************************************************************/ *****************************************************************************/
aout_input_t *aout_InputNew (audio_output_t * p_aout, aout_input_t *aout_InputNew (const audio_sample_format_t *restrict infmt)
const audio_sample_format_t *restrict infmt,
const audio_sample_format_t *restrict outfmt,
const aout_request_vout_t *p_request_vout)
{ {
aout_input_t *p_input = malloc (sizeof (*p_input)); aout_input_t *p_input = xmalloc (sizeof (*p_input));
if (unlikely(p_input == NULL))
return NULL;
p_input->samplerate = infmt->i_rate; p_input->samplerate = infmt->i_rate;
if (aout_FiltersNew (p_aout, infmt, outfmt, p_request_vout))
{
free(p_input);
return NULL;
}
p_input->i_resampling_type = AOUT_RESAMPLING_NONE; p_input->i_resampling_type = AOUT_RESAMPLING_NONE;
p_input->i_last_input_rate = INPUT_RATE_DEFAULT; p_input->i_last_input_rate = INPUT_RATE_DEFAULT;
p_input->i_buffer_lost = 0; p_input->i_buffer_lost = 0;
...@@ -71,11 +60,9 @@ aout_input_t *aout_InputNew (audio_output_t * p_aout, ...@@ -71,11 +60,9 @@ aout_input_t *aout_InputNew (audio_output_t * p_aout,
***************************************************************************** *****************************************************************************
* This function must be entered with the mixer lock. * This function must be entered with the mixer lock.
*****************************************************************************/ *****************************************************************************/
int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ) void aout_InputDelete (aout_input_t * p_input )
{ {
aout_FiltersDestroy (p_aout); free (p_input);
(void) p_input;
return 0;
} }
/***************************************************************************** /*****************************************************************************
......
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