vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Nov 6 23:55:49 2012 +0200| [f8e940016f9d710ebfafe8e3898fe591dd9c76c2] | committer: Rémi Denis-Courmont
aout: handle filters creation/deletion from decoder, fix memory leak > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f8e940016f9d710ebfafe8e3898fe591dd9c76c2 --- src/audio_output/aout_internal.h | 8 +++----- src/audio_output/dec.c | 31 +++++++++++++++++-------------- src/audio_output/filters.c | 2 +- src/audio_output/input.c | 21 ++++----------------- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index caf6503..05901b6 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -108,10 +108,8 @@ static inline aout_owner_t *aout_owner (audio_output_t *aout) *****************************************************************************/ /* From input.c : */ -aout_input_t *aout_InputNew(audio_output_t *, const audio_sample_format_t *, - const audio_sample_format_t *, - const aout_request_vout_t *); -int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ); +aout_input_t *aout_InputNew(const audio_sample_format_t *); +void aout_InputDelete(aout_input_t *); block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input, block_t *p_buffer, int i_input_rate, date_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 *, 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 : */ aout_volume_t *aout_volume_New(vlc_object_t *, const audio_replay_gain_t *); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 124eb31..9c66267 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -83,19 +83,21 @@ int aout_DecNew( audio_output_t *p_aout, aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); /* Create the audio filtering "input" pipeline */ - 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_aout, p_format, &owner->mixer_format, - p_request_vout); - if (owner->input == NULL) + if (aout_FiltersNew (p_aout, p_format, &owner->mixer_format, + p_request_vout)) { aout_OutputDelete (p_aout); error: aout_volume_Delete (owner->volume); 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 ); return ret; } @@ -111,17 +113,16 @@ void aout_DecDelete (audio_output_t *p_aout) aout_lock( p_aout ); /* Remove the input. */ input = owner->input; - if (likely(input != NULL)) - aout_InputDelete (p_aout, input); + aout_InputDelete (input); owner->input = NULL; + aout_FiltersDelete (p_aout); aout_OutputDelete( p_aout ); aout_volume_Delete (owner->volume); var_Destroy( p_aout, "stereo-mode" ); aout_unlock( p_aout ); - free (input); } #define AOUT_RESTART_OUTPUT 1 @@ -140,10 +141,11 @@ static void aout_CheckRestart (audio_output_t *aout) const aout_request_vout_t request_vout = owner->request_vout; - if (likely(owner->input != NULL)) - aout_InputDelete (aout, owner->input); + aout_InputDelete (owner->input); owner->input = NULL; + aout_FiltersDelete (aout); + /* Reinitializes the output */ if (restart & AOUT_RESTART_OUTPUT) { @@ -156,8 +158,9 @@ static void aout_CheckRestart (audio_output_t *aout) aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format); } - owner->input = aout_InputNew (aout, &owner->input_format, - &owner->mixer_format, &request_vout); + if (aout_FiltersNew (aout, &owner->input_format, &owner->mixer_format, + &request_vout) == 0) + owner->input = aout_InputNew (&owner->input_format); } /** diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c index 87317cb..ffaf575 100644 --- a/src/audio_output/filters.c +++ b/src/audio_output/filters.c @@ -518,7 +518,7 @@ error: /** * 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); diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 3056809..bdea6ad 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -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_input_t *aout_InputNew (audio_output_t * p_aout, - 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 *aout_InputNew (const audio_sample_format_t *restrict infmt) { - aout_input_t *p_input = malloc (sizeof (*p_input)); - if (unlikely(p_input == NULL)) - return NULL; + aout_input_t *p_input = xmalloc (sizeof (*p_input)); 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_last_input_rate = INPUT_RATE_DEFAULT; p_input->i_buffer_lost = 0; @@ -71,11 +60,9 @@ aout_input_t *aout_InputNew (audio_output_t * p_aout, ***************************************************************************** * 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); - (void) p_input; - return 0; + free (p_input); } /***************************************************************************** _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
