diff options
-rw-r--r-- | plugins/ao/eng_dsf/aica.c | 6 | ||||
-rw-r--r-- | plugins/ao/eng_dsf/aica.h | 1 | ||||
-rw-r--r-- | plugins/ao/eng_dsf/dc_hw.c | 4 | ||||
-rw-r--r-- | plugins/ao/eng_dsf/dc_hw.h | 1 | ||||
-rw-r--r-- | plugins/ao/eng_dsf/eng_dsf.c | 9 |
5 files changed, 21 insertions, 0 deletions
diff --git a/plugins/ao/eng_dsf/aica.c b/plugins/ao/eng_dsf/aica.c index 1878f45b..09855a04 100644 --- a/plugins/ao/eng_dsf/aica.c +++ b/plugins/ao/eng_dsf/aica.c @@ -1227,6 +1227,12 @@ void *aica_start(const void *config) void aica_stop(struct _AICA *AICA) { + if (AICA->buffertmpl) { + free (AICA->buffertmpl); + } + if (AICA->buffertmpr) { + free (AICA->buffertmpr); + } free(AICA); } diff --git a/plugins/ao/eng_dsf/aica.h b/plugins/ao/eng_dsf/aica.h index 5a1b52ca..f441064f 100644 --- a/plugins/ao/eng_dsf/aica.h +++ b/plugins/ao/eng_dsf/aica.h @@ -46,6 +46,7 @@ WRITE16_HANDLER( AICA_MidiIn ); READ16_HANDLER( AICA_MidiOutR ); void *aica_start(const void *config); +void aica_stop(struct _AICA *AICA); void AICA_Update(struct _AICA *AICA, void *param, INT16 **inputs, INT16 **buf, int samples); #endif diff --git a/plugins/ao/eng_dsf/dc_hw.c b/plugins/ao/eng_dsf/dc_hw.c index 6c810b37..769e128a 100644 --- a/plugins/ao/eng_dsf/dc_hw.c +++ b/plugins/ao/eng_dsf/dc_hw.c @@ -176,3 +176,7 @@ static struct AICAinterface aica_interface = cpu->AICA = aica_start(&cpu->aica_interface); } +void dc_hw_free (struct sARM7 *cpu) { + aica_stop (cpu->AICA); + cpu->AICA = NULL; +} diff --git a/plugins/ao/eng_dsf/dc_hw.h b/plugins/ao/eng_dsf/dc_hw.h index 3b467f25..33345efe 100644 --- a/plugins/ao/eng_dsf/dc_hw.h +++ b/plugins/ao/eng_dsf/dc_hw.h @@ -4,6 +4,7 @@ #include "arm7i.h" void dc_hw_init(struct sARM7 *cpu); +void dc_hw_free (struct sARM7 *cpu); void dc_write8(struct sARM7 *cpu, int addr, uint8 data); void dc_write16(struct sARM7 *cpu, int addr, uint16 data); void dc_write32(struct sARM7 *cpu, int addr, uint32 data); diff --git a/plugins/ao/eng_dsf/eng_dsf.c b/plugins/ao/eng_dsf/eng_dsf.c index 18109ba0..b58b6ed4 100644 --- a/plugins/ao/eng_dsf/eng_dsf.c +++ b/plugins/ao/eng_dsf/eng_dsf.c @@ -35,6 +35,7 @@ typedef struct { char psfby[256]; uint32 decaybegin, decayend, total_samples; struct sARM7 *cpu; + uint8 init_dc_ram[8*1024*1024]; } dsf_synth_t; void *dsf_start(const char *path, uint8 *buffer, uint32 length) @@ -138,6 +139,8 @@ void *dsf_start(const char *path, uint8 *buffer, uint32 length) } #endif + + memcpy (s->init_dc_ram, s->cpu->dc_ram, sizeof (s->init_dc_ram)); #if DK_CORE ARM7_Init(s->cpu); #else @@ -236,9 +239,15 @@ int32 dsf_stop(void *handle) int32 dsf_command(void *handle, int32 command, int32 parameter) { + dsf_synth_t *s = handle; switch (command) { case COMMAND_RESTART: + dc_hw_free (s->cpu); + memcpy (s->cpu->dc_ram, s->init_dc_ram, sizeof (s->init_dc_ram)); + ARM7_Init(s->cpu); + dc_hw_init (s->cpu); + s->total_samples = 0; return AO_SUCCESS; } |