Commit 17e9cc84 authored by Max Kellermann's avatar Max Kellermann

added decoder_seek_where() and decoder_seek_error()

Provide access to seeking for the decoder plugins; they have to know where to seek, and they need a way to tell us that seeking has failed.
parent 78c55e24
sisyphus 0.23.15-alt1 0.23.14-alt1 0.23.13-alt1 0.23.12-alt1 0.23.11-alt1 0.23.8-alt3 0.23.8-alt2 0.23.8-alt1 0.21.24-alt1.1 0.21.24-alt1 0.20.23-alt3 0.20.23-alt2 0.20.23-alt1 0.20.21-alt1 0.20.15-alt1 0.18.14-alt1 0.18.11-alt1.1 0.18.11-alt1 0.18.10-alt1 0.17.0-alt0.3.git050212 0.17.0-alt0.2.git200911 0.17.0-alt0.2.M60P.1.git050212 0.17.0-alt0.1 0.16.2-alt2 0.16.2-alt1 0.15.13-alt1 0.15.13-alt0.M51.1 0.15.13-alt 0.15.8-alt2 0.15.8-alt1 0.15.3-alt1.1 0.15.3-alt1 0.15.0-alt2 0.15.0-alt1 0.14.2 0.14.2-alt1 0.14.2-alt 0.14.1 0.14.1-alt 0.14.0-alt 0.14-alt1 0.14-alt v0.18.14 v0.18.13 v0.18.12 v0.18.11 v0.18.10 v0.18.9 v0.18.8 v0.18.7 v0.18.6 v0.18.5 v0.18.4 v0.18.3 v0.18.2 v0.17.3 v0.17.2 v0.17.1 v0.17.0-git200911 v0.17.0-git200711 v0.17.0-git050212 v0.16.8 v0.16.5 v0.16.4 v0.16.3 v0.16.2 v0.16.1 v0.16 v0.16_alpha4 v0.16_alpha3 v0.16_alpha2 v0.15.16 v0.15.14 v0.15.13 v0.15.11 v0.15.10 v0.15.9 v0.15.7 v0.15.6 v0.15.5 release-0.16.5 release-0.16.4 release-0.16.3 release-0.16.1 release-0.16 release-0.16_alpha4 release-0.16_alpha3 release-0.16_alpha2 release-0.15.16 release-0.15.14 release-0.15.13 release-0.15.11 release-0.15.10 release-0.15.9 release-0.15.7 release-0.15.6 release-0.15.5 mpd/0.20.6-alt1 mpd/0.19.9-alt1 mpd/0.18.14-alt2 gb-sisyphus-task339776.6100 gb-sisyphus-task337393.100 gb-sisyphus-task337176.300 gb-sisyphus-task334590.100 gb-sisyphus-task333607.100 gb-sisyphus-task331543.2500 gb-sisyphus-task328663.4700 gb-sisyphus-task325064.100 gb-sisyphus-task319111.4000 gb-sisyphus-task313704.100 gb-sisyphus-task312885.100 gb-sisyphus-task308905.3200 gb-sisyphus-task305294.500 gb-sisyphus-task304007.100 gb-sisyphus-task303674.1700 gb-sisyphus-task298681.300 gb-sisyphus-task296051.1000 gb-sisyphus-task274827.100 gb-sisyphus-task269249.2000 gb-sisyphus-task266579.400 gb-sisyphus-task258132.600 gb-sisyphus-task254601.200 gb-sisyphus-task253310.100 gb-sisyphus-task252214.300 gb-sisyphus-task251539.6100 gb-sisyphus-task247988.7000 gb-sisyphus-task238768.6000 gb-sisyphus-task229151.100 gb-sisyphus-task227574.200 gb-sisyphus-task226762.6000 gb-sisyphus-task219546.1700 gb-sisyphus-task213491.100 gb-sisyphus-task198806.100 gb-sisyphus-task181400.100 gb-sisyphus-task141957.100 gb-sisyphus-task135039.100 gb-sisyphus-task130102.100 gb-sisyphus-task129023.100 gb-sisyphus-task127959.100 gb-sisyphus-task118591.100 gb-p9-task277538.2600 gb-c9f2-task327704.1100 fixed-0.17.0-git200911 alt-0.17.0-git200711 alt-0.17.0-git050212 alt-0.16.2
No related merge requests found
......@@ -58,6 +58,21 @@ void decoder_command_finished(mpd_unused struct decoder * decoder)
notify_signal(&pc.notify);
}
double decoder_seek_where(mpd_unused struct decoder * decoder)
{
assert(dc.command == DECODE_COMMAND_SEEK);
return dc.seekWhere;
}
void decoder_seek_error(struct decoder * decoder)
{
assert(dc.command == DECODE_COMMAND_SEEK);
dc.seekError = 1;
decoder_command_finished(decoder);
}
/**
* All chunks are full of decoded data; wait for the player to free
* one.
......@@ -72,8 +87,7 @@ static int need_chunks(struct decoder *decoder, InputStream * inStream,
if (seekable) {
return OUTPUT_BUFFER_DC_SEEK;
} else {
dc.seekError = 1;
decoder_command_finished(decoder);
decoder_seek_error(decoder);
}
}
......
......@@ -112,6 +112,10 @@ enum decoder_command decoder_get_command(struct decoder * decoder);
*/
void decoder_command_finished(struct decoder * decoder);
double decoder_seek_where(struct decoder * decoder);
void decoder_seek_error(struct decoder * decoder);
/**
* This function is called by the decoder plugin when it has
* successfully decoded block of input data.
......
......@@ -389,10 +389,9 @@ static int aac_decode(struct decoder * mpd_decoder, char *path)
decoder_data(mpd_decoder, NULL, 0, sampleBuffer,
sampleBufferLen, file_time,
bitRate, NULL);
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
dc.seekError = 1;
decoder_command_finished(decoder);
} else if (decoder_get_command(decoder) == DECODE_COMMAND_STOP)
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK) {
decoder_seek_error(mpd_decoder);
} else if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_STOP)
break;
}
......@@ -405,9 +404,8 @@ static int aac_decode(struct decoder * mpd_decoder, char *path)
if (dc.state != DECODE_STATE_DECODE)
return -1;
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
dc.seekError = 1;
decoder_command_finished(decoder);
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK) {
decoder_seek_error(mpd_decoder);
}
return 0;
......
......@@ -92,7 +92,7 @@ static int audiofile_decode(struct decoder * decoder, char *path)
do {
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
decoder_clear(decoder);
current = dc.seekWhere *
current = decoder_seek_where(decoder) *
audio_format.sampleRate;
afSeekFrame(af_fp, AF_DEFAULT_TRACK, current);
decoder_command_finished(decoder);
......
......@@ -424,16 +424,16 @@ static int flac_decode_internal(struct decoder * decoder,
if (flac_get_state(flacDec) == flac_decoder_eof)
break;
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
FLAC__uint64 sampleToSeek = dc.seekWhere *
FLAC__uint64 sampleToSeek = decoder_seek_where(decoder) *
data.audio_format.sampleRate + 0.5;
if (flac_seek_absolute(flacDec, sampleToSeek)) {
decoder_clear(decoder);
data.time = ((float)sampleToSeek) /
data.audio_format.sampleRate;
data.position = 0;
decoder_command_finished(decoder);
} else
dc.seekError = 1;
decoder_command_finished(decoder);
decoder_seek_error(decoder);
}
}
if (decoder_get_command(decoder) != DECODE_COMMAND_STOP) {
......
......@@ -188,8 +188,7 @@ static int mod_decode(struct decoder * decoder, char *path)
while (1) {
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
dc.seekError = 1;
decoder_command_finished(decoder);
decoder_seek_error(decoder);
}
if (decoder_get_command(decoder) == DECODE_COMMAND_STOP)
......
......@@ -851,7 +851,7 @@ static int mp3Read(mp3DecodeData * data, struct decoder *decoder,
data->muteFrame = 0;
break;
case MUTEFRAME_SEEK:
if (dc.seekWhere <= data->elapsedTime) {
if (decoder_seek_where(decoder) <= data->elapsedTime) {
data->outputPtr = data->outputBuffer;
decoder_clear(decoder);
data->muteFrame = 0;
......@@ -952,7 +952,8 @@ static int mp3Read(mp3DecodeData * data, struct decoder *decoder,
data->inStream->seekable) {
long j = 0;
data->muteFrame = MUTEFRAME_SEEK;
while (j < data->highestFrame && dc.seekWhere >
while (j < data->highestFrame &&
decoder_seek_where(decoder) >
((float)mad_timer_count(data->times[j],
MAD_UNITS_MILLISECONDS))
/ 1000) {
......@@ -965,15 +966,14 @@ static int mp3Read(mp3DecodeData * data, struct decoder *decoder,
data->outputPtr = data->outputBuffer;
decoder_clear(decoder);
data->currentFrame = j;
decoder_command_finished(decoder);
} else
dc.seekError = 1;
decoder_seek_error(decoder);
data->muteFrame = 0;
decoder_command_finished(decoder);
}
} else if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK &&
!data->inStream->seekable) {
dc.seekError = 1;
decoder_command_finished(decoder);
decoder_seek_error(decoder);
}
}
......
......@@ -106,6 +106,7 @@ static int mp4_decode(struct decoder * mpd_decoder, InputStream * inStream)
long offset;
mpd_uint16 bitRate = 0;
int seeking = 0;
double seek_where = 0;
mp4cb = xmalloc(sizeof(mp4ff_callback_t));
mp4cb->read = mp4_inputStreamReadCallback;
......@@ -178,13 +179,15 @@ static int mp4_decode(struct decoder * mpd_decoder, InputStream * inStream)
seekTable = xmalloc(sizeof(float) * numSamples);
for (sampleId = 0; sampleId < numSamples; sampleId++) {
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK)
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK) {
seeking = 1;
seek_where = decoder_seek_where(mpd_decoder);
}
if (seeking && seekTableEnd > 1 &&
seekTable[seekTableEnd] >= dc.seekWhere) {
seekTable[seekTableEnd] >= seek_where) {
int i = 2;
while (seekTable[i] < dc.seekWhere)
while (seekTable[i] < seek_where)
i++;
sampleId = i - 1;
file_time = seekTable[sampleId];
......@@ -206,7 +209,7 @@ static int mp4_decode(struct decoder * mpd_decoder, InputStream * inStream)
dur -= offset;
file_time += ((float)dur) / scale;
if (seeking && file_time > dc.seekWhere)
if (seeking && file_time > seek_where)
seekPositionFound = 1;
if (seeking && seekPositionFound) {
......
......@@ -178,14 +178,15 @@ static int mpc_decode(struct decoder * mpd_decoder, InputStream * inStream)
while (!eof) {
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK) {
samplePos = dc.seekWhere * audio_format.sampleRate;
samplePos = decoder_seek_where(mpd_decoder) *
audio_format.sampleRate;
if (mpc_decoder_seek_sample(&decoder, samplePos)) {
decoder_clear(mpd_decoder);
s16 = (mpd_sint16 *) chunk;
chunkpos = 0;
decoder_command_finished(mpd_decoder);
} else
dc.seekError = 1;
decoder_command_finished(mpd_decoder);
decoder_seek_error(mpd_decoder);
}
vbrUpdateAcc = 0;
......
......@@ -333,7 +333,6 @@ static unsigned int oggflac_try_decode(InputStream * inStream)
static int oggflac_decode(struct decoder * mpd_decoder, InputStream * inStream)
{
DecoderControl *dc = mpd_decoder->dc;
OggFLAC__SeekableStreamDecoder *decoder = NULL;
FlacData data;
int ret = 0;
......@@ -354,7 +353,7 @@ static int oggflac_decode(struct decoder * mpd_decoder, InputStream * inStream)
break;
}
if (decoder_get_command(mpd_decoder) == DECODE_COMMAND_SEEK) {
FLAC__uint64 sampleToSeek = dc->seekWhere *
FLAC__uint64 sampleToSeek = decoder_seek_where(mpd_decoder) *
data.audio_format.sampleRate + 0.5;
if (OggFLAC__seekable_stream_decoder_seek_absolute
(decoder, sampleToSeek)) {
......@@ -362,9 +361,9 @@ static int oggflac_decode(struct decoder * mpd_decoder, InputStream * inStream)
data.time = ((float)sampleToSeek) /
data.audio_format.sampleRate;
data.position = 0;
decoder_command_finished(mpd_decoder);
} else
dc.seekError = 1;
decoder_command_finished(mpd_decoder);
decoder_seek_error(mpd_decoder);
}
}
......
......@@ -268,12 +268,13 @@ static int oggvorbis_decode(struct decoder * decoder, InputStream * inStream)
while (1) {
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK) {
if (0 == ov_time_seek_page(&vf, dc.seekWhere)) {
double seek_where = decoder_seek_where(decoder);
if (0 == ov_time_seek_page(&vf, seek_where)) {
decoder_clear(decoder);
chunkpos = 0;
decoder_command_finished(decoder);
} else
dc.seekError = 1;
decoder_command_finished(decoder);
decoder_seek_error(decoder);
}
ret = ov_read(&vf, chunk + chunkpos,
OGG_CHUNK_SIZE - chunkpos,
......
......@@ -178,17 +178,16 @@ static void wavpack_decode(struct decoder * decoder,
decoder_clear(decoder);
where = dc.seekWhere *
where = decoder_seek_where(decoder) *
audio_format.sampleRate;
if (WavpackSeekSample(wpc, where))
if (WavpackSeekSample(wpc, where)) {
position = where;
else
dc.seekError = 1;
decoder_command_finished(decoder);
} else
decoder_seek_error(decoder);
} else {
dc.seekError = 1;
decoder_seek_error(decoder);
}
decoder_command_finished(decoder);
}
if (decoder_get_command(decoder) == DECODE_COMMAND_STOP)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment