summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/spc.c37
-rw-r--r--apps/codecs/spc/spc_codec.h1
-rw-r--r--apps/codecs/spc/spc_dsp.c3
-rw-r--r--apps/codecs/spc/spc_emu.c6
4 files changed, 32 insertions, 15 deletions
diff --git a/apps/codecs/spc.c b/apps/codecs/spc.c
index 33618f1..0a608df 100644
--- a/apps/codecs/spc.c
+++ b/apps/codecs/spc.c
@@ -7,6 +7,7 @@
* \/ \/ \/ \/ \/
* $Id$
*
+ * Copyright (C) 2007-2008 Michael Sevakis (jhMikeS)
* Copyright (C) 2006-2007 Adam Gashlin (hcs)
* Copyright (C) 2004-2007 Shay Green (blargg)
* Copyright (C) 2002 Brad Martin
@@ -278,8 +279,12 @@ static intptr_t emu_thread_send_msg(long id, intptr_t data)
chunk->data = data;
/* Release it to the emu thread */
samples_release_rdbuf();
- /* Wait for a response */
- ci->event_wait(&sample_queue.emu_evt_reply, STATE_SIGNALED);
+
+ if (id != SPC_EMU_QUIT) {
+ /* Wait for a response */
+ ci->event_wait(&sample_queue.emu_evt_reply, STATE_SIGNALED);
+ }
+
return sample_queue.retval;
}
@@ -298,16 +303,19 @@ static bool emu_thread_process_msg(struct sample_queue_chunk *chunk)
invalidate_icache();
SPC_Init(&spc_emu);
sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size);
+
+ /* Empty the audio queue */
+ /* This is a dirty hack a timeout based wait would make unnescessary but
+ still safe because the other thread is known to be waiting for a reply
+ and is not using the objects. */
+ ci->semaphore_init(&sample_queue.emu_sem_tail, 2, 2);
+ ci->semaphore_init(&sample_queue.emu_sem_head, 2, 0);
+ sample_queue.head = sample_queue.tail = 0;
}
- /* Empty the audio queue */
- /* This is a dirty hack a timeout based wait would make unnescessary but
- still safe because the other thread is known to be waiting for a reply
- and is not using the objects. */
- ci->semaphore_init(&sample_queue.emu_sem_tail, 2, 2);
- ci->semaphore_init(&sample_queue.emu_sem_head, 2, 0);
- sample_queue.head = sample_queue.tail = 0;
- ci->event_set_state(&sample_queue.emu_evt_reply, STATE_SIGNALED);
+ if (id != SPC_EMU_QUIT) {
+ ci->event_set_state(&sample_queue.emu_evt_reply, STATE_SIGNALED);
+ }
return ret;
}
@@ -373,9 +381,12 @@ static inline int load_spc_buffer(uint8_t *buf, size_t size)
static inline void spc_emu_quit(void)
{
- emu_thread_send_msg(SPC_EMU_QUIT, 0);
- /* Wait for emu thread to be killed */
- ci->thread_wait(emu_thread_p);
+ if (emu_thread_p != NULL) {
+ emu_thread_send_msg(SPC_EMU_QUIT, 0);
+ /* Wait for emu thread to be killed */
+ ci->thread_wait(emu_thread_p);
+ invalidate_icache();
+ }
}
static inline bool spc_play_get_samples(int32_t **samples)
diff --git a/apps/codecs/spc/spc_codec.h b/apps/codecs/spc/spc_codec.h
index 013f536..a18aece 100644
--- a/apps/codecs/spc/spc_codec.h
+++ b/apps/codecs/spc/spc_codec.h
@@ -7,6 +7,7 @@
* \/ \/ \/ \/ \/
* $Id$
*
+ * Copyright (C) 2007-2008 Michael Sevakis (jhMikeS)
* Copyright (C) 2006-2007 Adam Gashlin (hcs)
* Copyright (C) 2004-2007 Shay Green (blargg)
* Copyright (C) 2002 Brad Martin
diff --git a/apps/codecs/spc/spc_dsp.c b/apps/codecs/spc/spc_dsp.c
index 19986fd..dda80e9 100644
--- a/apps/codecs/spc/spc_dsp.c
+++ b/apps/codecs/spc/spc_dsp.c
@@ -7,6 +7,7 @@
* \/ \/ \/ \/ \/
* $Id$
*
+ * Copyright (C) 2007-2008 Michael Sevakis (jhMikeS)
* Copyright (C) 2006-2007 Adam Gashlin (hcs)
* Copyright (C) 2004-2007 Shay Green (blargg)
* Copyright (C) 2002 Brad Martin
@@ -31,7 +32,7 @@ int32_t fir_buf[FIR_BUF_CNT]
#endif
#if SPC_BRRCACHE
/* a little extra for samples that go past end */
-int16_t BRRcache [BRR_CACHE_SIZE];
+int16_t BRRcache [BRR_CACHE_SIZE] CACHEALIGN_ATTR;
#endif
void DSP_write( struct Spc_Dsp* this, int i, int data )
diff --git a/apps/codecs/spc/spc_emu.c b/apps/codecs/spc/spc_emu.c
index 30aaf5d..bd9c005 100644
--- a/apps/codecs/spc/spc_emu.c
+++ b/apps/codecs/spc/spc_emu.c
@@ -27,7 +27,7 @@
/* DSP Based on Brad Martin's OpenSPC DSP emulator */
/* tag reading from sexyspc by John Brawn (John_Brawn@yahoo.com) and others */
-struct cpu_ram_t ram;
+struct cpu_ram_t ram CACHEALIGN_ATTR;
/**************** Timers ****************/
@@ -76,6 +76,10 @@ void SPC_Init( THIS )
this->boot_rom [sizeof this->boot_rom - 2] = 0xC0;
this->boot_rom [sizeof this->boot_rom - 1] = 0xFF;
ci->memset( this->boot_rom, 0, sizeof this->boot_rom - 2 );
+
+ /* Have DSP in a defined state in case EMU is run and hasn't loaded
+ * a program yet */
+ DSP_reset(&this->dsp);
}
static void SPC_load_state( THIS, struct cpu_regs_t const* cpu_state,