Mercurial > hg > xmms-sid
diff src/xs_sidplay2.cc @ 744:c7fa50576c70
Initial implementation for supporting libSIDPlay2-FP (or libSIDPlay-FP, as
they seem to call it.) Also removed support for the "old" libSIDPlay2 API,
only supporting the "new" CVS trunk COMI API for the old libSIDPlay2.
We'll see how that goes ..
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 05 Nov 2012 17:24:16 +0200 |
parents | 9321ffa2ea7e |
children | d9d769b5dbe2 |
line wrap: on
line diff
--- a/src/xs_sidplay2.cc Mon Nov 05 15:19:21 2012 +0200 +++ b/src/xs_sidplay2.cc Mon Nov 05 17:24:16 2012 +0200 @@ -1,10 +1,10 @@ /* XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) - libSIDPlay v2 support + libSIDPlay v2 and libSIDPlay v2-FP support Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org> - (C) Copyright 1999-2009 Tecnic Software productions (TNSP) + (C) Copyright 1999-2012 Tecnic Software productions (TNSP) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,20 +29,22 @@ #include "xs_config.h" -#include <sidplay/sidplay2.h> -#ifdef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP +# include <sidplayfp/sidplay2.h> +# include <sidplayfp/SidTune.h> +#else +# include <sidplay/sidplay2.h> # include <sidplay/sidlazyiptr.h> #endif - class xs_sidplay2_t { public: -#ifdef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP + sidplay2 *currEng; + sidbuilder *currBuilder; +#else SidIPtr<ISidplay2> currEng; SidLazyIPtr<ISidUnknown> currBuilder; -#else - sidplay2 *currEng; - sidbuilder *currBuilder; #endif sid2_config_t currConfig; SidTune *currTune; @@ -55,18 +57,27 @@ #ifdef HAVE_RESID_BUILDER -# include <sidplay/builders/resid.h> +# ifdef HAVE_SIDPLAY2_FP +# include <sidplayfp/builders/resid.h> +# else +# include <sidplay/builders/resid.h> +# endif #endif + #ifdef HAVE_HARDSID_BUILDER -# include <sidplay/builders/hardsid.h> +# ifdef HAVE_SIDPLAY2_FP +# include <sidplayfp/builders/hardsid.h> +# else +# include <sidplay/builders/hardsid.h> +# endif #endif xs_sidplay2_t::xs_sidplay2_t(void) -#ifdef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP +:currEng(NULL) +#else :currEng(sidplay2::create()) -#else -:currEng(NULL) #endif { buf = NULL; @@ -124,7 +135,7 @@ if (!myEngine) return FALSE; /* Initialize the engine */ -#ifndef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP myEngine->currEng = new sidplay2; #endif if (!myEngine->currEng) { @@ -137,62 +148,71 @@ /* Configure channels and stuff */ switch (myStatus->audioChannels) { - - case XS_CHN_AUTOPAN: - myEngine->currConfig.playback = sid2_stereo; - break; + case XS_CHN_AUTOPAN: + myEngine->currConfig.playback = sid2_stereo; + break; - case XS_CHN_STEREO: - myEngine->currConfig.playback = sid2_stereo; - break; + case XS_CHN_STEREO: + myEngine->currConfig.playback = sid2_stereo; + break; - case XS_CHN_MONO: - default: - myEngine->currConfig.playback = sid2_mono; - myStatus->audioChannels = XS_CHN_MONO; - break; + case XS_CHN_MONO: + default: + myEngine->currConfig.playback = sid2_mono; + myStatus->audioChannels = XS_CHN_MONO; + break; } /* Memory mode settings */ switch (xs_cfg.memoryMode) { - case XS_MPU_BANK_SWITCHING: - myEngine->currConfig.environment = sid2_envBS; - break; + case XS_MPU_BANK_SWITCHING: + myEngine->currConfig.environment = sid2_envBS; + break; - case XS_MPU_TRANSPARENT_ROM: - myEngine->currConfig.environment = sid2_envTP; - break; + case XS_MPU_TRANSPARENT_ROM: + myEngine->currConfig.environment = sid2_envTP; + break; - case XS_MPU_PLAYSID_ENVIRONMENT: - myEngine->currConfig.environment = sid2_envPS; - break; + case XS_MPU_PLAYSID_ENVIRONMENT: + myEngine->currConfig.environment = sid2_envPS; + break; - case XS_MPU_REAL: - default: - myEngine->currConfig.environment = sid2_envR; - xs_cfg.memoryMode = XS_MPU_REAL; - break; + case XS_MPU_REAL: + default: + myEngine->currConfig.environment = sid2_envR; + xs_cfg.memoryMode = XS_MPU_REAL; + break; } /* Audio parameters sanity checking and setup */ + tmpFreq = myStatus->audioFrequency; +#ifndef HAVE_SIDPLAY2_FP myEngine->currConfig.precision = myStatus->audioBitsPerSample; - tmpFreq = myStatus->audioFrequency; if (myStatus->oversampleEnable) tmpFreq = (tmpFreq * myStatus->oversampleFactor); +#else + myStatus->audioBitsPerSample = XS_RES_16BIT; + myEngine->currConfig.samplingMethod = SID2_RESAMPLE_INTERPOLATE; +#endif + myEngine->currConfig.frequency = tmpFreq; switch (myStatus->audioBitsPerSample) { case XS_RES_8BIT: myStatus->audioFormat = FMT_U8; +#ifndef HAVE_SIDPLAY2_FP myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED; +#endif break; case XS_RES_16BIT: default: + myStatus->audioFormat = FMT_S16_NE; +#ifndef HAVE_SIDPLAY2_FP switch (myStatus->audioFormat) { case FMT_U16_LE: myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED; @@ -223,7 +243,6 @@ break; default: - myStatus->audioFormat = FMT_S16_NE; #if G_BYTE_ORDER == G_BIG_ENDIAN myEngine->currConfig.sampleFormat = SID2_BIG_SIGNED; #else @@ -236,12 +255,10 @@ break; } +#endif break; } -#ifdef HAVE_SIDPLAY2_DISTORTION - XSDEBUG("filter setting NOT supported for distortion patched libSIDPlay2.\n"); -#else /* Convert filter */ f = &(xs_cfg.sid2Filter); XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints); @@ -256,21 +273,20 @@ tmpFilter.cutoff[i][0] = f->points[i].x; tmpFilter.cutoff[i][1] = f->points[i].y; } -#endif /* Initialize builder object */ XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (myEngine->currEng->info()).maxsids); #ifdef HAVE_RESID_BUILDER if (xs_cfg.sid2Builder == XS_BLD_RESID) { -#ifdef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP + ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder"); + myEngine->currBuilder = (sidbuilder *) rs; + if (rs) { +#else myEngine->currBuilder = ReSIDBuilderCreate(""); SidLazyIPtr<IReSIDBuilder> rs(myEngine->currBuilder); if (rs) { myEngine->currConfig.sidEmulation = rs->iaggregate(); -#else - ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder"); - myEngine->currBuilder = (sidbuilder *) rs; - if (rs) { #endif /* Builder object created, initialize it */ rs->create((myEngine->currEng->info()).maxsids); @@ -285,7 +301,7 @@ return FALSE; } -#ifndef HAVE_SIDPLAY2_DISTORTION +#if !defined(HAVE_SIDPLAY2_FP) // FIXME FIX ME: support other configurable parameters ... // ... WHEN/IF resid-builder+libsidplay2 gets fixed rs->sampling(tmpFreq); @@ -306,17 +322,18 @@ } } #endif + #ifdef HAVE_HARDSID_BUILDER if (xs_cfg.sid2Builder == XS_BLD_HARDSID) { -#ifdef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP + HardSIDBuilder *hs = new HardSIDBuilder("HardSID builder"); + myEngine->currBuilder = (sidbuilder *) hs; + if (hs) { +#else myEngine->currBuilder = HardSIDBuilderCreate(""); SidLazyIPtr<IHardSIDBuilder> hs(myEngine->currBuilder); if (hs) { myEngine->currConfig.sidEmulation = hs->iaggregate(); -#else - HardSIDBuilder *hs = new HardSIDBuilder("HardSID builder"); - myEngine->currBuilder = (sidbuilder *) hs; - if (hs) { #endif /* Builder object created, initialize it */ hs->create((myEngine->currEng->info()).maxsids); @@ -339,7 +356,7 @@ return FALSE; } -#ifndef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP myEngine->currConfig.sidEmulation = myEngine->currBuilder; XSDEBUG("%s\n", myEngine->currBuilder->credits()); #endif @@ -371,7 +388,7 @@ } -#ifndef HAVE_SIDPLAY2_DISTORTION +#if !defined(HAVE_SIDPLAY2_FP) if ((xs_cfg.sid2OptLevel >= 0) && (xs_cfg.sid2OptLevel <= SID2_MAX_OPTIMISATION)) myEngine->currConfig.optimisation = xs_cfg.sid2OptLevel; else { @@ -392,7 +409,6 @@ myEngine->currConfig.sidModel = myEngine->currConfig.sidDefault; else myEngine->currConfig.sidModel = SID2_MODEL_CORRECT; - /* XXX: Should this be configurable? libSIDPlay1 does not support it, though */ myEngine->currConfig.sidSamples = TRUE; @@ -426,13 +442,13 @@ /* Free internals */ if (myEngine->currBuilder) { -#ifndef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP delete myEngine->currBuilder; #endif myEngine->currBuilder = NULL; } -#ifndef HAVE_SIDPLAY2_COMI +#ifdef HAVE_SIDPLAY2_FP if (myEngine->currEng) { delete myEngine->currEng; myEngine->currEng = NULL; @@ -487,7 +503,7 @@ myEngine = (xs_sidplay2_t *) myStatus->sidEngine; if (!myEngine) return 0; - return myEngine->currEng->play(audioBuffer, audioBufSize); + return myEngine->currEng->play((short *) audioBuffer, audioBufSize / sizeof(short)); }