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.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.c28
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
29struct mad_stream Stream IDATA_ATTR; 30struct mad_stream Stream IDATA_ATTR;
30struct mad_frame Frame IDATA_ATTR; 31struct mad_frame Frame IDATA_ATTR;
@@ -52,11 +53,10 @@ extern char iramend[];
52#endif 53#endif
53 54
54struct codec_api *ci; 55struct codec_api *ci;
55unsigned int samplecount; 56int64_t samplecount;
56unsigned int samplesdone; 57int64_t samplesdone;
57int stop_skip, start_skip; 58int stop_skip, start_skip;
58int current_stereo_mode = -1; 59int current_stereo_mode = -1;
59int frequency_divider;
60unsigned int current_frequency = 0; 60unsigned int current_frequency = 0;
61 61
62void recalc_samplecount(void) 62void 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;