diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2006-10-19 11:43:13 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2006-10-19 11:43:13 +0000 |
| commit | 4950b5583718bf4f995a3a0751bd400cfc155dca (patch) | |
| tree | 68e2ebfa93fa4ee8eb7274f44a76326e82c44bb1 | |
| parent | 74a102dde2d03aaca61f19ccfc688db8b4b87db7 (diff) | |
| download | rockbox-4950b5583718bf4f995a3a0751bd400cfc155dca.zip rockbox-4950b5583718bf4f995a3a0751bd400cfc155dca.tar.gz rockbox-4950b5583718bf4f995a3a0751bd400cfc155dca.tar.bz2 rockbox-4950b5583718bf4f995a3a0751bd400cfc155dca.tar.xz | |
Patch #6052 - More responsive skip on Archos
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11273 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | docs/CREDITS | 1 | ||||
| -rw-r--r-- | firmware/export/kernel.h | 1 | ||||
| -rw-r--r-- | firmware/kernel.c | 13 | ||||
| -rw-r--r-- | firmware/mpeg.c | 2 |
4 files changed, 17 insertions, 0 deletions
diff --git a/docs/CREDITS b/docs/CREDITS index 14dc1c4..e70dcab 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -242,3 +242,4 @@ Adam Gashlin Robert Kukla David Quesada Jared Stafford +Martin Hensel diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h index fcab2d9..32c052a 100644 --- a/firmware/export/kernel.h +++ b/firmware/export/kernel.h @@ -96,6 +96,7 @@ extern void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) extern void queue_post(struct event_queue *q, long id, void *data); extern bool queue_empty(const struct event_queue* q); void queue_clear(struct event_queue* q); +extern void queue_remove_from_head(struct event_queue *q, long id); extern int queue_broadcast(long id, void *data); extern void mutex_init(struct mutex *m); diff --git a/firmware/kernel.c b/firmware/kernel.c index 4a6d615..b18b923 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c @@ -184,6 +184,19 @@ void queue_clear(struct event_queue* q) set_irq_level(oldlevel); } +void queue_remove_from_head(struct event_queue *q, long id) +{ + int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); + + while (q->read != q->write && + q->events[(q->read) & QUEUE_LENGTH_MASK].id == id) + { + q->read++; + } + + set_irq_level(oldlevel); +} + int queue_broadcast(long id, void *data) { int i; diff --git a/firmware/mpeg.c b/firmware/mpeg.c index 9fe3df2..ce1d995 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -2760,6 +2760,7 @@ void audio_resume(void) void audio_next(void) { #ifndef SIMULATOR + queue_remove_from_head(&mpeg_queue, MPEG_NEED_DATA); queue_post(&mpeg_queue, MPEG_NEXT, NULL); #else /* SIMULATOR */ char* file; @@ -2788,6 +2789,7 @@ void audio_next(void) void audio_prev(void) { #ifndef SIMULATOR + queue_remove_from_head(&mpeg_queue, MPEG_NEED_DATA); queue_post(&mpeg_queue, MPEG_PREV, NULL); #else /* SIMULATOR */ char* file; |