# HG changeset patch # User Michael Pavone # Date 1700328989 28800 # Node ID 30e59954eab9838ccf5ebaf413a71e888d4230de # Parent 1c09f5be285b6bad3adc496e215130af86a37cc5 Properly free sound chips in VGM player diff -r 1c09f5be285b -r 30e59954eab9 mediaplayer.c --- a/mediaplayer.c Fri Nov 17 01:05:32 2023 -0800 +++ b/mediaplayer.c Sat Nov 18 09:36:29 2023 -0800 @@ -94,6 +94,13 @@ pcm->scope = NULL; } +void pcm_free(void *context) +{ + rf5c164 *pcm = context; + rf5c164_deinit(pcm); + free(pcm); +} + uint8_t *find_block(data_block *head, uint32_t offset, uint32_t size) { if (!head) { @@ -547,6 +554,7 @@ .adjust = ym_adjust, .scope = ym_scope, .no_scope = ym_no_scope, + .free = (chip_noarg_fun)ym_free, .clock = player->vgm->ym2612_clk, .samples = 0, .cmd = CMD_YM2612_0, @@ -562,6 +570,7 @@ .adjust = psg_adjust, .scope = psg_scope, .no_scope = ym_no_scope, + .free = (chip_noarg_fun)psg_free, .clock = player->vgm->sn76489_clk, .samples = 0, .cmd = CMD_PSG, @@ -577,6 +586,7 @@ .adjust = pcm_adjust, .scope = pcm_scope, .no_scope = pcm_no_scope, + .free = pcm_free, .clock = player->vgm_ext->rf5c68_clk, .samples = 0, .cmd = CMD_PCM68_REG, @@ -592,6 +602,7 @@ .adjust = pcm_adjust, .scope = pcm_scope, .no_scope = pcm_no_scope, + .free = pcm_free, .clock = player->vgm_ext->rf5c164_clk, .samples = 0, .cmd = CMD_PCM164_REG, @@ -719,8 +730,7 @@ media_player *player = (media_player *)system; for (uint32_t i = 0; i < player->num_chips; i++) { - //TODO properly free chips - free(player->chips[i].context); + player->chips[i].free(player->chips[i].context); } free(player->chips); free(player->vgm); diff -r 1c09f5be285b -r 30e59954eab9 mediaplayer.h --- a/mediaplayer.h Fri Nov 17 01:05:32 2023 -0800 +++ b/mediaplayer.h Sat Nov 18 09:36:29 2023 -0800 @@ -21,6 +21,7 @@ chip_adjust_fun adjust; chip_scope_fun scope; chip_noarg_fun no_scope; + chip_noarg_fun free; data_block *blocks; uint32_t clock; uint32_t samples;