X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=flacdec_filter.c;h=e8baa6b4b35031205f4fb28d858a6c1593e7ae7e;hp=027596438b6a7d61ea31c30facffdb2932bdd9f3;hb=02dd632ab2a6696aff7b6c6d108069704cfe871a;hpb=f48194d3ff2a3983f21cab1553fbe29529f2e790 diff --git a/flacdec_filter.c b/flacdec_filter.c index 02759643..e8baa6b4 100644 --- a/flacdec_filter.c +++ b/flacdec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Andre Noll + * Copyright (C) 2011-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -7,7 +7,6 @@ /** \file flacdec_filter.c The flac decoder. */ #include -#include #include #include "para.h" @@ -235,27 +234,25 @@ static void flacdec_post_select(__a_unused struct sched *s, struct task *t) ret = flacdec_init(fn); goto out; } - pfd->unconsumed = 0; - for (;;) { - if (output_queue_full(btrn)) { - pfd->have_more = true; - break; - } - pfd->have_more = false; - FLAC__StreamDecoderState state; - FLAC__stream_decoder_process_single(pfd->decoder); - state = FLAC__stream_decoder_get_state(pfd->decoder); - //PARA_CRIT_LOG("state: %s\n", FLAC__stream_decoder_get_resolved_state_string(pfd->decoder)); - ret = -E_FLACDEC_EOF; - if (state == FLAC__STREAM_DECODER_END_OF_STREAM) - goto out; - if (state == FLAC__STREAM_DECODER_ABORTED) { - FLAC__stream_decoder_flush(pfd->decoder); - fn->min_iqs = pfd->unconsumed + 1; - break; - } - fn->min_iqs = 0; + if (output_queue_full(btrn)) { + pfd->have_more = true; + ret = 1; + goto out; } + pfd->have_more = false; + FLAC__StreamDecoderState state; + FLAC__stream_decoder_process_single(pfd->decoder); + state = FLAC__stream_decoder_get_state(pfd->decoder); + ret = -E_FLACDEC_EOF; + if (state == FLAC__STREAM_DECODER_END_OF_STREAM) + goto out; + if (state == FLAC__STREAM_DECODER_ABORTED) { + FLAC__stream_decoder_flush(pfd->decoder); + fn->min_iqs = pfd->unconsumed + 1; + ret = 1; + goto out; + } + fn->min_iqs = 0; ret = 1; out: t->error = ret; @@ -265,10 +262,17 @@ out: static void flacdec_close(struct filter_node *fn) { - struct private_flacdec_data *pfd = fn->private_data; + struct private_flacdec_data *pfd; - FLAC__stream_decoder_finish(pfd->decoder); - FLAC__stream_decoder_delete(pfd->decoder); + if (!fn) + return; + pfd = fn->private_data; + if (!pfd) + return; + if (pfd->decoder) { + FLAC__stream_decoder_finish(pfd->decoder); + FLAC__stream_decoder_delete(pfd->decoder); + } free(pfd); fn->private_data = NULL; }