X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mp3dec_filter.c;h=f03fbb76d4c004f1b439bb26bbfbe6414d7b07cf;hp=696367d6c0855e789c3b0ee47529316fbedf925d;hb=d4d37bb32a8d6219f9f52aa2ee3de55eb7e099c8;hpb=cc38b08b6215e9c1ee9e1d96af0eebc12fd6479a diff --git a/mp3dec_filter.c b/mp3dec_filter.c index 696367d6..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,15 +236,15 @@ 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) - return -ERRNO_TO_PARA_ERROR(ENAVAIL); - *result = make_message("%u", pmd->samplerate); + if (!strcmp(cmd, "sample_rate")) { + if (pmd->sample_rate == 0) + return -E_BTR_NAVAIL; + *result = make_message("%u", pmd->sample_rate); 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; }