diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-08-21 18:12:31 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-08-21 18:12:31 +0000 |
commit | 8a7d104a359aec7776712cb366d1d92e0f0328a8 (patch) | |
tree | 0e90f0cf6300cfa4cc14b258f379920626b50d1c | |
parent | 6e291fdcdffbccc4663fd90462a4f9fce107aed1 (diff) | |
download | rockbox-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.c | 1 | ||||
-rw-r--r-- | apps/codecs.h | 4 | ||||
-rw-r--r-- | apps/codecs/mpa.c | 5 | ||||
-rw-r--r-- | apps/playback.c | 13 |
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 | ||
252 | int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap, | 253 | int 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 | ||
604 | void codec_seek_complete_callback(void) | ||
605 | { | ||
606 | pcmbuf_flush_audio(); | ||
607 | } | ||
608 | |||
605 | bool codec_seek_buffer_callback(off_t newpos) | 609 | bool 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; |