changeset 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 4f4dba82011e
children 1e38806f7a3b
files src/xmms-sid.c src/xmms-sid.h src/xs_config.c src/xs_config.h src/xs_genui.c src/xs_genui.h src/xs_nanosid.c src/xs_sidplay1.cc src/xs_sidplay2.cc
diffstat 9 files changed, 165 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmms-sid.c	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xmms-sid.c	Wed Jan 14 21:45:05 2004 +0000
@@ -129,7 +129,11 @@
 
  /* Initialize status */
  memset(&xs_status, 0, sizeof(xs_status));
-
+ xs_status.audioFrequency	= xs_cfg.audioFrequency;
+ xs_status.audioBitsPerSample	= xs_cfg.audioBitsPerSample;
+ xs_status.audioChannels	= xs_cfg.audioChannels;
+ xs_status.audioFormat		= -1;
+ 
  /* Try to initialize emulator engine */
  XSDEBUG("initializing emulator engine #%i...\n", xs_cfg.playerEngine);
 
@@ -252,7 +256,7 @@
  t_xs_tune *myTune;
  gboolean audioOpen = FALSE, doPlay = FALSE;
  guint audioGot;
- gint audioFreq, audioChannels, songLength, audioFmt;
+ gint songLength;
  gchar audioBuffer[XS_BUFSIZE];
 
  /* Initialize */
@@ -262,14 +266,6 @@
  myTune = xs_status.pTune;
  pthread_mutex_unlock(&xs_mutex);
 
- /* Copy and check audio options here (they might change in config while running) */
-#ifdef HAVE_UNSIGNEDPCM
- audioFmt = (xs_cfg.fmtBitsPerSample == XS_RES_16BIT) ? FMT_U16_NE : FMT_U8;
-#else
- audioFmt = (xs_cfg.fmtBitsPerSample == XS_RES_16BIT) ? FMT_S16_NE : FMT_S8;
-#endif
- audioFreq = xs_cfg.fmtFrequency;
- audioChannels = (xs_cfg.fmtChannels == XS_CHN_MONO) ? 1 : 2;
 
  /*
   * Main player loop: while not stopped, loop here - play subtunes
@@ -299,14 +295,15 @@
  	myTune->subTunes[myStatus.currSong - 1].tuneTitle,
  	(songLength > 0) ? (songLength * 1000) : -1,
  	(myTune->subTunes[myStatus.currSong - 1].tuneSpeed > 0) ? (myTune->subTunes[myStatus.currSong - 1].tuneSpeed * 1000) : -1,
-	audioFreq,
-	audioChannels);
+	myStatus.audioFrequency,
+	myStatus.audioChannels);
 
 
  /* Open the audio output */
- if (!xs_plugin_ip.output->open_audio(audioFmt, audioFreq, audioChannels))
+ if (!xs_plugin_ip.output->open_audio(myStatus.audioFormat, myStatus.audioFrequency, myStatus.audioChannels))
 	{
-	XSERR("Couldn't open XMMS audio output!\n");
+	XSERR("Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n",
+	myStatus.audioFormat, myStatus.audioFrequency, myStatus.audioChannels);
 	pthread_mutex_lock(&xs_mutex);
 	xs_status.isError = TRUE;
 	pthread_mutex_unlock(&xs_mutex);
@@ -326,7 +323,8 @@
 	/* I <3 visualice/haujobb */
 	xs_plugin_ip.add_vis_pcm(
 		xs_plugin_ip.output->written_time(),
-		audioFmt, audioChannels, audioGot, audioBuffer);
+		myStatus.audioFormat, myStatus.audioChannels,
+		audioGot, audioBuffer);
 
 	/* Wait a little */
 	while (xs_status.isPlaying &&
@@ -671,7 +669,7 @@
 
 void xs_fileinfo(gchar *pcFilename)
 {
- GtkWidget *tmpMenuItem, *tmpMenu, *tmpOptionMenu, *tmpText;
+ GtkWidget *tmpMenuItem, *tmpMenu, *tmpOptionMenu;
  t_xs_stil_subnode *tmpNode;
  gchar tmpStr[32], *tmpS;
  gint n;
--- a/src/xmms-sid.h	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xmms-sid.h	Wed Jan 14 21:45:05 2004 +0000
@@ -78,6 +78,10 @@
 
 
 typedef struct {
+	gint		audioFrequency,
+			audioFormat,
+			audioChannels,
+			audioBitsPerSample;
 	void		*player;
 	gboolean	isError, isPlaying;
 	gint		currSong;
--- a/src/xs_config.c	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_config.c	Wed Jan 14 21:45:05 2004 +0000
@@ -31,7 +31,8 @@
  */
 static GtkWidget	*xs_configwin = NULL,
 			*xs_sldb_fileselector = NULL,
-			*xs_stil_fileselector = NULL;
+			*xs_stil_fileselector = NULL,
+			*xs_hvsc_pathselector = NULL;
 
 #define LUW(x...)	lookup_widget(xs_configwin, ## x)
 
@@ -40,9 +41,9 @@
  * Configuration specific stuff
  */
 t_xs_cfg_item xs_cfgtable[] = {
-	{CTYPE_INT,	&xs_cfg.fmtBitsPerSample,	"fmtBitsPerSample"},
-	{CTYPE_INT,	&xs_cfg.fmtChannels,		"fmtChannels"},
-	{CTYPE_INT,	&xs_cfg.fmtFrequency,		"fmtFrequency"},
+	{CTYPE_INT,	&xs_cfg.audioBitsPerSample,	"audioBitsPerSample"},
+	{CTYPE_INT,	&xs_cfg.audioChannels,		"audioChannels"},
+	{CTYPE_INT,	&xs_cfg.audioFrequency,		"audioFrequency"},
 
 	{CTYPE_BOOL,	&xs_cfg.mos8580,		"mos8580"},
 	{CTYPE_BOOL,	&xs_cfg.emulateFilters,		"emulateFilters"},
@@ -83,12 +84,12 @@
 
 
 t_xs_wid_item xs_widtable[] = {
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_16bit",	&xs_cfg.fmtBitsPerSample,	XS_RES_16BIT },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_8bit",		&xs_cfg.fmtBitsPerSample,	XS_RES_8BIT },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_mono",		&xs_cfg.fmtChannels,		XS_CHN_MONO },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_stereo",	&xs_cfg.fmtChannels,		XS_CHN_STEREO },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_autopan",	&xs_cfg.fmtChannels,		XS_CHN_AUTOPAN },
-{ WTYPE_SPIN,	CTYPE_INT,	"cfg_samplerate",	&xs_cfg.fmtFrequency,		0 },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_16bit",	&xs_cfg.audioBitsPerSample,	XS_RES_16BIT },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_8bit",		&xs_cfg.audioBitsPerSample,	XS_RES_8BIT },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_mono",		&xs_cfg.audioChannels,		XS_CHN_MONO },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_stereo",	&xs_cfg.audioChannels,		XS_CHN_STEREO },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_autopan",	&xs_cfg.audioChannels,		XS_CHN_AUTOPAN },
+{ WTYPE_SPIN,	CTYPE_INT,	"cfg_samplerate",	&xs_cfg.audioFrequency,		0 },
 { WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_oversample",	&xs_cfg.oversampleEnable,	0 },
 { WTYPE_SPIN,	CTYPE_INT,	"cfg_oversample_factor",&xs_cfg.oversampleFactor,	0 },
 { WTYPE_BGROUP,	CTYPE_INT,	"cfg_overfilter_average",&xs_cfg.oversampleFilter,	XS_FILTER_AVERAGE },
@@ -166,9 +167,9 @@
  XSDEBUG("initializing configuration ...\n");
 
  /* Pre-initialize configuration structure */
- xs_cfg.fmtBitsPerSample	= XS_RES_16BIT;
- xs_cfg.fmtChannels		= XS_CHN_MONO;
- xs_cfg.fmtFrequency		= 44100;
+ xs_cfg.audioBitsPerSample	= XS_RES_16BIT;
+ xs_cfg.audioChannels		= XS_CHN_MONO;
+ xs_cfg.audioFrequency		= 44100;
 
  xs_cfg.mos8580			= FALSE;
  xs_cfg.emulateFilters		= TRUE;
@@ -531,6 +532,45 @@
 }
 
 
+/*
+ * HVSC location selector response-functions
+ */
+void xs_cfg_hvsc_browse(GtkButton *button, gpointer user_data)
+{
+ if (xs_hvsc_pathselector != NULL)
+	{
+	gdk_window_raise(xs_hvsc_pathselector->window);
+	return;
+	}
+
+ xs_hvsc_pathselector = create_xs_stilfileselector();
+ gtk_widget_show(xs_hvsc_pathselector);
+}
+
+
+void xs_cfg_hvsc_fs_ok(void)
+{
+ /* Selection was accepted! */
+ gtk_entry_set_text(GTK_ENTRY(LUW("cfg_hvsc_path")),
+ 	gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_hvsc_pathselector)));
+
+ /* Close file selector window */
+ gtk_widget_destroy(xs_hvsc_pathselector);
+ xs_hvsc_pathselector = NULL;
+}
+
+
+void xs_cfg_hvsc_fs_cancel(void)
+{
+ /* Close file selector window */
+ gtk_widget_destroy(xs_hvsc_pathselector);
+ xs_hvsc_pathselector = NULL;
+}
+
+
+/*
+ * Selection toggle handlers
+ */
 void xs_cfg_emu_filters_toggled(GtkToggleButton *togglebutton, gpointer user_data)
 {
 }
--- a/src/xs_config.h	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_config.h	Wed Jan 14 21:45:05 2004 +0000
@@ -24,8 +24,7 @@
 
 enum XS_RESOLUTION {
 	XS_RES_8BIT = 8,
-	XS_RES_16BIT = 16,
-	XS_RES_24BIT = 24
+	XS_RES_16BIT = 16
 };
 
 enum XS_CHANNELS {
@@ -64,9 +63,9 @@
 
 extern struct t_xs_cfg {
 	/* General audio settings */
-	gint		fmtBitsPerSample;
-	gint		fmtChannels;
-	gint		fmtFrequency;
+	gint		audioBitsPerSample;
+	gint		audioChannels;
+	gint		audioFrequency;
 
 	/* General libSIDPlay settings */
 	gboolean	mos8580;		/* TRUE = 8580, FALSE = 6581 */
--- a/src/xs_genui.c	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_genui.c	Wed Jan 14 21:45:05 2004 +0000
@@ -9,11 +9,3 @@
 #include "xs_glade.h"
 
 
-
-void
-xs_cfg_hvsc_browse                     (GtkButton       *button,
-                                        gpointer         user_data)
-{
-
-}
-
--- a/src/xs_genui.h	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_genui.h	Wed Jan 14 21:45:05 2004 +0000
@@ -68,3 +68,11 @@
 void
 xs_cfg_hvsc_browse                     (GtkButton       *button,
                                         gpointer         user_data);
+
+void
+xs_cfg_hvsc_fs_ok                      (GtkButton       *button,
+                                        gpointer         user_data);
+
+void
+xs_cfg_hvsc_fs_cancel                  (GtkButton       *button,
+                                        gpointer         user_data);
--- a/src/xs_nanosid.c	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_nanosid.c	Wed Jan 14 21:45:05 2004 +0000
@@ -28,7 +28,7 @@
 #include <xmms/titlestring.h>
 #include "xs_config.h"
 #include "xs_support.h"
-#include "xs_length.h"
+#include <libNanoSID.h>
 
 
 typedef struct {
--- a/src/xs_sidplay1.cc	Wed Jan 14 03:57:04 2004 +0000
+++ b/src/xs_sidplay1.cc	Wed Jan 14 21:45:05 2004 +0000
@@ -181,7 +181,7 @@
  myPlayer->currEng->getConfig(myPlayer->currConfig);
 
  /* Configure channels and stuff */
- switch (xs_cfg.fmtChannels) {
+ switch (myStatus->audioChannels) {
 
 	case XS_CHN_AUTOPAN:
 		myPlayer->currConfig.channels = SIDEMU_STEREO;
@@ -238,19 +238,48 @@
 
 
  /* Configure rest of the emulation */
- myPlayer->currConfig.bitsPerSample	= xs_cfg.fmtBitsPerSample;
- myPlayer->currConfig.frequency		= xs_cfg.fmtFrequency;
-#ifdef HAVE_UNSIGNEDPCM
- myPlayer->currConfig.sampleFormat	= SIDEMU_UNSIGNED_PCM;
-#else
- myPlayer->currConfig.sampleFormat	= SIDEMU_SIGNED_PCM;
-#endif
  myPlayer->currConfig.mos8580		= xs_cfg.mos8580;
  myPlayer->currConfig.emulateFilter	= xs_cfg.emulateFilters;
  myPlayer->currConfig.filterFs		= xs_cfg.filterFs;
  myPlayer->currConfig.filterFm		= xs_cfg.filterFm;
  myPlayer->currConfig.filterFt		= xs_cfg.filterFt;
 
+ myPlayer->currConfig.bitsPerSample	= myStatus->audioBitsPerSample;
+ myPlayer->currConfig.frequency		= myStatus->audioFrequency;
+
+ switch (myStatus->audioBitsPerSample) {
+ case XS_RES_8BIT:
+	switch (myStatus->audioFormat) {
+	case FMT_U8:
+		myPlayer->currConfig.sampleFormat	= SIDEMU_UNSIGNED_PCM;
+		break;
+
+	case FMT_S8:
+		myPlayer->currConfig.sampleFormat	= SIDEMU_SIGNED_PCM;
+		break;
+	}
+	break;
+
+ case XS_RES_16BIT:
+	switch (myStatus->audioFormat) {
+	case FMT_U16_NE:
+	case FMT_U16_LE:
+	case FMT_U16_BE:
+		myStatus->audioFormat			= FMT_U16_NE;
+		myPlayer->currConfig.sampleFormat       = SIDEMU_UNSIGNED_PCM;
+		break;
+
+	case FMT_S16_NE:
+	case FMT_S16_LE:
+	case FMT_S16_BE:
+		myStatus->audioFormat			= FMT_S16_NE;
+		myPlayer->currConfig.sampleFormat       = SIDEMU_SIGNED_PCM;
+		break;
+	}
+	break;
+ }
+
+
  /* Now set the emulator configuration */
  if (!myPlayer->currEng->setConfig(myPlayer->currConfig))
 	{
--- 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)