summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-08-21 18:12:31 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-08-21 18:12:31 +0000
commit8a7d104a359aec7776712cb366d1d92e0f0328a8 (patch)
tree0e90f0cf6300cfa4cc14b258f379920626b50d1c
parent6e291fdcdffbccc4663fd90462a4f9fce107aed1 (diff)
downloadrockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.tar.gz
rockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.zip
Now codecs will do the buffer flushing after seeking as they find it
necessary. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7369 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs.c1
-rw-r--r--apps/codecs.h4
-rw-r--r--apps/codecs/mpa.c5
-rw-r--r--apps/playback.c13
4 files changed, 15 insertions, 8 deletions
diff --git a/apps/codecs.c b/apps/codecs.c
index 004d4681f7..0093da67c5 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -247,6 +247,7 @@ struct codec_api ci = {
247 247
248 memchr, 248 memchr,
249 NULL, 249 NULL,
250 NULL,
250}; 251};
251 252
252int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap, 253int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap,
diff --git a/apps/codecs.h b/apps/codecs.h
index 3b8e1d8394..4a4ccb229c 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -79,7 +79,7 @@
79#endif 79#endif
80 80
81/* increase this every time the api struct changes */ 81/* increase this every time the api struct changes */
82#define CODEC_API_VERSION 40 82#define CODEC_API_VERSION 41
83 83
84/* update this to latest version if a change to the api struct breaks 84/* update this to latest version if a change to the api struct breaks
85 backwards compatibility (and please take the opportunity to sort in any 85 backwards compatibility (and please take the opportunity to sort in any
@@ -327,6 +327,8 @@ struct codec_api {
327 327
328 void *(*memchr)(const void *s1, int c, size_t n); 328 void *(*memchr)(const void *s1, int c, size_t n);
329 void (*set_offset)(unsigned int value); 329 void (*set_offset)(unsigned int value);
330 /* Codec should call this function when it has done the seeking. */
331 void (*seek_complete)(void);
330}; 332};
331 333
332/* defined by the codec loader (codec.c) */ 334/* defined by the codec loader (codec.c) */
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index 8cc3398ca4..8bfe376818 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -177,7 +177,10 @@ enum codec_status codec_start(struct codec_api* api)
177 goto next_track; 177 goto next_track;
178 } 178 }
179 ci->seek_time = 0; 179 ci->seek_time = 0;
180 if (newpos == 0) frame_skip = start_skip; 180 if (newpos == 0)
181 frame_skip = start_skip;
182 /* Optional but good thing to do. */
183 ci->seek_complete();
181 } 184 }
182 185
183 /* Lock buffers */ 186 /* Lock buffers */
diff --git a/apps/playback.c b/apps/playback.c
index e601233636..b80c33f3c4 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -539,7 +539,6 @@ static bool rebuffer_and_seek(int newpos)
539 ci.curpos = newpos; 539 ci.curpos = newpos;
540 cur_ti->available = 0; 540 cur_ti->available = 0;
541 lseek(current_fd, newpos, SEEK_SET); 541 lseek(current_fd, newpos, SEEK_SET);
542 pcmbuf_flush_audio();
543 542
544 mutex_unlock(&mutex_bufferfill); 543 mutex_unlock(&mutex_bufferfill);
545 544
@@ -602,6 +601,11 @@ off_t codec_mp3_get_filepos_callback(int newtime)
602 return newpos; 601 return newpos;
603} 602}
604 603
604void codec_seek_complete_callback(void)
605{
606 pcmbuf_flush_audio();
607}
608
605bool codec_seek_buffer_callback(off_t newpos) 609bool codec_seek_buffer_callback(off_t newpos)
606{ 610{
607 int difference; 611 int difference;
@@ -620,8 +624,6 @@ bool codec_seek_buffer_callback(off_t newpos)
620 if (difference >= 0) { 624 if (difference >= 0) {
621 logf("seek: +%d", difference); 625 logf("seek: +%d", difference);
622 codec_advance_buffer_callback(difference); 626 codec_advance_buffer_callback(difference);
623 if (!pcmbuf_is_crossfade_active())
624 pcmbuf_play_stop();
625 return true; 627 return true;
626 } 628 }
627 629
@@ -642,8 +644,6 @@ bool codec_seek_buffer_callback(off_t newpos)
642 if (buf_ridx < 0) 644 if (buf_ridx < 0)
643 buf_ridx = filebuflen + buf_ridx; 645 buf_ridx = filebuflen + buf_ridx;
644 ci.curpos -= difference; 646 ci.curpos -= difference;
645 if (!pcmbuf_is_crossfade_active())
646 pcmbuf_play_stop();
647 647
648 return true; 648 return true;
649} 649}
@@ -1939,8 +1939,8 @@ void audio_ff_rewind(int newpos)
1939{ 1939{
1940 logf("rewind: %d", newpos); 1940 logf("rewind: %d", newpos);
1941 if (playing) { 1941 if (playing) {
1942 ci.seek_time = newpos+1;
1943 pcmbuf_play_stop(); 1942 pcmbuf_play_stop();
1943 ci.seek_time = newpos+1;
1944 paused = false; 1944 paused = false;
1945 } 1945 }
1946} 1946}
@@ -2215,6 +2215,7 @@ void audio_init(void)
2215 ci.request_next_track = codec_request_next_track_callback; 2215 ci.request_next_track = codec_request_next_track_callback;
2216 ci.mp3_get_filepos = codec_mp3_get_filepos_callback; 2216 ci.mp3_get_filepos = codec_mp3_get_filepos_callback;
2217 ci.seek_buffer = codec_seek_buffer_callback; 2217 ci.seek_buffer = codec_seek_buffer_callback;
2218 ci.seek_complete = codec_seek_complete_callback;
2218 ci.set_elapsed = codec_set_elapsed_callback; 2219 ci.set_elapsed = codec_set_elapsed_callback;
2219 ci.set_offset = codec_set_offset_callback; 2220 ci.set_offset = codec_set_offset_callback;
2220 ci.configure = codec_configure_callback; 2221 ci.configure = codec_configure_callback;