summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/disk_buf.h
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-16 14:41:00 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-16 14:41:00 +0000
commitb197c3b0d6bfcf3daae4a7b1cad415b1acea28f6 (patch)
tree1c7bce8c4bc39617ff819111d39a41370ca8f49b /apps/plugins/mpegplayer/disk_buf.h
parentcaa4f54e4235f99acd1c69673c85a4557b6183a9 (diff)
downloadrockbox-b197c3b0d6bfcf3daae4a7b1cad415b1acea28f6.zip
rockbox-b197c3b0d6bfcf3daae4a7b1cad415b1acea28f6.tar.gz
rockbox-b197c3b0d6bfcf3daae4a7b1cad415b1acea28f6.tar.bz2
rockbox-b197c3b0d6bfcf3daae4a7b1cad415b1acea28f6.tar.xz
MPEGPlayer: Add a second layer of caching to help speed up byte-wise scanning and seeking a bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26088 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/mpegplayer/disk_buf.h')
-rw-r--r--apps/plugins/mpegplayer/disk_buf.h42
1 files changed, 23 insertions, 19 deletions
diff --git a/apps/plugins/mpegplayer/disk_buf.h b/apps/plugins/mpegplayer/disk_buf.h
index e16939a..a5a10cf 100644
--- a/apps/plugins/mpegplayer/disk_buf.h
+++ b/apps/plugins/mpegplayer/disk_buf.h
@@ -23,6 +23,10 @@
#ifndef DISK_BUF_H
#define DISK_BUF_H
+#ifndef OFF_T_MAX
+#define OFF_T_MAX (~(off_t)1 << (sizeof (off_t)*8 - 1))
+#endif
+
#define DISK_BUF_PAGE_SHIFT 15 /* 32KB cache lines */
#define DISK_BUF_PAGE_SIZE (1 << DISK_BUF_PAGE_SHIFT)
#define DISK_BUF_PAGE_MASK (DISK_BUF_PAGE_SIZE-1)
@@ -58,6 +62,19 @@ struct dbuf_range
int pg_start;
};
+#define DISK_BUF_L2_CACHE_SHIFT 6
+#define DISK_BUF_L2_CACHE_SIZE (1 << DISK_BUF_L2_CACHE_SHIFT)
+#define DISK_BUF_L2_CACHE_MASK (DISK_BUF_L2_CACHE_SIZE-1)
+
+struct dbuf_l2_cache
+{
+ off_t addr; /* L2 file offset */
+ size_t size; /* Real size */
+ uint8_t data[DISK_BUF_L2_CACHE_SIZE*2]; /* Local data and guard */
+};
+
+void dbuf_l2_init(struct dbuf_l2_cache *l2_p);
+
/* This object is an extension of the stream manager and handles some
* playback events as well as buffering */
struct disk_buf
@@ -88,20 +105,8 @@ struct disk_buf
extern struct disk_buf disk_buf SHAREDBSS_ATTR;
-static inline bool disk_buf_is_data_ready(struct stream_hdr *sh,
- ssize_t margin)
-{
- /* Data window available? */
- off_t right = sh->win_right;
-
- /* Margins past end-of-file can still return true */
- if (right > disk_buf.filesize - margin)
- right = disk_buf.filesize - margin;
-
- return sh->win_left >= disk_buf.win_left &&
- right + margin <= disk_buf.win_right;
-}
-
+struct stream_hdr;
+bool disk_buf_is_data_ready(struct stream_hdr *sh, ssize_t margin);
bool disk_buf_init(void);
void disk_buf_exit(void);
@@ -111,11 +116,10 @@ static inline int disk_buf_status(void)
int disk_buf_open(const char *filename);
void disk_buf_close(void);
-ssize_t _disk_buf_getbuffer(size_t size, void **pp, void **pwrap,
- size_t *sizewrap);
-#define disk_buf_getbuffer(size, pp, pwrap, sizewrap) \
- _disk_buf_getbuffer((size), PUN_PTR(void **, (pp)), \
- PUN_PTR(void **, (pwrap)), (sizewrap))
+ssize_t disk_buf_getbuffer(size_t size, void **pp, void **pwrap,
+ size_t *sizewrap);
+ssize_t disk_buf_getbuffer_l2(struct dbuf_l2_cache *l2,
+ size_t size, void **pp);
ssize_t disk_buf_read(void *buffer, size_t size);
ssize_t disk_buf_lseek(off_t offset, int whence);