aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO28
-rw-r--r--src/mp3_decode.c18
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;