# HG changeset patch # User Michael Pavone # Date 1657642977 25200 # Node ID 4fbe1e7c4a737369ac27178430c9ab8fd55d4d3a # Parent 1270fe86eb893594bc1f33803728953af0d2e590 Don't leak all Sega CD resources when freeing a Genesis instance diff -r 1270fe86eb89 -r 4fbe1e7c4a73 cdd_fader.c --- a/cdd_fader.c Thu Jun 09 09:35:38 2022 -0700 +++ b/cdd_fader.c Tue Jul 12 09:22:57 2022 -0700 @@ -8,6 +8,12 @@ fader->dst_attenuation = 0x4000; fader->attenuation_step = 0; } + +void cdd_fader_deinit(cdd_fader *fader) +{ + render_free_source(fader->audio); +} + void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation) { fader->dst_attenuation = attenuation & 0xFFF0; diff -r 1270fe86eb89 -r 4fbe1e7c4a73 cdd_fader.h --- a/cdd_fader.h Thu Jun 09 09:35:38 2022 -0700 +++ b/cdd_fader.h Tue Jul 12 09:22:57 2022 -0700 @@ -14,6 +14,7 @@ } cdd_fader; void cdd_fader_init(cdd_fader *fader); +void cdd_fader_deinit(cdd_fader *fader); void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation); void cdd_fader_data(cdd_fader *fader, uint8_t byte); void cdd_fader_pause(cdd_fader *fader); diff -r 1270fe86eb89 -r 4fbe1e7c4a73 genesis.c --- a/genesis.c Thu Jun 09 09:35:38 2022 -0700 +++ b/genesis.c Tue Jul 12 09:22:57 2022 -0700 @@ -1549,6 +1549,9 @@ static void free_genesis(system_header *system) { genesis_context *gen = (genesis_context *)system; + if (gen->expansion) { + free_segacd(gen->expansion); + } vdp_free(gen->vdp); memmap_chunk *map = (memmap_chunk *)gen->m68k->options->gen.memmap; m68k_options_free(gen->m68k->options); diff -r 1270fe86eb89 -r 4fbe1e7c4a73 rf5c164.c --- a/rf5c164.c Thu Jun 09 09:35:38 2022 -0700 +++ b/rf5c164.c Tue Jul 12 09:22:57 2022 -0700 @@ -28,6 +28,11 @@ pcm->clock_step = divider * 4; } +void rf5c164_deinit(rf5c164* pcm) +{ + render_free_source(pcm->audio); +} + //48 cycles per channel //1 external write per 16 cycles //3 external writes per channel/sample diff -r 1270fe86eb89 -r 4fbe1e7c4a73 rf5c164.h --- a/rf5c164.h Thu Jun 09 09:35:38 2022 -0700 +++ b/rf5c164.h Tue Jul 12 09:22:57 2022 -0700 @@ -29,6 +29,7 @@ } rf5c164; void rf5c164_init(rf5c164* pcm, uint32_t mclks, uint32_t divider); +void rf5c164_deinit(rf5c164* pcm); void rf5c164_run(rf5c164* pcm, uint32_t cycle); void rf5c164_write(rf5c164* pcm, uint16_t address, uint8_t value); uint8_t rf5c164_read(rf5c164* pcm, uint16_t address); diff -r 1270fe86eb89 -r 4fbe1e7c4a73 segacd.c --- a/segacd.c Thu Jun 09 09:35:38 2022 -0700 +++ b/segacd.c Tue Jul 12 09:22:57 2022 -0700 @@ -1490,6 +1490,19 @@ return cd; } +void free_segacd(segacd_context *cd) +{ + cdd_fader_deinit(&cd->fader); + rf5c164_deinit(&cd->pcm); + m68k_options_free(cd->m68k->options); + free(cd->m68k); + free(cd->bram); + free(cd->pcm_ram); + free(cd->word_ram); + free(cd->prog_ram); + free(cd->rom_mut); +} + memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) { static memmap_chunk main_cpu_map[] = { diff -r 1270fe86eb89 -r 4fbe1e7c4a73 segacd.h --- a/segacd.h Thu Jun 09 09:35:38 2022 -0700 +++ b/segacd.h Tue Jul 12 09:22:57 2022 -0700 @@ -52,6 +52,7 @@ } segacd_context; segacd_context *alloc_configure_segacd(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info); +void free_segacd(segacd_context *cd); memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks); uint32_t gen_cycle_to_scd(uint32_t cycle, genesis_context *gen); void scd_run(segacd_context *cd, uint32_t cycle);