From c1fbcd03f04cfb11401174e40f7d451ee3abfff5 Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Wed, 19 May 2004 22:03:27 +0000 Subject: 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 --- TODO | 28 ++++++++++++++++++++-------- src/mp3_decode.c | 18 +++++++++++------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/TODO b/TODO index 9f63dca88..62814c3d8 100644 --- a/TODO +++ b/TODO @@ -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; -- cgit v1.2.3