fix some seeking stuff for mp3's

git-svn-id: https://svn.musicpd.org/mpd/trunk@1106 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-05-20 04:00:17 +00:00
parent 4db5224b47
commit 52d4200cb1
2 changed files with 22 additions and 18 deletions

8
TODO
View File

@ -2,8 +2,7 @@
a) make seekings non-blocking:
1) player:
a) first check that seekWhere isn't already buffered
2) check that stream is seekable before seeking forward!
3) deal with seeking forward better by calling seek function
2) deal with seeking forward better by calling seek function
(for mp3 and mp4)!
b) bufferInput in outputBuffer waiting!
1) implement some sort of callback mechanism for this
@ -15,12 +14,11 @@
3) if not seekable, reset buffer, and elapsedTime when
unpaused
d) put some sort of error reporting for streaming/inputStream!
e) ogg streams
f) fetch metadata and store in DecoderControl and pass to
e) fetch metadata and store in DecoderControl and pass to
PlayerControl
1) eventually deal with icy-metadata
2) parse metadata on the fly in decoders
g) command for dealing with the changing metadata, currentsonginfo
f) command for dealing with the changing metadata, currentsonginfo
or something
2) how to deal with streams and the db

View File

@ -55,6 +55,9 @@
#define DECODE_CONT -1
#define DECODE_OK 0
#define MUTEFRAME_SKIP 1
#define MUTEFRAME_SEEK 2
/* this is stolen from mpg321! */
struct audio_dither {
mad_fixed_t error[3];
@ -356,7 +359,7 @@ int decodeFirstFrame(mp3DecodeData * data, DecoderControl * dc) {
if(xing.flags & XING_FRAMES) {
mad_timer_t duration = data->frame.header.duration;
mad_timer_multiply(&duration,xing.frames);
data->muteFrame = 1;
data->muteFrame = MUTEFRAME_SKIP;
data->totalTime = ((float)mad_timer_count(duration,
MAD_UNITS_MILLISECONDS))/1000;
data->maxFrames = xing.frames;
@ -429,10 +432,10 @@ int openMp3FromInputStream(InputStream * inStream, mp3DecodeData * data,
}
int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
static int i;
static int ret;
static struct audio_dither dither;
static int skip;
int i;
int ret;
struct audio_dither dither;
int skip;
if(data->currentFrame>=data->highestFrame) {
mad_timer_add(&data->timer,(data->frame).header.duration);
@ -457,18 +460,19 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
data->currentFrame++;
data->elapsedTime = ((float)mad_timer_count(data->timer,MAD_UNITS_MILLISECONDS))/1000;
if(data->muteFrame) {
if(!dc->seek) data->muteFrame = 0;
else if(dc->seekWhere<=data->elapsedTime) {
switch(data->muteFrame) {
case MUTEFRAME_SKIP:
data->muteFrame = 0;
break;
case MUTEFRAME_SEEK:
if(dc->seekWhere<=data->elapsedTime) {
clearOutputBuffer(cb);
dc->seekChunk = cb->end;
data->muteFrame = 0;
dc->seek = 0;
}
}
else {
long ret;
break;
default:
mad_synth_frame(&data->synth,&data->frame);
for(i=0;i<(data->synth).pcm.length;i++) {
@ -489,6 +493,7 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
}
if(data->outputPtr==data->outputBufferEnd) {
long ret;
ret = sendDataToOutputBuffer(cb,dc,
data->outputBuffer,
MP3_DATA_OUTPUT_BUFFER_SIZE,
@ -506,7 +511,7 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
if(dc->seek) {
long i = 0;
data->muteFrame = 1;
data->muteFrame = MUTEFRAME_SEEK;
while(i<data->highestFrame && dc->seekWhere >
((float)mad_timer_count(data->times[i],
MAD_UNITS_MILLISECONDS))/1000)
@ -524,6 +529,7 @@ int mp3Read(mp3DecodeData * data, OutputBuffer * cb, DecoderControl * dc) {
}
dc->seek = 0;
}
else if(!data->inStream->seekable) dc->seek = 0;
}
}