summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2009-04-20 19:16:48 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2009-04-20 19:16:48 +0000
commitf4ac75752e7b76b8aa24208a8d344b427351af6d (patch)
tree2075bcdfb0eb0a2126ebbfd5c325d02f52a6cfb7 /apps/codecs
parentf7a91257813a31e9616dc1da0f7a4a0a909db105 (diff)
downloadrockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.zip
rockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.tar.gz
rockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.tar.bz2
rockbox-f4ac75752e7b76b8aa24208a8d344b427351af6d.tar.xz
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
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/mpc.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c
index a227fb8..250a03f 100644
--- a/apps/codecs/mpc.c
+++ b/apps/codecs/mpc.c
@@ -72,7 +72,8 @@ MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH]
enum codec_status codec_main(void)
{
mpc_int64_t samplesdone;
- unsigned long frequency;
+ uint32_t frequency; /* 0.1 kHz accuracy */
+ uint32_t elapsed_time; /* milliseconds */
unsigned status;
mpc_reader reader;
mpc_streaminfo info;
@@ -107,7 +108,7 @@ next_track:
retval = CODEC_ERROR;
goto done;
}
- frequency = info.sample_freq / 1000;
+ frequency = info.sample_freq / 100; /* 0.1 kHz accuracy */
ci->configure(DSP_SWITCH_FREQUENCY, info.sample_freq);
/* set playback engine up for correct number of channels */
@@ -131,10 +132,11 @@ next_track:
}
/* Resume to saved sample offset. */
- if(samplesdone > 0) {
+ if (samplesdone > 0) {
/* hack to improve seek time if filebuf goes empty */
if (mpc_decoder_seek_sample(&decoder, samplesdone)) {
- ci->set_elapsed(samplesdone/frequency);
+ elapsed_time = (samplesdone*10)/frequency;
+ ci->set_elapsed(elapsed_time);
} else {
samplesdone = 0;
}
@@ -143,29 +145,17 @@ next_track:
/* This is the decoding loop. */
do {
- #if 1
/* Complete seek handler. */
if (ci->seek_time) {
/* 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)) {
samplesdone = new_offset;
ci->set_elapsed(ci->seek_time);
}
ci->seek_complete();
/* 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)
break;
@@ -181,7 +171,8 @@ next_track:
sample_buffer + MPC_FRAME_LENGTH,
status);
samplesdone += status;
- ci->set_elapsed(samplesdone/frequency);
+ elapsed_time = (samplesdone*10)/frequency;
+ ci->set_elapsed(elapsed_time);
ci->set_offset(samplesdone);
}
} while (status != 0);