# HG changeset patch # User Matti Hamalainen # Date 1074116705 0 # Node ID ddb513bd261077ccf8f976ce4ffb1b799f409912 # Parent 4f4dba82011ef49b2f7d3860cce528dfae381889 Improved audio format support, now supported formats are "queried" from emulator engines. Preparing for NanoSID-support, since it's the worst in this sense. diff -r 4f4dba82011e -r ddb513bd2610 src/xmms-sid.c --- 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; diff -r 4f4dba82011e -r ddb513bd2610 src/xmms-sid.h --- 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; diff -r 4f4dba82011e -r ddb513bd2610 src/xs_config.c --- 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) { } diff -r 4f4dba82011e -r ddb513bd2610 src/xs_config.h --- 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 */ diff -r 4f4dba82011e -r ddb513bd2610 src/xs_genui.c --- 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) -{ - -} - diff -r 4f4dba82011e -r ddb513bd2610 src/xs_genui.h --- 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); diff -r 4f4dba82011e -r ddb513bd2610 src/xs_nanosid.c --- 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 #include "xs_config.h" #include "xs_support.h" -#include "xs_length.h" +#include typedef struct { diff -r 4f4dba82011e -r ddb513bd2610 src/xs_sidplay1.cc --- 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)) { diff -r 4f4dba82011e -r ddb513bd2610 src/xs_sidplay2.cc --- 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)