Mercurial > hg > xmms-sid
diff src/xs_sidplay2.cc @ 75:653c9b0d1320
SIDPlay2 support "works" now. Borked problems with threads.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 15 Sep 2003 11:10:03 +0000 |
parents | 8cb66a3f75f7 |
children | ab522ab65c85 |
line wrap: on
line diff
--- a/src/xs_sidplay2.cc Sun Sep 14 18:51:05 2003 +0000 +++ b/src/xs_sidplay2.cc Mon Sep 15 11:10:03 2003 +0000 @@ -37,12 +37,13 @@ #include <sidplay/builders/resid.h> #endif #ifdef HAVE_HARDSID_BUILDER -/* Dummy now */ +#include <sidplay/builders/hardsid.h> #endif typedef struct { sidplay2 *currEng; + sidbuilder *currBuilder; sid2_config_t currConfig; SidTune *currTune; } t_xs_sidplay2; @@ -53,9 +54,12 @@ */ extern "C" { + +/* + * Check if we can play the given file + */ gboolean xs_sidplay2_isourfile(gchar *pcFileName) { - /* Try to detect via libSIDPlay's detection routine, if required */ SidTune *testTune = new SidTune(pcFileName); if (!testTune) return FALSE; @@ -70,68 +74,120 @@ } -void xs_sidplay2_close(t_xs_status *myStatus) -{ - t_xs_sidplay2 *myPlayer; - sidbuilder *myBuilder; - - /* Check pointer */ - if (!myStatus) return; - - /* Free internals */ - myPlayer = (t_xs_sidplay2 *) myStatus->player; - - myBuilder = myPlayer->currConfig.sidEmulation; - myPlayer->currEng->config(myPlayer->currConfig); - - delete myBuilder; - delete myPlayer->currEng; - - xs_sidplay2_deletesid(myStatus); - - free(myPlayer); - myStatus->player = NULL; - - /* Miscellaneous */ - free(myStatus->currFileName); - myStatus->currFileName = NULL; -} - - +/* + * Initialize SIDPlay2 + */ gboolean xs_sidplay2_init(t_xs_status *myStatus) { t_xs_sidplay2 *myPlayer; - - /* Check pointer */ - if (!myStatus) return FALSE; + assert(myStatus); /* Allocate internal structures */ myPlayer = (t_xs_sidplay2 *) g_malloc0(sizeof(t_xs_sidplay2)); if (!myPlayer) return FALSE; - /* Initialize engine */ + + /* Initialize the engine */ myPlayer->currEng = new sidplay2; if (!myPlayer->currEng) { XSERR("Could not initialize libSIDPlay2 emulation engine\n"); - free(myPlayer); + return FALSE; + } + + /* Initialize builder object */ + /* + FIXME! we need to select builder by configuration! + */ +#ifdef HAVE_RESID_BUILDER + ReSIDBuilder *tmpb = new ReSIDBuilder("SIDPlay2 suxx and is made by a fag - ReSID builder"); + + /* Create the builder -- WHAT IS THIS MEANT FOR??? */ + tmpb->create(myPlayer->currEng->info().maxsids); + + myPlayer->currBuilder = (sidbuilder *) tmpb; +#endif +#ifdef HAVE_HARDSID_BUILDER +#endif + + if (!myPlayer->currBuilder) + { + XSERR("Could not initialize SIDBuilder object.\n"); return FALSE; } + XSDEBUG("%s\n", myPlayer->currBuilder->credits()); + + + /* Create the sidtune */ + myPlayer->currTune = new SidTune(0); + if (!myPlayer->currTune) + { + XSERR("Could not initialize SIDTune object.\n"); + return FALSE; + } + + /* OK */ myStatus->player = myPlayer; return TRUE; } +/* + * Close SIDPlay2 + */ +void xs_sidplay2_close(t_xs_status *myStatus) +{ + t_xs_sidplay2 *myPlayer; + assert(myStatus); + + /* Free internals */ + myPlayer = (t_xs_sidplay2 *) myStatus->player; + + if (myPlayer->currBuilder) + { + delete myPlayer->currBuilder; + myPlayer->currBuilder = NULL; + } + + if (myPlayer->currEng) + { + delete myPlayer->currEng; + myPlayer->currEng = NULL; + } + + if (myPlayer->currTune) + { + delete myPlayer->currTune; + myPlayer->currTune = NULL; + } + + xs_sidplay2_deletesid(myStatus); + + g_free(myPlayer); + myStatus->player = NULL; +} + + gboolean xs_sidplay2_initsong(t_xs_status *myStatus) { t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; - if (!myPlayer || !myPlayer->currTune) return FALSE; + if (!myPlayer) return FALSE; + + if (!myPlayer->currTune->selectSong(myStatus->currSong)) + { + XSERR("ENGINE selectSong() failed\n"); + return FALSE; + } - myPlayer->currTune->selectSong(myStatus->currSong); + if (myPlayer->currEng->load(myPlayer->currTune) < 0) + { + XSERR("ENGINE load() failed\n"); + return FALSE; + } - return myPlayer->currEng->load(myPlayer->currTune); + return TRUE; } @@ -139,8 +195,6 @@ { t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; - if (!myPlayer) return FALSE; - return (myPlayer->currEng->play(audioBuffer, audioBufSize) == audioBufSize); } @@ -148,13 +202,12 @@ gboolean xs_sidplay2_loadsid(t_xs_status *myStatus, gchar *pcFileName) { t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; - SidTune *newTune; SidTuneInfo tuneInfo; + assert(myStatus); /* Try to get the tune */ if (!pcFileName) return FALSE; - newTune = new SidTune(pcFileName); - if (!newTune) return FALSE; + if (!myPlayer->currTune->load(pcFileName)) return FALSE; /* Get current configuration */ myPlayer->currConfig = myPlayer->currEng->config(); @@ -212,12 +265,13 @@ /* Configure rest of the emulation */ + myPlayer->currConfig.sidEmulation = myPlayer->currBuilder; myPlayer->currConfig.precision = xs_cfg.fmtBitsPerSample; myPlayer->currConfig.frequency = xs_cfg.fmtFrequency; - myPlayer->currConfig.clockForced = xs_cfg.forceSpeed; + myPlayer->currConfig.clockForced = xs_cfg.forceSpeed; myPlayer->currConfig.optimisation = (xs_cfg.optimiseLevel) ? 1 : 0; - myPlayer->currConfig.sidDefault = myPlayer->currConfig.sidModel = (xs_cfg.mos8580) ? SID2_MOS8580 : SID2_MOS6581; - myPlayer->currConfig.sidSamples = TRUE; // FIXME FIX ME, make configurable! + myPlayer->currConfig.sidDefault = myPlayer->currConfig.sidModel = (xs_cfg.mos8580) ? SID2_MOS8580 : SID2_MOS6581; + myPlayer->currConfig.sidSamples = TRUE; // FIXME FIX ME, make configurable! #ifdef HAVE_UNSIGNEDPCM #ifdef WORDS_BIGENDIAN @@ -234,17 +288,16 @@ #endif /* Now set the emulator configuration */ - myPlayer->currEng->config(myPlayer->currConfig); + if (myPlayer->currEng->config(myPlayer->currConfig) < 0) + { + XSERR("Emulator engine configuration failed!\n"); + return FALSE; + } /* Initialize status information */ - newTune->getInfo(tuneInfo); - - myStatus->isPlaying = TRUE; - myStatus->isError = FALSE; + myPlayer->currTune->getInfo(tuneInfo); myStatus->currSong = tuneInfo.startSong; myStatus->nSongs = tuneInfo.songs; - myPlayer->currTune = newTune; - myStatus->currFileName = g_strdup(pcFileName); return TRUE; } @@ -256,15 +309,9 @@ void xs_sidplay2_deletesid(t_xs_status *myStatus) { t_xs_sidplay2 *myPlayer; - - if (!myStatus) return; + assert(myStatus); - if (myStatus->currFileName) - { - g_free(myStatus->currFileName); - myStatus->currFileName = NULL; - } - +/* myPlayer = (t_xs_sidplay2 *) myStatus->player; if (!myPlayer) return; @@ -273,6 +320,7 @@ delete myPlayer->currTune; myPlayer->currTune = NULL; } +*/ }