From c627bae022feedf6f0d3180c7da6084c2dff29bb Mon Sep 17 00:00:00 2001 From: James Laird Date: Mon, 1 Apr 2013 23:04:54 +1100 Subject: [PATCH] player: avoid leaking memory --- alac.c | 21 +++++++++++++++++++++ alac.h | 1 + player.c | 24 +++++++++++++++++++++--- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/alac.c b/alac.c index 8ca7a1cc..7259d458 100644 --- a/alac.c +++ b/alac.c @@ -55,6 +55,25 @@ static const int host_bigendian = 0; struct {signed int x:24;} se_struct_24; #define SignExtend24(val) (se_struct_24.x = val) +void alac_free(alac_file *alac) { + if (alac->predicterror_buffer_a) + free(alac->predicterror_buffer_a); + if (alac->predicterror_buffer_b) + free(alac->predicterror_buffer_b); + + if (alac->outputsamples_buffer_a) + free(alac->outputsamples_buffer_a); + if (alac->outputsamples_buffer_b) + free(alac->outputsamples_buffer_b); + + if (alac->uncompressed_bytes_buffer_a) + free(alac->uncompressed_bytes_buffer_a); + if (alac->uncompressed_bytes_buffer_b) + free(alac->uncompressed_bytes_buffer_b); + + free(alac); +} + void alac_allocate_buffers(alac_file *alac) { alac->predicterror_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4); @@ -1108,6 +1127,8 @@ alac_file *alac_create(int samplesize, int numchannels) { alac_file *newfile = malloc(sizeof(alac_file)); + memset(newfile, 0, sizeof(alac_file)); + newfile->samplesize = samplesize; newfile->numchannels = numchannels; newfile->bytespersample = (samplesize / 8) * numchannels; diff --git a/alac.h b/alac.h index ce9bf8dc..09666a1d 100644 --- a/alac.h +++ b/alac.h @@ -11,6 +11,7 @@ void alac_decode_frame(alac_file *alac, void *outbuffer, int *outputsize); void alac_set_info(alac_file *alac, char *inputbuffer); void alac_allocate_buffers(alac_file *alac); +void alac_free(alac_file *alac); struct alac_file { diff --git a/player.c b/player.c index e5823404..f2990d94 100644 --- a/player.c +++ b/player.c @@ -153,16 +153,24 @@ static int init_decoder(int32_t fmtp[12]) { return 0; } +static void free_decoder(void) { + alac_free(decoder_info); +} + #ifdef FANCY_RESAMPLING static int init_src(void) { int err; if (fancy_resampling) src = src_new(SRC_SINC_MEDIUM_QUALITY, 2, &err); else - src = 0; + src = NULL; return err; } +static void free_src(void) { + src_delete(src); + src = NULL; +} #endif static void init_buffer(void) { @@ -172,6 +180,12 @@ static void init_buffer(void) { ab_resync(); } +static void free_buffer(void) { + int i; + for (i=0; iaeskey, 128, &aes); aesiv = stream->aesiv; - // XXX these leak memory - init_decoder(stream->fmtp); init_buffer(); + init_decoder(stream->fmtp); #ifdef FANCY_RESAMPLING init_src(); #endif @@ -503,4 +516,9 @@ void player_stop(void) { please_stop = 1; pthread_join(player_thread, NULL); config.output->stop(); + free_buffer(); + free_decoder(); +#ifdef FANCY_RESAMPLING + free_src(); +#endif }