diff src/xs_sidplay2.cc @ 127:ddb513bd2610

Improved audio format support, now supported formats are "queried" from emulator engines. Preparing for NanoSID-support, since it's the worst in this sense.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 14 Jan 2004 21:45:05 +0000
parents fe83646e6baa
children 608f31f6c095
line wrap: on
line diff
--- a/src/xs_sidplay2.cc	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_sidplay2.cc	Wed Jan 14 21:45:05 2004 +0000
@@ -198,20 +198,8 @@
 guint xs_sidplay2_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, guint audioBufSize)
 {
  t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player;
- guint nData, i;
- guchar *p;
 
- nData = myPlayer->currEng->play(audioBuffer, audioBufSize);
-
- if ((nData > 0) && (myPlayer->currConfig.precision == 8))
-	{
-	/* SIDPlay2 only outputs SIGNED 8bit, so we need to convert it */
-	i = nData;
-	p = (guchar *) audioBuffer;
-	while (i--) *(p++) ^= 0x80;
-	}
-
- return nData;
+ return myPlayer->currEng->play(audioBuffer, audioBufSize);
 }
 
 
@@ -228,7 +216,7 @@
  myPlayer->currConfig = myPlayer->currEng->config();
 
  /* Configure channels and stuff */
- switch (xs_cfg.fmtChannels) {
+ switch (myStatus->audioChannels) {
 
 	case XS_CHN_AUTOPAN:
 		myPlayer->currConfig.playback = sid2_stereo;
@@ -281,26 +269,59 @@
 
  /* 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.optimisation	= (xs_cfg.sid2OptLevel) ? 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.precision		= myStatus->audioBitsPerSample;
+ myPlayer->currConfig.frequency		= myStatus->audioFrequency; 
 
-#ifdef HAVE_UNSIGNEDPCM
+ switch (myStatus->audioBitsPerSample) {
+ case XS_RES_8BIT:
+	myStatus->audioFormat 			= FMT_U8;
+	myPlayer->currConfig.sampleFormat	= SID2_LITTLE_UNSIGNED;
+	break;
+
+ case XS_RES_16BIT:
+	switch (myStatus->audioFormat) {
+	case FMT_U16_LE:
+		myPlayer->currConfig.sampleFormat	= SID2_LITTLE_UNSIGNED;
+		break;
+
+	case FMT_U16_BE:
+		myPlayer->currConfig.sampleFormat	= SID2_BIG_UNSIGNED;
+		break;
+
+	case FMT_U16_NE:
+		myStatus->audioFormat			= FMT_U16_NE;
 #ifdef WORDS_BIGENDIAN
-	myPlayer->currConfig.sampleFormat	= SID2_BIG_UNSIGNED;
+		myPlayer->currConfig.sampleFormat	= SID2_BIG_UNSIGNED;
 #else
-	myPlayer->currConfig.sampleFormat	= SID2_LITTLE_UNSIGNED;
+		myPlayer->currConfig.sampleFormat	= SID2_LITTLE_UNSIGNED;
 #endif
-#else
+		break;
+
+	case FMT_S16_LE:
+		myPlayer->currConfig.sampleFormat	= SID2_LITTLE_SIGNED;
+		break;
+
+	case FMT_S16_BE:
+		myPlayer->currConfig.sampleFormat	= SID2_BIG_SIGNED;
+		break;
+
+	default:
+		myStatus->audioFormat			= FMT_S16_NE;
 #ifdef WORDS_BIGENDIAN
-	myPlayer->currConfig.sampleFormat	= SID2_BIG_SIGNED;
+		myPlayer->currConfig.sampleFormat	= SID2_BIG_SIGNED;
 #else
-	myPlayer->currConfig.sampleFormat	= SID2_LITTLE_SIGNED;
+		myPlayer->currConfig.sampleFormat	= SID2_LITTLE_SIGNED;
 #endif
-#endif
+		break;
+
+	}
+	break;
+ }
+
 
  /* Now set the emulator configuration */
  if (myPlayer->currEng->config(myPlayer->currConfig) < 0)