diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2004-05-19 22:03:27 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2004-05-19 22:03:27 +0000 |
commit | c1fbcd03f04cfb11401174e40f7d451ee3abfff5 (patch) | |
tree | 3b664e3b6c46e89990fe4b5348f8bf5e47d2ba86 | |
parent | 3e659738ba2f02399b98f09873eb4ee2de832430 (diff) | |
download | mpd-c1fbcd03f04cfb11401174e40f7d451ee3abfff5.tar.gz mpd-c1fbcd03f04cfb11401174e40f7d451ee3abfff5.tar.xz mpd-c1fbcd03f04cfb11401174e40f7d451ee3abfff5.zip |
todo update and make firstFrame in mp3_decode less blocky!
git-svn-id: https://svn.musicpd.org/mpd/trunk@1098 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r-- | TODO | 28 | ||||
-rw-r--r-- | src/mp3_decode.c | 18 |
2 files changed, 31 insertions, 15 deletions
@@ -1,22 +1,34 @@ 1) play streams - a) for mp3, remember to turn off IGNORECRC for mp3 streams - b) deal with non-blocking in decodeFirstFrame (mp3) better! - c) bufferInput in outputBuffer waiting! + a) make seekings non-blocking: + 1) player: + a) first check that seekWhere isn't already buffered + b) if not current song, stop it and play the song to + seek + c) set dc->seek and dc->seekWhere if not already set + and set elapsed time to seekWhere and + then set pc->seek = 0 + d) while seeking just continue to play buffer + until seek is done + 2) decoder: + a) seek no longer blocks so don't worry about checking + seek in blocking portions, only check stop! + b) yay, less code mess! + b) bufferInput in outputBuffer waiting! 1) implement some sort of callback mechanism for this for abstraction sake - d) deal with pausing better + c) deal with pausing better 1) seekable, on resuming pause, check if we need to reconnect, jumping to offset 2) if seekable, at some point after init, mark this! 3) if not seekable, reset buffer, and elapsedTime when unpaused - e) put some sort of error reporting for streaming/inputStream! - f) ogg streams - g) fetch metadata and store in DecoderControl and pass to + d) put some sort of error reporting for streaming/inputStream! + e) ogg streams + f) fetch metadata and store in DecoderControl and pass to PlayerControl 1) eventually deal with icy-metadata 2) parse metadata on the fly in decoders - h) command for dealing with the changing metadata, currentsonginfo + g) command for dealing with the changing metadata, currentsonginfo or something 2) how to deal with streams and the db diff --git a/src/mp3_decode.c b/src/mp3_decode.c index 23bed6bac..33c309e7b 100644 --- a/src/mp3_decode.c +++ b/src/mp3_decode.c @@ -332,7 +332,7 @@ fail: return 0; } -int decodeFirstFrame(mp3DecodeData * data) { +int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc) { struct xing xing; int ret; int skip; @@ -342,10 +342,12 @@ int decodeFirstFrame(mp3DecodeData * data) { while(1) { skip = 0; - while((ret = decodeNextFrameHeader(data))==DECODE_CONT); + while((ret = decodeNextFrameHeader(data))==DECODE_CONT && + (!dc || !dc->stop)); if(ret==DECODE_SKIP) skip = 1; else if(ret==DECODE_BREAK) return -1; - while((ret = decodeNextFrame(data))==DECODE_CONT); + while((ret = decodeNextFrame(data))==DECODE_CONT && + (!dc || !dc->stop)); if(ret==DECODE_BREAK) return -1; if(!skip && ret==DECODE_OK) break; } @@ -407,16 +409,18 @@ int getMp3TotalTime(char * file) { if(openInputStream(&inStream, file) < 0) return -1; initMp3DecodeData(&data,&inStream); - if(decodeFirstFrame(&data)<0) ret = -1; + if(decodeFirstFrame(&data, NULL)<0) ret = -1; else ret = data.totalTime+0.5; mp3DecodeDataFinalize(&data); return ret; } -int openMp3FromInputStream(InputStream * inStream, mp3DecodeData * data) { +int openMp3FromInputStream(InputStream * inStream, mp3DecodeData * data, + DecoderControl * dc) +{ initMp3DecodeData(data, inStream); - if(decodeFirstFrame(data)<0) { + if(decodeFirstFrame(data, dc)<0) { mp3DecodeDataFinalize(data); return -1; } @@ -550,7 +554,7 @@ void initAudioFormatFromMp3DecodeData(mp3DecodeData * data, AudioFormat * af) { int mp3_decode(OutputBuffer * cb, DecoderControl * dc, InputStream * inStream) { mp3DecodeData data; - if(openMp3FromInputStream(inStream, &data) < 0) { + if(openMp3FromInputStream(inStream, &data, dc) < 0) { ERROR("Input does not appear to be a mp3 bit stream.\n"); closeInputStream(inStream); return -1; |