Mercurial > hg > xmms-sid
changeset 957:0e60e5d56fdd
Change how the backend emulator library is initialized for libSIDPlay2 and
FP, as it seems the engine configuration has some persistence despite
reconfiguration between loaded files if same engine object is retained. This
caused, for example, 2SID stereo tunes being played "mono" if played after a
normal 1-SID tune. Duh.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 20 Nov 2012 22:13:48 +0200 |
parents | fbcd069663e5 |
children | 828dce1195e6 |
files | src/xs_sidplay2.cpp src/xs_sidplayfp.cpp |
diffstat | 2 files changed, 180 insertions(+), 216 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xs_sidplay2.cpp Tue Nov 20 21:29:51 2012 +0200 +++ b/src/xs_sidplay2.cpp Tue Nov 20 22:13:48 2012 +0200 @@ -101,11 +101,76 @@ */ gboolean xs_sidplay2_init(XSEngineState * state) { + + + return TRUE; +} + + +/* Close SIDPlay2 engine + */ +void xs_sidplay2_close(XSEngineState * state) +{ + XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; + + XSDEBUG("SIDPlay2 backend shutdown.\n"); + + xs_sidplay2_delete(state); +} + + +/* Initialize current song and sub-tune + */ +gboolean xs_sidplay2_initsong(XSEngineState * state) +{ + XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; + + if (!engine) + return FALSE; + + if (!engine->tune.selectSong(state->currSong)) + { + xs_error("[SIDPlay2] tune.selectSong() failed\n"); + return FALSE; + } + + if (engine->emu.load(&(engine->tune)) < 0) + { + xs_error("[SIDPlay2] emu.load() failed\n"); + return FALSE; + } + + if (engine->emu.config(engine->config) < 0) + { + xs_error("[SIDPlay2] Emulator engine configuration failed!\n"); + return FALSE; + } + + return TRUE; +} + + +/* Emulate and render audio data to given buffer + */ +guint xs_sidplay2_fillbuffer(XSEngineState * state, gchar * audioBuffer, guint audioBufSize) +{ + XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; + + if (!engine) + return 0; + + return engine->emu.play(audioBuffer, audioBufSize); +} + + +/* Load a given SID-tune file + */ +gboolean xs_sidplay2_load(XSEngineState * state, gchar * filename) +{ XSSIDPlay2 *engine; - sid_filter_t tmpFilter; - xs_sid_filter_t *f; + guint8 *buf = NULL; + size_t bufSize; gint i; - assert(state); XSDEBUG("SIDPlay2 backend initializing.\n"); @@ -113,7 +178,10 @@ engine = new XSSIDPlay2(); state->internal = engine; if (!engine) - return FALSE; + { + xs_error("Allocating XSSIDPlay2 compound backend object failed.\n"); + goto error; + } /* Get current configuration */ XSDEBUG("SIDPlay2 emulation configuration\n"); @@ -205,23 +273,6 @@ break; } - /* Convert filter */ - f = &(xs_cfg.sid2Filter); - XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints); - if (f->npoints > XS_SIDPLAY2_NFPOINTS) - { - xs_error("[SIDPlay2] Invalid number of filter curve points (%d > %d)\n", - f->npoints, XS_SIDPLAY2_NFPOINTS); - f->npoints = XS_SIDPLAY2_NFPOINTS; - } - - tmpFilter.points = f->npoints; - for (i = 0; i < f->npoints; i++) - { - tmpFilter.cutoff[i][0] = f->points[i].x; - tmpFilter.cutoff[i][1] = f->points[i].y; - } - /* Clockspeed settings */ switch (xs_cfg.clockSpeed) { @@ -313,99 +364,9 @@ return FALSE; } -#if 0 - // Setup filter - engine->config.sidEmulation->filter(xs_cfg.emulateFilters); - if (!*(engine->config.sidEmulation)) - { - xs_error("builder->filter(%d) failed.\n", xs_cfg.emulateFilters); - return FALSE; - } -#endif - XSDEBUG("%s\n", engine->config.sidEmulation->credits()); - return TRUE; -} - - -/* Close SIDPlay2 engine - */ -void xs_sidplay2_close(XSEngineState * state) -{ - XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; - - XSDEBUG("SIDPlay2 backend shutdown.\n"); - - xs_sidplay2_delete(state); - - if (engine) - { - delete engine; - engine = NULL; - } - - state->internal = NULL; -} - - -/* Initialize current song and sub-tune - */ -gboolean xs_sidplay2_initsong(XSEngineState * state) -{ - XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; - - if (!engine) - return FALSE; - - if (!engine->tune.selectSong(state->currSong)) - { - xs_error("[SIDPlay2] tune.selectSong() failed\n"); - return FALSE; - } - - if (engine->emu.load(&(engine->tune)) < 0) - { - xs_error("[SIDPlay2] emu.load() failed\n"); - return FALSE; - } - - if (engine->emu.config(engine->config) < 0) - { - xs_error("[SIDPlay2] Emulator engine configuration failed!\n"); - return FALSE; - } - - return TRUE; -} - - -/* Emulate and render audio data to given buffer - */ -guint xs_sidplay2_fillbuffer(XSEngineState * state, gchar * audioBuffer, guint audioBufSize) -{ - XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; - - if (!engine) - return 0; - - return engine->emu.play(audioBuffer, audioBufSize); -} - - -/* Load a given SID-tune file - */ -gboolean xs_sidplay2_load(XSEngineState * state, gchar * filename) -{ - XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; - gboolean res = FALSE; - guint8 *buf = NULL; - size_t bufSize; - - if (!engine) - return FALSE; - if (!xs_fload_buffer(filename, &buf, &bufSize, XS_SIDBUF_SIZE, TRUE)) goto error; @@ -429,8 +390,11 @@ */ void xs_sidplay2_delete(XSEngineState * state) { - (void) state; -// XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; + XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; + + if (engine) + delete engine; + state->internal = NULL; }
--- a/src/xs_sidplayfp.cpp Tue Nov 20 21:29:51 2012 +0200 +++ b/src/xs_sidplayfp.cpp Tue Nov 20 22:13:48 2012 +0200 @@ -47,7 +47,6 @@ #ifdef HAVE_SIDPLAYFP_V1 sidplayfp emu; SidConfig config; - guint8 *romImages[XS_C64_ROM_IMAGES]; #else sidplay2 emu; sid2_config_t config; @@ -58,6 +57,7 @@ virtual ~XSSIDPlayFP(void); }; +static guint8 *xs_rom_imagedata[XS_C64_ROM_IMAGES]; #ifdef HAVE_RESID_FP_BUILDER # include <sidplayfp/builders/residfp.h> @@ -138,16 +138,90 @@ */ gboolean xs_sidplayfp_init(XSEngineState * state) { - XSSIDPlayFP *engine; assert(state); XSDEBUG("SIDPlayFP backend initializing.\n"); + memset(xs_rom_imagedata, 0, sizeof(xs_rom_imagedata)); + if (!xs_load_rom_images(xs_rom_imagedata)) + return FALSE; + + return TRUE; +} + + +/* Close SIDPlayFP engine + */ +void xs_sidplayfp_close(XSEngineState * state) +{ + XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; + + XSDEBUG("SIDPlayFP backend shutdown.\n"); + + xs_sidplayfp_delete(state); +} + + +/* Initialize current song and sub-tune + */ +gboolean xs_sidplayfp_initsong(XSEngineState * state) +{ + XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; + + if (!engine) + return FALSE; + + if (!engine->tune.selectSong(state->currSong)) + { + xs_error("[SIDPlayFP] tune.selectSong() failed\n"); + return FALSE; + } + + if (engine->emu.load(&(engine->tune)) < 0) + { + xs_error("[SIDPlayFP] emu.load() failed\n"); + return FALSE; + } + + if (engine->emu.config(engine->config) < 0) + { + xs_error("[SIDPlayFP] Emulator engine configuration failed!\n"); + return FALSE; + } + + return TRUE; +} + + +/* Emulate and render audio data to given buffer + */ +guint xs_sidplayfp_fillbuffer(XSEngineState * state, gchar * audioBuffer, guint audioBufSize) +{ + XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; + + if (!engine) + return 0; + + return engine->emu.play((short *) audioBuffer, audioBufSize / sizeof(short)) * sizeof(short); +} + + +/* Load a given SID-tune file + */ +gboolean xs_sidplayfp_load(XSEngineState * state, gchar * filename) +{ + XSSIDPlayFP *engine; + guint8 *buf = NULL; + size_t bufSize; + /* Allocate internal structures */ engine = new XSSIDPlayFP(); state->internal = engine; if (!engine) - return FALSE; + { + xs_error("Allocating XSSIDPlayFP compound backend object failed.\n"); + goto error; + } /* Get current configuration */ XSDEBUG("SIDPlayFP emulation configuration\n"); @@ -215,17 +289,17 @@ if (rs && rs->getStatus()) { engine->config.sidEmulation = rs; - if (!rs->getStatus()) return FALSE; + if (!rs->getStatus()) goto error; rs->create((engine->emu.info()).maxsids()); - if (!rs->getStatus()) return FALSE; + if (!rs->getStatus()) goto error; } #else if (rs && *rs) { engine->config.sidEmulation = rs; - if (!*rs) return FALSE; + if (!*rs) goto error; rs->create((engine->emu.info()).maxsids); - if (!*rs) return FALSE; + if (!*rs) goto error; } #endif rs->bias(0.0f); @@ -242,17 +316,17 @@ if (rs && rs->getStatus()) { engine->config.sidEmulation = rs; - if (!rs->getStatus()) return FALSE; + if (!rs->getStatus()) goto error; rs->create((engine->emu.info()).maxsids()); - if (!rs->getStatus()) return FALSE; + if (!rs->getStatus()) goto error; } #else if (rs && *rs) { engine->config.sidEmulation = rs; - if (!*rs) return FALSE; + if (!*rs) goto error; rs->create((engine->emu.info()).maxsids); - if (!*rs) return FALSE; + if (!*rs) goto error; } #endif // rs->filter6581Curve(0.0); @@ -270,13 +344,13 @@ if (hs && hs->getStatus()) { hs->create((engine->emu.info()).maxsids()); - if (!hs->getStatus()) return FALSE; + if (!hs->getStatus()) goto error; } #else if (hs && *hs) { hs->create((engine->emu.info()).maxsids); - if (!*hs) return FALSE; + if (!*hs) goto error; } #endif } @@ -285,13 +359,14 @@ default: xs_error("[SIDPlayFP] Invalid or unsupported builder selected.\n"); - return FALSE; + goto error; } + if (!engine->config.sidEmulation) { xs_error("[SIDPlayFP] Could not initialize SIDBuilder object.\n"); - return FALSE; + goto error; } // Setup filter @@ -303,98 +378,16 @@ #endif { xs_error("builder->filter(%d) failed.\n", xs_cfg.emulateFilters); - return FALSE; + goto error; } XSDEBUG("%s\n", engine->config.sidEmulation->credits()); #ifdef HAVE_SIDPLAYFP_V1 - memset(engine->romImages, 0, sizeof(engine->romImages)); - if (!xs_load_rom_images(engine->romImages)) - return FALSE; - - engine->emu.setRoms(engine->romImages[0], engine->romImages[1], engine->romImages[2]); + engine->emu.setRoms(xs_rom_imagedata[0], xs_rom_imagedata[1], xs_rom_imagedata[2]); #endif - - return TRUE; -} - - -/* Close SIDPlayFP engine - */ -void xs_sidplayfp_close(XSEngineState * state) -{ - XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; - - XSDEBUG("SIDPlayFP backend shutdown.\n"); - - xs_sidplayfp_delete(state); - - if (engine) - { - delete engine; - engine = NULL; - } - - state->internal = NULL; -} -/* Initialize current song and sub-tune - */ -gboolean xs_sidplayfp_initsong(XSEngineState * state) -{ - XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; - - if (!engine) - return FALSE; - - if (!engine->tune.selectSong(state->currSong)) - { - xs_error("[SIDPlayFP] tune.selectSong() failed\n"); - return FALSE; - } - - if (engine->emu.load(&(engine->tune)) < 0) - { - xs_error("[SIDPlayFP] emu.load() failed\n"); - return FALSE; - } - - if (engine->emu.config(engine->config) < 0) - { - xs_error("[SIDPlayFP] Emulator engine configuration failed!\n"); - return FALSE; - } - - return TRUE; -} - - -/* Emulate and render audio data to given buffer - */ -guint xs_sidplayfp_fillbuffer(XSEngineState * state, gchar * audioBuffer, guint audioBufSize) -{ - XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; - - if (!engine) - return 0; - - return engine->emu.play((short *) audioBuffer, audioBufSize / sizeof(short)) * sizeof(short); -} - - -/* Load a given SID-tune file - */ -gboolean xs_sidplayfp_load(XSEngineState * state, gchar * filename) -{ - XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; - gboolean res = FALSE; - guint8 *buf = NULL; - size_t bufSize; - - if (!engine) - return FALSE; if (!xs_fload_buffer(filename, &buf, &bufSize, XS_SIDBUF_SIZE, TRUE)) goto error; @@ -411,11 +404,15 @@ goto error; } - res = TRUE; + g_free(buf); + return TRUE; error: + if (engine) + delete engine; + state->internal = NULL; g_free(buf); - return res; + return FALSE; } @@ -423,8 +420,11 @@ */ void xs_sidplayfp_delete(XSEngineState * state) { - (void) state; -// XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; + XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; + + if (engine) + delete engine; + state->internal = NULL; }