1
0
Fork 0
forked from len0rd/rockbox

Allow higher precision in calculation of seek position and elapsed time for mpc codec.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20756 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Andree Buschmann 2009-04-20 19:16:48 +00:00
parent f7a9125781
commit f4ac75752e

View file

@ -72,7 +72,8 @@ MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH]
enum codec_status codec_main(void) enum codec_status codec_main(void)
{ {
mpc_int64_t samplesdone; mpc_int64_t samplesdone;
unsigned long frequency; uint32_t frequency; /* 0.1 kHz accuracy */
uint32_t elapsed_time; /* milliseconds */
unsigned status; unsigned status;
mpc_reader reader; mpc_reader reader;
mpc_streaminfo info; mpc_streaminfo info;
@ -107,7 +108,7 @@ next_track:
retval = CODEC_ERROR; retval = CODEC_ERROR;
goto done; goto done;
} }
frequency = info.sample_freq / 1000; frequency = info.sample_freq / 100; /* 0.1 kHz accuracy */
ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq); ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq);
/* set playback engine up for correct number of channels */ /* set playback engine up for correct number of channels */
@ -131,10 +132,11 @@ next_track:
} }
/* Resume to saved sample offset. */ /* Resume to saved sample offset. */
if(samplesdone > 0) { if (samplesdone > 0) {
/* hack to improve seek time if filebuf goes empty */ /* hack to improve seek time if filebuf goes empty */
if (mpc_decoder_seek_sample(&decoder, samplesdone)) { if (mpc_decoder_seek_sample(&decoder, samplesdone)) {
ci->set_elapsed(samplesdone/frequency); elapsed_time = (samplesdone*10)/frequency;
ci->set_elapsed(elapsed_time);
} else { } else {
samplesdone = 0; samplesdone = 0;
} }
@ -143,29 +145,17 @@ next_track:
/* This is the decoding loop. */ /* This is the decoding loop. */
do { do {
#if 1
/* Complete seek handler. */ /* Complete seek handler. */
if (ci->seek_time) { if (ci->seek_time) {
/* hack to improve seek time if filebuf goes empty */ /* hack to improve seek time if filebuf goes empty */
mpc_int64_t new_offset = (ci->seek_time - 1)*frequency; mpc_int64_t new_offset = ((ci->seek_time - 1)/10)*frequency;
if (mpc_decoder_seek_sample(&decoder, new_offset)) { if (mpc_decoder_seek_sample(&decoder, new_offset)) {
samplesdone = new_offset; samplesdone = new_offset;
ci->set_elapsed(ci->seek_time); ci->set_elapsed(ci->seek_time);
} }
ci->seek_complete(); ci->seek_complete();
/* reset chunksize */ /* reset chunksize */
} }
#else
/* Seek to start of track handler. */
if (ci->seek_time) {
if (ci->seek_time == 1 && mpc_decoder_seek_sample(&decoder, 0)) {
samplesdone = 0;
ci->set_elapsed(0);
}
ci->seek_complete();
}
#endif
if (ci->stop_codec || ci->new_track) if (ci->stop_codec || ci->new_track)
break; break;
@ -181,7 +171,8 @@ next_track:
sample_buffer + MPC_FRAME_LENGTH, sample_buffer + MPC_FRAME_LENGTH,
status); status);
samplesdone += status; samplesdone += status;
ci->set_elapsed(samplesdone/frequency); elapsed_time = (samplesdone*10)/frequency;
ci->set_elapsed(elapsed_time);
ci->set_offset(samplesdone); ci->set_offset(samplesdone);
} }
} while (status != 0); } while (status != 0);