X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mp3dec_filter.c;h=35448da7e22f67c84e2fb08d8f1ba6b15de2d49f;hp=bff42090158d4929cab5e7cbdfdcf20aff864bdf;hb=f2dc2702b87b18aeaf27aeefbdb952aa48c43235;hpb=d9d83772fbee853857f1904fa6553f06a026108c diff --git a/mp3dec_filter.c b/mp3dec_filter.c index bff42090..35448da7 100644 --- a/mp3dec_filter.c +++ b/mp3dec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2009 Andre Noll + * Copyright (C) 2005-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -131,15 +131,21 @@ next_buffer: pmd->stream.error = 0; t->error = 0; iqs = btr_get_input_queue_size(btrn); - if (need_bad_data_delay(pmd, iqs)) - return; ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL); if (ret < 0) goto err; + if (need_bad_data_delay(pmd, iqs)) + return; if (ret == 0) return; btr_merge(btrn, fn->min_iqs); len = btr_next_buffer(btrn, &inbuffer); + /* + * Decode at most 8K in one go to give the post_select() functions of + * other buffer tree nodes a chance to run. This is necessary to avoid + * buffer underruns on slow machines. + */ + len = PARA_MIN(len, (size_t)8192); mad_stream_buffer(&pmd->stream, (unsigned char *)inbuffer, len); next_frame: ret = mad_header_decode(&pmd->frame.header, &pmd->stream); @@ -232,13 +238,13 @@ static int mp3dec_execute(struct btr_node *btrn, const char *cmd, char **result) if (!strcmp(cmd, "samplerate")) { if (pmd->samplerate == 0) - return -ERRNO_TO_PARA_ERROR(ENAVAIL); + return -E_BTR_NAVAIL; *result = make_message("%u", pmd->samplerate); return 1; } if (!strcmp(cmd, "channels")) { if (pmd->channels == 0) - return -ERRNO_TO_PARA_ERROR(ENAVAIL); + return -E_BTR_NAVAIL; *result = make_message("%u", pmd->channels); return 1; }