summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pennequin <nicolas.pennequin@free.fr>2007-10-27 18:08:18 +0000
committerNicolas Pennequin <nicolas.pennequin@free.fr>2007-10-27 18:08:18 +0000
commit1839edf64ad0a4b6d96a5dd5ce24ab8075954dc6 (patch)
tree6b31c67e9168ae2c47eba9f3205f69bdd1328d42
parent41add08c5edb9d3de7e223e860cef035b41a3b01 (diff)
downloadrockbox-1839edf64ad0a4b6d96a5dd5ce24ab8075954dc6.tar.gz
rockbox-1839edf64ad0a4b6d96a5dd5ce24ab8075954dc6.zip
Add queue_peek to the kernel (written by Mike Sevakis), and use it to improve upon my previous commit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15336 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/playback.c12
-rw-r--r--firmware/export/kernel.h1
-rw-r--r--firmware/kernel.c22
-rw-r--r--uisimulator/sdl/kernel.c20
4 files changed, 52 insertions, 3 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 2ac54e7d74..3c1dd37d3f 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -2569,6 +2569,7 @@ static void low_buffer_callback(void)
2569 2569
2570static void audio_fill_file_buffer(bool start_play, size_t offset) 2570static void audio_fill_file_buffer(bool start_play, size_t offset)
2571{ 2571{
2572 struct queue_event ev;
2572 bool had_next_track = audio_next_track() != NULL; 2573 bool had_next_track = audio_next_track() != NULL;
2573 bool continue_buffering; 2574 bool continue_buffering;
2574 2575
@@ -2591,9 +2592,14 @@ static void audio_fill_file_buffer(bool start_play, size_t offset)
2591 start_play = false; 2592 start_play = false;
2592 offset = 0; 2593 offset = 0;
2593 sleep(1); 2594 sleep(1);
2594 if (!queue_empty(&audio_queue)) { 2595 if (queue_peek(&audio_queue, &ev)) {
2595 /* There's a message in the queue. break the loop to treat it, 2596 if (ev.id != Q_AUDIO_FILL_BUFFER)
2596 and go back to filling after that. */ 2597 {
2598 /* There's a message in the queue. break the loop to treat it,
2599 and go back to filling after that. */
2600 LOGFQUEUE("buffering > audio Q_AUDIO_FILL_BUFFER");
2601 queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0);
2602 }
2597 break; 2603 break;
2598 } 2604 }
2599 } while (continue_buffering); 2605 } while (continue_buffering);
diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h
index a72e004b33..041f846380 100644
--- a/firmware/export/kernel.h
+++ b/firmware/export/kernel.h
@@ -219,6 +219,7 @@ extern void queue_reply(struct event_queue *q, intptr_t retval);
219extern bool queue_in_queue_send(struct event_queue *q); 219extern bool queue_in_queue_send(struct event_queue *q);
220#endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ 220#endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */
221extern bool queue_empty(const struct event_queue* q); 221extern bool queue_empty(const struct event_queue* q);
222extern bool queue_peek(struct event_queue *q, struct queue_event *ev);
222extern void queue_clear(struct event_queue* q); 223extern void queue_clear(struct event_queue* q);
223extern void queue_remove_from_head(struct event_queue *q, long id); 224extern void queue_remove_from_head(struct event_queue *q, long id);
224extern int queue_count(const struct event_queue *q); 225extern int queue_count(const struct event_queue *q);
diff --git a/firmware/kernel.c b/firmware/kernel.c
index 006a06dfe0..25249c6148 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -537,6 +537,28 @@ bool queue_empty(const struct event_queue* q)
537 return ( q->read == q->write ); 537 return ( q->read == q->write );
538} 538}
539 539
540bool queue_peek(struct event_queue *q, struct queue_event *ev)
541{
542 if (q->read == q->write)
543 return false;
544
545 bool have_msg = false;
546
547 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
548 corelock_lock(&q->cl);
549
550 if (q->read != q->write)
551 {
552 *ev = q->events[q->read & QUEUE_LENGTH_MASK];
553 have_msg = true;
554 }
555
556 corelock_unlock(&q->cl);
557 set_irq_level(oldlevel);
558
559 return have_msg;
560}
561
540void queue_clear(struct event_queue* q) 562void queue_clear(struct event_queue* q)
541{ 563{
542 int oldlevel; 564 int oldlevel;
diff --git a/uisimulator/sdl/kernel.c b/uisimulator/sdl/kernel.c
index 96654d50ac..220d069721 100644
--- a/uisimulator/sdl/kernel.c
+++ b/uisimulator/sdl/kernel.c
@@ -405,6 +405,26 @@ bool queue_empty(const struct event_queue* q)
405 return ( q->read == q->write ); 405 return ( q->read == q->write );
406} 406}
407 407
408bool queue_peek(struct event_queue *q, struct queue_event *ev)
409{
410 if (q->read == q->write)
411 return false;
412
413 bool have_msg = false;
414
415 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
416
417 if (q->read != q->write)
418 {
419 *ev = q->events[q->read & QUEUE_LENGTH_MASK];
420 have_msg = true;
421 }
422
423 set_irq_level(oldlevel);
424
425 return have_msg;
426}
427
408void queue_clear(struct event_queue* q) 428void queue_clear(struct event_queue* q)
409{ 429{
410 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); 430 int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);