diff options
author | Magnus Holmgren <magnushol@gmail.com> | 2005-08-16 18:26:41 +0000 |
---|---|---|
committer | Magnus Holmgren <magnushol@gmail.com> | 2005-08-16 18:26:41 +0000 |
commit | 753a89718c8d9cc837ee5de8f4d52af21abc6455 (patch) | |
tree | bf08079d9ade88f7171f23e1b13b5d7376c5d12b /apps/codecs/mpa.c | |
parent | 1d282403308691a627e6aec763e5cd9b68469298 (diff) | |
download | rockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.tar.gz rockbox-753a89718c8d9cc837ee5de8f4d52af21abc6455.zip |
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.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index 110df0c39f..50a076bf92 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "dsp.h" | 25 | #include "dsp.h" |
26 | #include "lib/codeclib.h" | 26 | #include "lib/codeclib.h" |
27 | #include "system.h" | 27 | #include "system.h" |
28 | #include <inttypes.h> | ||
28 | 29 | ||
29 | struct mad_stream Stream IDATA_ATTR; | 30 | struct mad_stream Stream IDATA_ATTR; |
30 | struct mad_frame Frame IDATA_ATTR; | 31 | struct mad_frame Frame IDATA_ATTR; |
@@ -52,11 +53,10 @@ extern char iramend[]; | |||
52 | #endif | 53 | #endif |
53 | 54 | ||
54 | struct codec_api *ci; | 55 | struct codec_api *ci; |
55 | unsigned int samplecount; | 56 | int64_t samplecount; |
56 | unsigned int samplesdone; | 57 | int64_t samplesdone; |
57 | int stop_skip, start_skip; | 58 | int stop_skip, start_skip; |
58 | int current_stereo_mode = -1; | 59 | int current_stereo_mode = -1; |
59 | int frequency_divider; | ||
60 | unsigned int current_frequency = 0; | 60 | unsigned int current_frequency = 0; |
61 | 61 | ||
62 | void recalc_samplecount(void) | 62 | void recalc_samplecount(void) |
@@ -67,10 +67,12 @@ void recalc_samplecount(void) | |||
67 | if (ci->id3->frame_count) { | 67 | if (ci->id3->frame_count) { |
68 | /* TODO: 1152 is the frame size in samples for MPEG1 layer 2 and layer 3, | 68 | /* TODO: 1152 is the frame size in samples for MPEG1 layer 2 and layer 3, |
69 | it's probably not correct at all for MPEG2 and layer 1 */ | 69 | it's probably not correct at all for MPEG2 and layer 1 */ |
70 | samplecount = ci->id3->frame_count*1152 - (start_skip + stop_skip); | 70 | samplecount = ((int64_t) ci->id3->frame_count) * 1152; |
71 | } else { | 71 | } else { |
72 | samplecount = ci->id3->length * frequency_divider / 10; | 72 | samplecount = ((int64_t) ci->id3->length) * current_frequency / 10; |
73 | } | 73 | } |
74 | |||
75 | samplecount -= start_skip + stop_skip; | ||
74 | } | 76 | } |
75 | 77 | ||
76 | /* this is the codec entry point */ | 78 | /* this is the codec entry point */ |
@@ -134,10 +136,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
134 | while (!*ci->taginfo_ready && !ci->stop_codec) | 136 | while (!*ci->taginfo_ready && !ci->stop_codec) |
135 | ci->sleep(1); | 137 | ci->sleep(1); |
136 | 138 | ||
137 | frequency_divider = ci->id3->frequency / 100; | ||
138 | if (frequency_divider <= 0) | ||
139 | frequency_divider = 441; | ||
140 | |||
141 | ci->configure(DSP_SET_FREQUENCY, (int *)ci->id3->frequency); | 139 | ci->configure(DSP_SET_FREQUENCY, (int *)ci->id3->frequency); |
142 | current_frequency = ci->id3->frequency; | 140 | current_frequency = ci->id3->frequency; |
143 | codec_set_replaygain(ci->id3); | 141 | codec_set_replaygain(ci->id3); |
@@ -155,7 +153,7 @@ enum codec_status codec_start(struct codec_api* api) | |||
155 | start_skip = mpeg_latency[ci->id3->layer]; | 153 | start_skip = mpeg_latency[ci->id3->layer]; |
156 | } | 154 | } |
157 | 155 | ||
158 | samplesdone = ci->id3->elapsed * frequency_divider / 10; | 156 | samplesdone = ((int64_t) ci->id3->elapsed) * current_frequency / 1000; |
159 | frame_skip = start_skip; | 157 | frame_skip = start_skip; |
160 | recalc_samplecount(); | 158 | recalc_samplecount(); |
161 | 159 | ||
@@ -171,7 +169,8 @@ enum codec_status codec_start(struct codec_api* api) | |||
171 | if (ci->seek_time) { | 169 | if (ci->seek_time) { |
172 | int newpos; | 170 | int newpos; |
173 | 171 | ||
174 | samplesdone = (ci->seek_time-1) * frequency_divider / 10; | 172 | samplesdone = ((int64_t) (ci->seek_time - 1)) |
173 | * current_frequency / 1000; | ||
175 | newpos = ci->mp3_get_filepos(ci->seek_time-1); | 174 | newpos = ci->mp3_get_filepos(ci->seek_time-1); |
176 | 175 | ||
177 | if (!ci->seek_buffer(newpos)) { | 176 | if (!ci->seek_buffer(newpos)) { |
@@ -235,7 +234,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
235 | 234 | ||
236 | if(Frame.header.samplerate != current_frequency) { | 235 | if(Frame.header.samplerate != current_frequency) { |
237 | current_frequency = Frame.header.samplerate; | 236 | current_frequency = Frame.header.samplerate; |
238 | frequency_divider = current_frequency / 100; | ||
239 | ci->configure(DSP_SWITCH_FREQUENCY, | 237 | ci->configure(DSP_SWITCH_FREQUENCY, |
240 | (int *)current_frequency); | 238 | (int *)current_frequency); |
241 | recalc_samplecount(); | 239 | recalc_samplecount(); |
@@ -243,10 +241,10 @@ enum codec_status codec_start(struct codec_api* api) | |||
243 | 241 | ||
244 | if (stop_skip > 0) | 242 | if (stop_skip > 0) |
245 | { | 243 | { |
246 | long max = samplecount - samplesdone; | 244 | int64_t max = samplecount - samplesdone; |
247 | 245 | ||
248 | if (max < 0) max = 0; | 246 | if (max < 0) max = 0; |
249 | if (max < framelength) framelength = max; | 247 | if (max < framelength) framelength = (int) max; |
250 | if (framelength == 0) break; | 248 | if (framelength == 0) break; |
251 | } | 249 | } |
252 | 250 | ||
@@ -275,7 +273,7 @@ enum codec_status codec_start(struct codec_api* api) | |||
275 | ci->advance_buffer(size); | 273 | ci->advance_buffer(size); |
276 | 274 | ||
277 | samplesdone += framelength; | 275 | samplesdone += framelength; |
278 | ci->set_elapsed(samplesdone / (frequency_divider / 10)); | 276 | ci->set_elapsed(samplesdone / (current_frequency / 1000)); |
279 | } | 277 | } |
280 | 278 | ||
281 | Stream.error = 0; | 279 | Stream.error = 0; |