From ba97447894fece196f282c1507600349f9be1b86 Mon Sep 17 00:00:00 2001 From: Michel Pollet Date: Sat, 28 Oct 2023 06:14:49 +0100 Subject: [PATCH] speaker: added a _dispose() call Free memory, turn off alsa Signed-off-by: Michel Pollet --- src/drivers/mii_mouse.c | 11 +++++++++++ src/drivers/mii_noslotclock.c | 5 +++++ src/drivers/mii_smartport.c | 17 ++++++++++++++++- src/mii_speaker.c | 14 ++++++++++++++ src/mii_speaker.h | 3 +++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/drivers/mii_mouse.c b/src/drivers/mii_mouse.c index 3fe518d..1a85f84 100644 --- a/src/drivers/mii_mouse.c +++ b/src/drivers/mii_mouse.c @@ -93,6 +93,16 @@ _mii_mouse_init( return 0; } +static void +_mii_mouse_dispose( + mii_t * mii, + struct mii_slot_t *slot ) +{ + mii_card_mouse_t *c = slot->drv_priv; + free(c); + slot->drv_priv = NULL; +} + static uint8_t _mii_mouse_access( mii_t * mii, @@ -182,6 +192,7 @@ static mii_slot_drv_t _driver = { .name = "mouse", .desc = "Mouse card", .init = _mii_mouse_init, + .dispose = _mii_mouse_dispose, .access = _mii_mouse_access, }; MI_DRIVER_REGISTER(_driver); diff --git a/src/drivers/mii_noslotclock.c b/src/drivers/mii_noslotclock.c index 64e0ee6..ca45ca2 100644 --- a/src/drivers/mii_noslotclock.c +++ b/src/drivers/mii_noslotclock.c @@ -104,6 +104,11 @@ _mii_nsc_access( uint8_t * byte, bool write) { + if (!bank) { + printf("%s: disposing of NSC\n", __func__); + free(param); + return false; + } mii_nsc_t * nsc = param; // printf("%s PC:%04x access %s addr %04x byte %02x write %d\n", // __func__, nsc->mii->cpu.PC, diff --git a/src/drivers/mii_smartport.c b/src/drivers/mii_smartport.c index 2c45081..cf96051 100644 --- a/src/drivers/mii_smartport.c +++ b/src/drivers/mii_smartport.c @@ -39,7 +39,6 @@ typedef struct mii_card_sm_t { struct mii_card_sm_t *next; mii_dd_t drive[MII_SM_DRIVE_COUNT]; struct mii_slot_t *slot; - uint8_t * file; } mii_card_sm_t; static void @@ -274,6 +273,21 @@ _mii_sm_init( return 0; } +static void +_mii_sm_dispose( + mii_t * mii, + struct mii_slot_t *slot ) +{ + mii_card_sm_t *c = slot->drv_priv; + for (int i = 0; i < MII_SM_DRIVE_COUNT; i++) { + free((char *)c->drive[i].name); + c->drive[i].name = NULL; + } + // files attached to drives are automatically freed. + free(c); + slot->drv_priv = NULL; +} + static int _mii_sm_command( mii_t * mii, @@ -336,6 +350,7 @@ static mii_slot_drv_t _driver = { .name = "smartport", .desc = "SmartPort card", .init = _mii_sm_init, + .dispose = _mii_sm_dispose, .access = _mii_sm_access, .command = _mii_sm_command, }; diff --git a/src/mii_speaker.c b/src/mii_speaker.c index d98833e..521b899 100644 --- a/src/mii_speaker.c +++ b/src/mii_speaker.c @@ -100,6 +100,20 @@ mii_speaker_init( s->frame[0].start = mii->cycles; } +void +mii_speaker_dispose( + mii_speaker_t *speaker) +{ +#ifdef HAS_ALSA + if (speaker->alsa_pcm) + snd_pcm_close(speaker->alsa_pcm); +#endif + for (int i = 0; i < MII_SPEAKER_FRAME_COUNT; i++) { + free(speaker->frame[i].audio); + speaker->frame[i].audio = NULL; + } +} + // Called when $c030 is touched, place a sample at the 'appropriate' time void mii_speaker_click( diff --git a/src/mii_speaker.h b/src/mii_speaker.h index 25b0ecc..a8b1b42 100644 --- a/src/mii_speaker.h +++ b/src/mii_speaker.h @@ -43,6 +43,9 @@ void mii_speaker_init( struct mii_t * mii, mii_speaker_t *speaker); +void +mii_speaker_dispose( + mii_speaker_t *speaker); // Called when $c030 is touched, place a sample at the 'appropriate' time void mii_speaker_click(