diff options
Diffstat (limited to 'apps/codecs/spc.c')
-rw-r--r-- | apps/codecs/spc.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/apps/codecs/spc.c b/apps/codecs/spc.c index 33618f1c85..0a608dfa4a 100644 --- a/apps/codecs/spc.c +++ b/apps/codecs/spc.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * \/ \/ \/ \/ \/ | 7 | * \/ \/ \/ \/ \/ |
8 | * $Id$ | 8 | * $Id$ |
9 | * | 9 | * |
10 | * Copyright (C) 2007-2008 Michael Sevakis (jhMikeS) | ||
10 | * Copyright (C) 2006-2007 Adam Gashlin (hcs) | 11 | * Copyright (C) 2006-2007 Adam Gashlin (hcs) |
11 | * Copyright (C) 2004-2007 Shay Green (blargg) | 12 | * Copyright (C) 2004-2007 Shay Green (blargg) |
12 | * Copyright (C) 2002 Brad Martin | 13 | * Copyright (C) 2002 Brad Martin |
@@ -278,8 +279,12 @@ static intptr_t emu_thread_send_msg(long id, intptr_t data) | |||
278 | chunk->data = data; | 279 | chunk->data = data; |
279 | /* Release it to the emu thread */ | 280 | /* Release it to the emu thread */ |
280 | samples_release_rdbuf(); | 281 | samples_release_rdbuf(); |
281 | /* Wait for a response */ | 282 | |
282 | ci->event_wait(&sample_queue.emu_evt_reply, STATE_SIGNALED); | 283 | if (id != SPC_EMU_QUIT) { |
284 | /* Wait for a response */ | ||
285 | ci->event_wait(&sample_queue.emu_evt_reply, STATE_SIGNALED); | ||
286 | } | ||
287 | |||
283 | return sample_queue.retval; | 288 | return sample_queue.retval; |
284 | } | 289 | } |
285 | 290 | ||
@@ -298,16 +303,19 @@ static bool emu_thread_process_msg(struct sample_queue_chunk *chunk) | |||
298 | invalidate_icache(); | 303 | invalidate_icache(); |
299 | SPC_Init(&spc_emu); | 304 | SPC_Init(&spc_emu); |
300 | sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size); | 305 | sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size); |
306 | |||
307 | /* Empty the audio queue */ | ||
308 | /* This is a dirty hack a timeout based wait would make unnescessary but | ||
309 | still safe because the other thread is known to be waiting for a reply | ||
310 | and is not using the objects. */ | ||
311 | ci->semaphore_init(&sample_queue.emu_sem_tail, 2, 2); | ||
312 | ci->semaphore_init(&sample_queue.emu_sem_head, 2, 0); | ||
313 | sample_queue.head = sample_queue.tail = 0; | ||
301 | } | 314 | } |
302 | 315 | ||
303 | /* Empty the audio queue */ | 316 | if (id != SPC_EMU_QUIT) { |
304 | /* This is a dirty hack a timeout based wait would make unnescessary but | 317 | ci->event_set_state(&sample_queue.emu_evt_reply, STATE_SIGNALED); |
305 | still safe because the other thread is known to be waiting for a reply | 318 | } |
306 | and is not using the objects. */ | ||
307 | ci->semaphore_init(&sample_queue.emu_sem_tail, 2, 2); | ||
308 | ci->semaphore_init(&sample_queue.emu_sem_head, 2, 0); | ||
309 | sample_queue.head = sample_queue.tail = 0; | ||
310 | ci->event_set_state(&sample_queue.emu_evt_reply, STATE_SIGNALED); | ||
311 | 319 | ||
312 | return ret; | 320 | return ret; |
313 | } | 321 | } |
@@ -373,9 +381,12 @@ static inline int load_spc_buffer(uint8_t *buf, size_t size) | |||
373 | 381 | ||
374 | static inline void spc_emu_quit(void) | 382 | static inline void spc_emu_quit(void) |
375 | { | 383 | { |
376 | emu_thread_send_msg(SPC_EMU_QUIT, 0); | 384 | if (emu_thread_p != NULL) { |
377 | /* Wait for emu thread to be killed */ | 385 | emu_thread_send_msg(SPC_EMU_QUIT, 0); |
378 | ci->thread_wait(emu_thread_p); | 386 | /* Wait for emu thread to be killed */ |
387 | ci->thread_wait(emu_thread_p); | ||
388 | invalidate_icache(); | ||
389 | } | ||
379 | } | 390 | } |
380 | 391 | ||
381 | static inline bool spc_play_get_samples(int32_t **samples) | 392 | static inline bool spc_play_get_samples(int32_t **samples) |