diff options
-rw-r--r-- | apps/playback.c | 12 | ||||
-rw-r--r-- | firmware/export/kernel.h | 1 | ||||
-rw-r--r-- | firmware/kernel.c | 22 | ||||
-rw-r--r-- | uisimulator/sdl/kernel.c | 20 |
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 | ||
2570 | static void audio_fill_file_buffer(bool start_play, size_t offset) | 2570 | static 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); | |||
219 | extern bool queue_in_queue_send(struct event_queue *q); | 219 | extern bool queue_in_queue_send(struct event_queue *q); |
220 | #endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ | 220 | #endif /* HAVE_EXTENDED_MESSAGING_AND_NAME */ |
221 | extern bool queue_empty(const struct event_queue* q); | 221 | extern bool queue_empty(const struct event_queue* q); |
222 | extern bool queue_peek(struct event_queue *q, struct queue_event *ev); | ||
222 | extern void queue_clear(struct event_queue* q); | 223 | extern void queue_clear(struct event_queue* q); |
223 | extern void queue_remove_from_head(struct event_queue *q, long id); | 224 | extern void queue_remove_from_head(struct event_queue *q, long id); |
224 | extern int queue_count(const struct event_queue *q); | 225 | extern 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 | ||
540 | bool 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 | |||
540 | void queue_clear(struct event_queue* q) | 562 | void 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 | ||
408 | bool 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 | |||
408 | void queue_clear(struct event_queue* q) | 428 | void 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); |