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;
 	}
+*/
 }