From a987141b70b8c5ac1dfec22df8d217bcb75c1c79 Mon Sep 17 00:00:00 2001 From: Buschel Date: Mon, 20 Apr 2009 19:16:48 +0000 Subject: [PATCH] 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 --- apps/codecs/mpc.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c index a227fb81c..250a03fbf 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); -- 2.11.4.GIT