diff options
-rw-r--r-- | apps/playback.c | 8 | ||||
-rw-r--r-- | firmware/kernel.c | 20 | ||||
-rw-r--r-- | firmware/pcm_record.c | 7 | ||||
-rw-r--r-- | uisimulator/sdl/kernel.c | 16 |
4 files changed, 36 insertions, 15 deletions
diff --git a/apps/playback.c b/apps/playback.c index 9bdcbac213..c58c5a6bf2 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -3598,8 +3598,6 @@ static void audio_thread(void) | |||
3598 | 3598 | ||
3599 | while (1) | 3599 | while (1) |
3600 | { | 3600 | { |
3601 | intptr_t result = 0; | ||
3602 | |||
3603 | if (filling) | 3601 | if (filling) |
3604 | { | 3602 | { |
3605 | queue_wait_w_tmo(&audio_queue, &ev, 0); | 3603 | queue_wait_w_tmo(&audio_queue, &ev, 0); |
@@ -3685,12 +3683,12 @@ static void audio_thread(void) | |||
3685 | 3683 | ||
3686 | case Q_AUDIO_REBUFFER_SEEK: | 3684 | case Q_AUDIO_REBUFFER_SEEK: |
3687 | LOGFQUEUE("audio < Q_AUDIO_REBUFFER_SEEK"); | 3685 | LOGFQUEUE("audio < Q_AUDIO_REBUFFER_SEEK"); |
3688 | result = audio_rebuffer_and_seek(ev.data); | 3686 | queue_reply(&audio_queue, audio_rebuffer_and_seek(ev.data)); |
3689 | break; | 3687 | break; |
3690 | 3688 | ||
3691 | case Q_AUDIO_CHECK_NEW_TRACK: | 3689 | case Q_AUDIO_CHECK_NEW_TRACK: |
3692 | LOGFQUEUE("audio < Q_AUDIO_CHECK_NEW_TRACK"); | 3690 | LOGFQUEUE("audio < Q_AUDIO_CHECK_NEW_TRACK"); |
3693 | result = audio_check_new_track(); | 3691 | queue_reply(&audio_queue, audio_check_new_track()); |
3694 | break; | 3692 | break; |
3695 | 3693 | ||
3696 | case Q_AUDIO_DIR_SKIP: | 3694 | case Q_AUDIO_DIR_SKIP: |
@@ -3729,8 +3727,6 @@ static void audio_thread(void) | |||
3729 | default: | 3727 | default: |
3730 | LOGFQUEUE("audio < default"); | 3728 | LOGFQUEUE("audio < default"); |
3731 | } /* end switch */ | 3729 | } /* end switch */ |
3732 | |||
3733 | queue_reply(&audio_queue, result); | ||
3734 | } /* end while */ | 3730 | } /* end while */ |
3735 | } | 3731 | } |
3736 | 3732 | ||
diff --git a/firmware/kernel.c b/firmware/kernel.c index 77b0c6ffef..03be6db624 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -38,8 +38,6 @@ void (*tick_funcs[MAX_NUM_TICK_TASKS])(void); | |||
38 | static struct event_queue *all_queues[32] NOCACHEBSS_ATTR; | 38 | static struct event_queue *all_queues[32] NOCACHEBSS_ATTR; |
39 | static int num_queues NOCACHEBSS_ATTR; | 39 | static int num_queues NOCACHEBSS_ATTR; |
40 | 40 | ||
41 | void queue_wait(struct event_queue *q, struct event *ev) ICODE_ATTR; | ||
42 | |||
43 | /**************************************************************************** | 41 | /**************************************************************************** |
44 | * Standard kernel stuff | 42 | * Standard kernel stuff |
45 | ****************************************************************************/ | 43 | ****************************************************************************/ |
@@ -234,7 +232,15 @@ void queue_wait(struct event_queue *q, struct event *ev) | |||
234 | int oldlevel; | 232 | int oldlevel; |
235 | unsigned int rd; | 233 | unsigned int rd; |
236 | 234 | ||
237 | oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); | 235 | oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
236 | |||
237 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME | ||
238 | if(q->send && q->send->curr_sender) | ||
239 | { | ||
240 | /* auto-reply */ | ||
241 | queue_release_sender(&q->send->curr_sender, 0); | ||
242 | } | ||
243 | #endif | ||
238 | 244 | ||
239 | if (q->read == q->write) | 245 | if (q->read == q->write) |
240 | { | 246 | { |
@@ -259,6 +265,14 @@ void queue_wait(struct event_queue *q, struct event *ev) | |||
259 | void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) | 265 | void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) |
260 | { | 266 | { |
261 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); | 267 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
268 | |||
269 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME | ||
270 | if (q->send && q->send->curr_sender) | ||
271 | { | ||
272 | /* auto-reply */ | ||
273 | queue_release_sender(&q->send->curr_sender, 0); | ||
274 | } | ||
275 | #endif | ||
262 | 276 | ||
263 | if (q->read == q->write && ticks > 0) | 277 | if (q->read == q->write && ticks > 0) |
264 | { | 278 | { |
diff --git a/firmware/pcm_record.c b/firmware/pcm_record.c index f3cb21e491..a5d0e51c30 100644 --- a/firmware/pcm_record.c +++ b/firmware/pcm_record.c | |||
@@ -1358,7 +1358,6 @@ static void pcmrec_stop(void) | |||
1358 | if (is_recording) | 1358 | if (is_recording) |
1359 | { | 1359 | { |
1360 | dma_lock = true; /* lock dma write position */ | 1360 | dma_lock = true; /* lock dma write position */ |
1361 | queue_reply(&pcmrec_queue, 0); | ||
1362 | 1361 | ||
1363 | /* flush all available data first to avoid overflow while waiting | 1362 | /* flush all available data first to avoid overflow while waiting |
1364 | for encoding to finish */ | 1363 | for encoding to finish */ |
@@ -1519,15 +1518,11 @@ static void pcmrec_thread(void) | |||
1519 | if (is_recording) | 1518 | if (is_recording) |
1520 | break; | 1519 | break; |
1521 | pcmrec_close(); | 1520 | pcmrec_close(); |
1522 | /* Be sure other threads are released if waiting */ | ||
1523 | queue_clear(&pcmrec_queue); | ||
1524 | flush_interrupts = 0; | ||
1525 | usb_acknowledge(SYS_USB_CONNECTED_ACK); | 1521 | usb_acknowledge(SYS_USB_CONNECTED_ACK); |
1526 | usb_wait_for_disconnect(&pcmrec_queue); | 1522 | usb_wait_for_disconnect(&pcmrec_queue); |
1523 | flush_interrupts = 0; | ||
1527 | break; | 1524 | break; |
1528 | } /* end switch */ | 1525 | } /* end switch */ |
1529 | |||
1530 | queue_reply(&pcmrec_queue, 0); | ||
1531 | } /* end while */ | 1526 | } /* end while */ |
1532 | } /* pcmrec_thread */ | 1527 | } /* pcmrec_thread */ |
1533 | 1528 | ||
diff --git a/uisimulator/sdl/kernel.c b/uisimulator/sdl/kernel.c index ff6c94933b..e2aa0d31c4 100644 --- a/uisimulator/sdl/kernel.c +++ b/uisimulator/sdl/kernel.c | |||
@@ -159,6 +159,14 @@ void queue_wait(struct event_queue *q, struct event *ev) | |||
159 | { | 159 | { |
160 | unsigned int rd; | 160 | unsigned int rd; |
161 | 161 | ||
162 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME | ||
163 | if (q->send && q->send->curr_sender) | ||
164 | { | ||
165 | /* auto-reply */ | ||
166 | queue_release_sender(&q->send->curr_sender, 0); | ||
167 | } | ||
168 | #endif | ||
169 | |||
162 | if (q->read == q->write) | 170 | if (q->read == q->write) |
163 | { | 171 | { |
164 | block_thread(&q->thread); | 172 | block_thread(&q->thread); |
@@ -178,6 +186,14 @@ void queue_wait(struct event_queue *q, struct event *ev) | |||
178 | 186 | ||
179 | void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) | 187 | void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) |
180 | { | 188 | { |
189 | #ifdef HAVE_EXTENDED_MESSAGING_AND_NAME | ||
190 | if (q->send && q->send->curr_sender) | ||
191 | { | ||
192 | /* auto-reply */ | ||
193 | queue_release_sender(&q->send->curr_sender, 0); | ||
194 | } | ||
195 | #endif | ||
196 | |||
181 | if (q->read == q->write && ticks > 0) | 197 | if (q->read == q->write && ticks > 0) |
182 | { | 198 | { |
183 | block_thread_w_tmo(&q->thread, ticks); | 199 | block_thread_w_tmo(&q->thread, ticks); |