From 7f34e9410eeb638b44ba1c7f7711844bd410b3a7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 7 Jan 2009 22:20:30 +0100 Subject: pcm: added pcm_convert_deinit(), pcm_resample_deinit() Free memory allocated by libsamplerate when the output or the decoder is closed. --- src/decoder_api.c | 2 -- src/decoder_thread.c | 4 ++++ src/output_thread.c | 4 ++++ src/pcm_convert.c | 5 +++++ src/pcm_convert.h | 2 ++ src/pcm_resample.h | 2 ++ src/pcm_resample_fallback.c | 5 +++++ src/pcm_resample_libsamplerate.c | 7 +++++++ 8 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/decoder_api.c b/src/decoder_api.c index 76bf0575..63bb0f2f 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -45,8 +45,6 @@ void decoder_initialized(struct decoder * decoder, assert(audio_format_defined(audio_format)); assert(audio_format_valid(audio_format)); - pcm_convert_init(&decoder->conv_state); - dc.in_audio_format = *audio_format; getOutputAudioFormat(audio_format, &dc.out_audio_format); diff --git a/src/decoder_thread.c b/src/decoder_thread.c index 2d2e50b3..12449237 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -124,6 +124,8 @@ static void decoder_run_song(const struct song *song, const char *uri) return; } + pcm_convert_init(&decoder.conv_state); + ret = false; if (!song_is_file(song)) { unsigned int next = 0; @@ -187,6 +189,8 @@ static void decoder_run_song(const struct song *song, const char *uri) } } + pcm_convert_deinit(&decoder.conv_state); + music_pipe_flush(); if (close_instream) diff --git a/src/output_thread.c b/src/output_thread.c index 63c443dd..1467d26a 100644 --- a/src/output_thread.c +++ b/src/output_thread.c @@ -84,6 +84,7 @@ static void ao_play(struct audio_output *ao) if (!ret) { ao->plugin->cancel(ao->data); ao->plugin->close(ao->data); + pcm_convert_deinit(&ao->convState); ao->open = false; } @@ -118,6 +119,8 @@ static gpointer audio_output_task(gpointer arg) case AO_COMMAND_OPEN: assert(!ao->open); + + pcm_convert_init(&ao->convState); ret = ao->plugin->open(ao->data, &ao->outAudioFormat); @@ -134,6 +137,7 @@ static gpointer audio_output_task(gpointer arg) assert(ao->open); ao->plugin->cancel(ao->data); ao->plugin->close(ao->data); + ao->open = false; ao_command_finished(ao); break; diff --git a/src/pcm_convert.c b/src/pcm_convert.c index f9fc9a64..13c7405e 100644 --- a/src/pcm_convert.c +++ b/src/pcm_convert.c @@ -37,6 +37,11 @@ void pcm_convert_init(struct pcm_convert_state *state) pcm_dither_24_init(&state->dither); } +void pcm_convert_deinit(struct pcm_convert_state *state) +{ + pcm_resample_deinit(&state->resample); +} + static size_t pcm_convert_16(const struct audio_format *src_format, const void *src_buffer, size_t src_size, diff --git a/src/pcm_convert.h b/src/pcm_convert.h index ad54290b..16aa0557 100644 --- a/src/pcm_convert.h +++ b/src/pcm_convert.h @@ -32,6 +32,8 @@ struct pcm_convert_state { void pcm_convert_init(struct pcm_convert_state *state); +void pcm_convert_deinit(struct pcm_convert_state *state); + size_t pcm_convert(const struct audio_format *inFormat, const void *src, size_t src_size, const struct audio_format *outFormat, diff --git a/src/pcm_resample.h b/src/pcm_resample.h index c80dfa8a..69bf6316 100644 --- a/src/pcm_resample.h +++ b/src/pcm_resample.h @@ -52,6 +52,8 @@ struct pcm_resample_state { void pcm_resample_init(struct pcm_resample_state *state); +void pcm_resample_deinit(struct pcm_resample_state *state); + size_t pcm_resample_16(uint8_t channels, unsigned src_rate, diff --git a/src/pcm_resample_fallback.c b/src/pcm_resample_fallback.c index a55efb82..560d68a8 100644 --- a/src/pcm_resample_fallback.c +++ b/src/pcm_resample_fallback.c @@ -22,6 +22,11 @@ #include #include +void pcm_resample_deinit(G_GNUC_UNUSED struct pcm_resample_state *state) +{ + /* no state, nothing to do */ +} + /* resampling code blatantly ripped from ESD */ size_t pcm_resample_16(uint8_t channels, diff --git a/src/pcm_resample_libsamplerate.c b/src/pcm_resample_libsamplerate.c index 95d7e5d7..ff7a7f95 100644 --- a/src/pcm_resample_libsamplerate.c +++ b/src/pcm_resample_libsamplerate.c @@ -29,6 +29,13 @@ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "pcm" +void pcm_resample_deinit(G_GNUC_UNUSED struct pcm_resample_state *state) +{ + if (state->state != NULL) + state->state = src_delete(state->state); + +} + static int pcm_resample_get_converter(void) { const char *conf = getConfigParamValue(CONF_SAMPLERATE_CONVERTER); -- cgit v1.2.3