summaryrefslogtreecommitdiff
path: root/apps/codecs/spc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/spc.c')
-rw-r--r--apps/codecs/spc.c37
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
374static inline void spc_emu_quit(void) 382static 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
381static inline bool spc_play_get_samples(int32_t **samples) 392static inline bool spc_play_get_samples(int32_t **samples)