summaryrefslogtreecommitdiff
path: root/apps
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 /apps
parent6e291fdcdffbccc4663fd90462a4f9fce107aed1 (diff)
downloadrockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.zip
rockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.tar.gz
rockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.tar.bz2
rockbox-8a7d104a359aec7776712cb366d1d92e0f0328a8.tar.xz
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
Diffstat (limited to 'apps')
-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 004d468..0093da6 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -247,6 +247,7 @@ struct codec_api ci = {
memchr,
NULL,
+ NULL,
};
int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap,
diff --git a/apps/codecs.h b/apps/codecs.h
index 3b8e1d8..4a4ccb2 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -79,7 +79,7 @@
#endif
/* increase this every time the api struct changes */
-#define CODEC_API_VERSION 40
+#define CODEC_API_VERSION 41
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
@@ -327,6 +327,8 @@ struct codec_api {
void *(*memchr)(const void *s1, int c, size_t n);
void (*set_offset)(unsigned int value);
+ /* Codec should call this function when it has done the seeking. */
+ void (*seek_complete)(void);
};
/* defined by the codec loader (codec.c) */
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index 8cc3398..8bfe376 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -177,7 +177,10 @@ enum codec_status codec_start(struct codec_api* api)
goto next_track;
}
ci->seek_time = 0;
- if (newpos == 0) frame_skip = start_skip;
+ if (newpos == 0)
+ frame_skip = start_skip;
+ /* Optional but good thing to do. */
+ ci->seek_complete();
}
/* Lock buffers */
diff --git a/apps/playback.c b/apps/playback.c
index e601233..b80c33f 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -539,7 +539,6 @@ static bool rebuffer_and_seek(int newpos)
ci.curpos = newpos;
cur_ti->available = 0;
lseek(current_fd, newpos, SEEK_SET);
- pcmbuf_flush_audio();
mutex_unlock(&mutex_bufferfill);
@@ -602,6 +601,11 @@ off_t codec_mp3_get_filepos_callback(int newtime)
return newpos;
}
+void codec_seek_complete_callback(void)
+{
+ pcmbuf_flush_audio();
+}
+
bool codec_seek_buffer_callback(off_t newpos)
{
int difference;
@@ -620,8 +624,6 @@ bool codec_seek_buffer_callback(off_t newpos)
if (difference >= 0) {
logf("seek: +%d", difference);
codec_advance_buffer_callback(difference);
- if (!pcmbuf_is_crossfade_active())
- pcmbuf_play_stop();
return true;
}
@@ -642,8 +644,6 @@ bool codec_seek_buffer_callback(off_t newpos)
if (buf_ridx < 0)
buf_ridx = filebuflen + buf_ridx;
ci.curpos -= difference;
- if (!pcmbuf_is_crossfade_active())
- pcmbuf_play_stop();
return true;
}
@@ -1939,8 +1939,8 @@ void audio_ff_rewind(int newpos)
{
logf("rewind: %d", newpos);
if (playing) {
- ci.seek_time = newpos+1;
pcmbuf_play_stop();
+ ci.seek_time = newpos+1;
paused = false;
}
}
@@ -2215,6 +2215,7 @@ void audio_init(void)
ci.request_next_track = codec_request_next_track_callback;
ci.mp3_get_filepos = codec_mp3_get_filepos_callback;
ci.seek_buffer = codec_seek_buffer_callback;
+ ci.seek_complete = codec_seek_complete_callback;
ci.set_elapsed = codec_set_elapsed_callback;
ci.set_offset = codec_set_offset_callback;
ci.configure = codec_configure_callback;