diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2004-05-18 03:37:55 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2004-05-18 03:37:55 +0000 |
commit | 746e7477e047a78296fc60347448720add025bce (patch) | |
tree | d54ca55fab5f86b789fbc524643583e4258cd294 /src/mp3_decode.c | |
parent | aed844a67df54d54f4765413077af0651378bb81 (diff) | |
download | mpd-746e7477e047a78296fc60347448720add025bce.tar.gz mpd-746e7477e047a78296fc60347448720add025bce.tar.xz mpd-746e7477e047a78296fc60347448720add025bce.zip |
yes! rudimentary stream playing for mp3's!
be gentle
git-svn-id: https://svn.musicpd.org/mpd/trunk@1051 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/mp3_decode.c')
-rw-r--r-- | src/mp3_decode.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/mp3_decode.c b/src/mp3_decode.c index a5a0d216c..15f423e4a 100644 --- a/src/mp3_decode.c +++ b/src/mp3_decode.c @@ -139,8 +139,8 @@ typedef struct _mp3DecodeData { int initMp3DecodeData(mp3DecodeData * data, char * file) { int ret; - while(((ret = openInputStream(&(data->inStream),file))<0)) /*&& - data->inStream.error==EINTR);*/ + /*while(((*/ret = openInputStream(&(data->inStream),file)/*)<0)) && + data->inStream.error==EINTR)*/; if(ret<0) return -1; data->outputPtr = data->outputBuffer; @@ -165,10 +165,13 @@ int initMp3DecodeData(mp3DecodeData * data, char * file) { int fillMp3InputBuffer(mp3DecodeData * data, long offset) { size_t readSize; size_t remaining; + size_t readed; unsigned char * readStart; if(offset>=0) { - seekInputStream(&(data->inStream),offset,SEEK_SET); + if(seekInputStream(&(data->inStream),offset,SEEK_SET) < 0) { + return -1; + } } if(offset==-1 && (data->stream).next_frame!=NULL) { @@ -182,11 +185,15 @@ int fillMp3InputBuffer(mp3DecodeData * data, long offset) { readStart = data->readBuffer, remaining = 0; } - - readSize = readFromInputStream(&(data->inStream),readStart,1,readSize); - if(readSize<=0) return -1; - mad_stream_buffer(&data->stream,data->readBuffer,readSize+remaining); + readed = 0; + while(readed == 0 && !inputStreamAtEOF(&(data->inStream))) { + readed = readFromInputStream(&(data->inStream), readStart, 1, + readSize); + } + if(readed<=0) return -1; + + mad_stream_buffer(&data->stream,data->readBuffer,readed+remaining); (data->stream).error = 0; return 0; @@ -441,6 +448,7 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { if(data->muteFrame) { if(!dc->seek) data->muteFrame = 0; else if(dc->seekWhere<=data->elapsedTime) { + clearOutputBuffer(cb); data->muteFrame = 0; dc->seek = 0; } @@ -485,8 +493,6 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { if(dc->seek) { long i = 0; - cb->wrap = 0; - cb->end = cb->begin; data->muteFrame = 1; while(i<data->highestFrame && dc->seekWhere > ((float)mad_timer_count(data->times[i], @@ -495,9 +501,14 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) { i++; } if(i<data->highestFrame) { - data->currentFrame = i; - fillMp3InputBuffer(data,data->frameOffset[i]); - data->muteFrame = 0; + if(fillMp3InputBuffer(data, + data->frameOffset[i]) == 0) + { + clearOutputBuffer(cb); + data->currentFrame = i; + data->muteFrame = 0; + } + else dc->seekError = 1; dc->seek = 0; } } |