X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mp3dec_filter.c;h=f03fbb76d4c004f1b439bb26bbfbe6414d7b07cf;hp=a025eed55465bf8766a838eec11d553b1617d81b;hb=d4d37bb32a8d6219f9f52aa2ee3de55eb7e099c8;hpb=9609fd30e0d3db45ede3ab5c6bc3a77c15b6aef8 diff --git a/mp3dec_filter.c b/mp3dec_filter.c index a025eed5..f03fbb76 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. */ @@ -50,7 +50,7 @@ struct private_mp3dec_data { /** The number of channels of the current stream. */ unsigned int channels; /** Current sample rate in Hz. */ - unsigned int samplerate; + unsigned int sample_rate; }; static int need_bad_data_delay(struct private_mp3dec_data *pmd, @@ -140,6 +140,12 @@ next_buffer: 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); @@ -159,7 +165,7 @@ next_frame: goto next_buffer; } fn->min_iqs = 0; - pmd->samplerate = pmd->frame.header.samplerate; + pmd->sample_rate = pmd->frame.header.samplerate; pmd->channels = MAD_NCHANNELS(&pmd->frame.header); ret = mad_frame_decode(&pmd->frame, &pmd->stream); if (ret != 0) { @@ -230,10 +236,10 @@ static int mp3dec_execute(struct btr_node *btrn, const char *cmd, char **result) struct filter_node *fn = btr_context(btrn); struct private_mp3dec_data *pmd = fn->private_data; - if (!strcmp(cmd, "samplerate")) { - if (pmd->samplerate == 0) + if (!strcmp(cmd, "sample_rate")) { + if (pmd->sample_rate == 0) return -E_BTR_NAVAIL; - *result = make_message("%u", pmd->samplerate); + *result = make_message("%u", pmd->sample_rate); return 1; } if (!strcmp(cmd, "channels")) {