Mercurial > hg > xmms-sid
diff src/xs_sidplay1.cc @ 72:e3b205a6bc7e
Lots re-arranging and new code for upcoming modularization.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 12 Sep 2003 03:26:04 +0000 |
parents | 2b32c75729ce |
children | 2bc607888f53 |
line wrap: on
line diff
--- a/src/xs_sidplay1.cc Wed Sep 10 06:21:04 2003 +0000 +++ b/src/xs_sidplay1.cc Fri Sep 12 03:26:04 2003 +0000 @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_SIDPLAY1 -#include "xmms-sid.h" +#include "xs_sidplay1.h" extern "C" { #include <xmms/title.h> @@ -31,64 +31,96 @@ #include <sidplay/fformat.h> -struct xs_sidplay1 { - struct emuConfig emuConf; - emuEngine emuEngine; - gboolean isError, isPlaying, allowNext; - gint currSong, nSongs; - sidTune *currTune; - gchar *currFileName; -}; +void xs_sidplay1_close(t_xs_status *myStatus) +{ + if (!myStatus) return; - + if (!myStatus->currEng) + delete (emuEngine *) myStatus->currEng; -gboolean xs_sidplay1_initsong(struct xs_sidplay1 *myStatus) -{ - return sidEmuInitializeSong(myStatus->emuEngine, myStatus->currTune, myStatus->currSong); + if (!myStatus->currConf) + free(myStatus->currConf); + + free(myStatus); } -void xs_sidplay1_fillbuffer(struct xs_sidplay1 *myStatus, gchar *audioBuffer, gint audioBufSize) +gboolean xs_sidplay1_init(t_xs_status *myStatus) { - sidEmuFillBuffer(myStatus->emuEngine, myStatus->currTune, audioBuffer, audioBufSize); + if (!myStatus) return FALSE; + + myStatus->currEng = (void *) new emuEngine; + if (!myStatus->currEng) + { + xs_sidplay1_close(myStatus); + return FALSE; + } + + myStatus->currConf = calloc(1, sizeof(struct emuConfig)); + if (!myStatus->currConf) + { + xs_sidplay1_close(myStatus); + return FALSE; + } + + return TRUE; } -gint xs_sidplay1_inittune(gchar *pcFileName) +gboolean xs_sidplay1_initsong(t_xs_status *myStatus) +{ + if ((!myStatus->currTune) || (!((sidTune *)myStatus->currTune)->getStatus())) return FALSE; + + return sidEmuInitializeSong( + (emuEngine *) myStatus->currEngine, + (sidTune *) myStatus->currTune, + myStatus->currSong); +} + + +void xs_sidplay1_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, gint audioBufSize) +{ + sidEmuFillBuffer( + (emuEngine *) myStatus->currEngine, + (sidTune *) myStatus->currTune, + audioBuffer, + audioBufSize); +} + + +gboolean xs_sidplay1_loadsid(t_xs_status *myStatus, gchar *pcFileName) { sidTune *newTune; sidTuneInfo tuneInfo; - /* Can we set the next tune? */ - XSDEBUG("request to play '%s'\n", pcFileName); - /* Try to get the tune */ + if (!pcFileName) return FALSE; newTune = new sidTune(pcFileName); - if (newTune == NULL) return; + if (newTune == NULL) return FALSE; /* Get current configuration */ - xs_emuEngine.getConfig(xs_emuConf); + myStatus->currEngine.getConfig(myStatus->currConf); /* Configure channels and stuff */ switch (xs_cfg.fmtChannels) { case XS_CHN_AUTOPAN: - xs_emuConf.channels = SIDEMU_STEREO; - xs_emuConf.autoPanning = SIDEMU_CENTEREDAUTOPANNING; - xs_emuConf.volumeControl = SIDEMU_FULLPANNING; + myStatus->currConf.channels = SIDEMU_STEREO; + myStatus->currConf.autoPanning = SIDEMU_CENTEREDAUTOPANNING; + myStatus->currConf.volumeControl = SIDEMU_FULLPANNING; break; case XS_CHN_STEREO: - xs_emuConf.channels = SIDEMU_STEREO; - xs_emuConf.autoPanning = SIDEMU_NONE; - xs_emuConf.volumeControl = SIDEMU_NONE; + myStatus->currConf.channels = SIDEMU_STEREO; + myStatus->currConf.autoPanning = SIDEMU_NONE; + myStatus->currConf.volumeControl = SIDEMU_NONE; break; case XS_CHN_MONO: default: - xs_emuConf.channels = SIDEMU_MONO; - xs_emuConf.autoPanning = SIDEMU_NONE; - xs_emuConf.volumeControl = SIDEMU_NONE; + myStatus->currConf.channels = SIDEMU_MONO; + myStatus->currConf.autoPanning = SIDEMU_NONE; + myStatus->currConf.volumeControl = SIDEMU_NONE; break; } @@ -96,19 +128,19 @@ /* Memory mode settings */ switch (xs_cfg.memoryMode) { case XS_MPU_BANK_SWITCHING: - xs_emuConf.memoryMode = MPU_BANK_SWITCHING; + myStatus->currConf.memoryMode = MPU_BANK_SWITCHING; break; case XS_MPU_TRANSPARENT_ROM: - xs_emuConf.memoryMode = MPU_TRANSPARENT_ROM; + myStatus->currConf.memoryMode = MPU_TRANSPARENT_ROM; break; case XS_MPU_PLAYSID_ENVIRONMENT: - xs_emuConf.memoryMode = MPU_PLAYSID_ENVIRONMENT; + myStatus->currConf.memoryMode = MPU_PLAYSID_ENVIRONMENT; break; default: - xs_emuConf.memoryMode = MPU_BANK_SWITCHING; + myStatus->currConf.memoryMode = MPU_BANK_SWITCHING; break; } @@ -116,58 +148,46 @@ /* Clockspeed settings */ switch (xs_cfg.clockSpeed) { case XS_CLOCK_NTSC: - xs_emuConf.clockSpeed = SIDTUNE_CLOCK_NTSC; + myStatus->currConf.clockSpeed = SIDTUNE_CLOCK_NTSC; break; case XS_CLOCK_PAL: default: - xs_emuConf.clockSpeed = SIDTUNE_CLOCK_PAL; + myStatus->currConf.clockSpeed = SIDTUNE_CLOCK_PAL; break; } /* Configure rest of the emulation */ - xs_emuConf.bitsPerSample = xs_cfg.fmtBitsPerSample; - xs_emuConf.frequency = xs_cfg.fmtFrequency; + myStatus->currConf.bitsPerSample = xs_cfg.fmtBitsPerSample; + myStatus->currConf.frequency = xs_cfg.fmtFrequency; #ifdef HAVE_UNSIGNEDPCM - xs_emuConf.sampleFormat = SIDEMU_UNSIGNED_PCM; + myStatus->currConf.sampleFormat = SIDEMU_UNSIGNED_PCM; #else - xs_emuConf.sampleFormat = SIDEMU_SIGNED_PCM; + myStatus->currConf.sampleFormat = SIDEMU_SIGNED_PCM; #endif - xs_emuConf.mos8580 = xs_cfg.mos8580; - xs_emuConf.emulateFilter = xs_cfg.emulateFilters; - xs_emuConf.filterFs = xs_cfg.filterFs; - xs_emuConf.filterFm = xs_cfg.filterFm; - xs_emuConf.filterFt = xs_cfg.filterFt; + myStatus->currConf.mos8580 = xs_cfg.mos8580; + myStatus->currConf.emulateFilter = xs_cfg.emulateFilters; + myStatus->currConf.filterFs = xs_cfg.filterFs; + myStatus->currConf.filterFm = xs_cfg.filterFm; + myStatus->currConf.filterFt = xs_cfg.filterFt; /* Now set the emulator configuration */ - xs_emuEngine.setConfig(xs_emuConf); - + myStatus->currEngine.setConfig(myStatus->currConf); /* Initialize status information */ - XSDEBUG("starting playing thread!\n"); - newTune->getInfo(tuneInfo); - - xs_status->isPlaying = TRUE; - xs_status->isError = FALSE; - xs_status->currSong = tuneInfo.startSong; - xs_status->nSongs = tuneInfo.songs; - xs_status->currTune = newTune; - xs_status->currFileName = g_strdup(pcFileName); + if (!newTune) return FALSE; - /* Start the playing thread! */ - if (pthread_create(&xs_decode_thread, NULL, xs_play_loop, NULL) < 0) - { - XSERR("Couldn't start playing thread! Possible reason reported by system: %s\n", strerror(errno)); - delete newTune; - } + myStatus->isPlaying = TRUE; + myStatus->isError = FALSE; + myStatus->currSong = tuneInfo.startSong; + myStatus->nSongs = tuneInfo.songs; + myStatus->currTune = newTune; + myStatus->currFileName = g_strdup(pcFileName); - XSDEBUG("systems should be up?\n"); - - /* Exit */ + return TRUE; } #endif /* HAVE_SIDPLAY1 */ -