summaryrefslogtreecommitdiff
path: root/apps/codecs/mpa.c
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2005-08-16 18:26:41 +0000
committerMagnus Holmgren <magnushol@gmail.com>2005-08-16 18:26:41 +0000
commit753a89718c8d9cc837ee5de8f4d52af21abc6455 (patch)
treebf08079d9ade88f7171f23e1b13b5d7376c5d12b /apps/codecs/mpa.c
parent1d282403308691a627e6aec763e5cd9b68469298 (diff)
downloadrockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.zip
rockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.tar.gz
rockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.tar.bz2
rockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.tar.xz
Fix for ff/rw in long MP3 files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7334 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/mpa.c')
-rw-r--r--apps/codecs/mpa.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index 110df0c..50a076b 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -25,6 +25,7 @@
#include "dsp.h"
#include "lib/codeclib.h"
#include "system.h"
+#include <inttypes.h>
struct mad_stream Stream IDATA_ATTR;
struct mad_frame Frame IDATA_ATTR;
@@ -52,11 +53,10 @@ extern char iramend[];
#endif
struct codec_api *ci;
-unsigned int samplecount;
-unsigned int samplesdone;
+int64_t samplecount;
+int64_t samplesdone;
int stop_skip, start_skip;
int current_stereo_mode = -1;
-int frequency_divider;
unsigned int current_frequency = 0;
void recalc_samplecount(void)
@@ -67,10 +67,12 @@ void recalc_samplecount(void)
if (ci->id3->frame_count) {
/* TODO: 1152 is the frame size in samples for MPEG1 layer 2 and layer 3,
it's probably not correct at all for MPEG2 and layer 1 */
- samplecount = ci->id3->frame_count*1152 - (start_skip + stop_skip);
+ samplecount = ((int64_t) ci->id3->frame_count) * 1152;
} else {
- samplecount = ci->id3->length * frequency_divider / 10;
+ samplecount = ((int64_t) ci->id3->length) * current_frequency / 10;
}
+
+ samplecount -= start_skip + stop_skip;
}
/* this is the codec entry point */
@@ -134,10 +136,6 @@ enum codec_status codec_start(struct codec_api* api)
while (!*ci->taginfo_ready && !ci->stop_codec)
ci->sleep(1);
- frequency_divider = ci->id3->frequency / 100;
- if (frequency_divider <= 0)
- frequency_divider = 441;
-
ci->configure(DSP_SET_FREQUENCY, (int *)ci->id3->frequency);
current_frequency = ci->id3->frequency;
codec_set_replaygain(ci->id3);
@@ -155,7 +153,7 @@ enum codec_status codec_start(struct codec_api* api)
start_skip = mpeg_latency[ci->id3->layer];
}
- samplesdone = ci->id3->elapsed * frequency_divider / 10;
+ samplesdone = ((int64_t) ci->id3->elapsed) * current_frequency / 1000;
frame_skip = start_skip;
recalc_samplecount();
@@ -171,7 +169,8 @@ enum codec_status codec_start(struct codec_api* api)
if (ci->seek_time) {
int newpos;
- samplesdone = (ci->seek_time-1) * frequency_divider / 10;
+ samplesdone = ((int64_t) (ci->seek_time - 1))
+ * current_frequency / 1000;
newpos = ci->mp3_get_filepos(ci->seek_time-1);
if (!ci->seek_buffer(newpos)) {
@@ -235,7 +234,6 @@ enum codec_status codec_start(struct codec_api* api)
if(Frame.header.samplerate != current_frequency) {
current_frequency = Frame.header.samplerate;
- frequency_divider = current_frequency / 100;
ci->configure(DSP_SWITCH_FREQUENCY,
(int *)current_frequency);
recalc_samplecount();
@@ -243,10 +241,10 @@ enum codec_status codec_start(struct codec_api* api)
if (stop_skip > 0)
{
- long max = samplecount - samplesdone;
+ int64_t max = samplecount - samplesdone;
if (max < 0) max = 0;
- if (max < framelength) framelength = max;
+ if (max < framelength) framelength = (int) max;
if (framelength == 0) break;
}
@@ -275,7 +273,7 @@ enum codec_status codec_start(struct codec_api* api)
ci->advance_buffer(size);
samplesdone += framelength;
- ci->set_elapsed(samplesdone / (frequency_divider / 10));
+ ci->set_elapsed(samplesdone / (current_frequency / 1000));
}
Stream.error = 0;