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 */
-