Mercurial > hg > xmms-sid
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)