Mercurial > hg > xmms-sid
diff src/xs_sidplay2.cc @ 73:2bc607888f53
Added libsidplay2 module, lots of reworking of internals, sidplay1 support
now works with the new framework! Getting libsidplay2 support working
shouldn't be too far now...
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 14 Sep 2003 03:14:01 +0000 |
parents | |
children | 8cb66a3f75f7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/xs_sidplay2.cc Sun Sep 14 03:14:01 2003 +0000 @@ -0,0 +1,281 @@ +/* + XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) + + libSIDPlay v2 support + + Written by Matti "ccr" Hamalainen <ccr@tnsp.org> + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#include "xmms-sid.h" + +#ifdef HAVE_SIDPLAY2 + +extern "C" { +#include "xs_sidplay2.h" +#include <stdio.h> +#include <xmms/titlestring.h> +#include "xs_config.h" +#include "xs_support.h" +#include "xs_length.h" +} + +#include <sidplay/sidplay2.h> +#ifdef HAVE_RESID_BUILDER +#include <sidplay/builders/resid.h> +#endif +#ifdef HAVE_HARDSID_BUILDER +/* Dummy now */ +#endif + + +typedef struct { + sidplay2 *currEng; + sid2_config_t currConfig; + SidTune *currTune; +} t_xs_sidplay2; + + +/* + * We need to 'export' all this pseudo-C++ crap + */ +extern "C" { + +gboolean xs_sidplay2_isourfile(gchar *pcFileName) +{ + /* Try to detect via libSIDPlay's detection routine, if required */ + SidTune *testTune = new SidTune(pcFileName); + + if (!testTune) return FALSE; + if (!testTune->getStatus()) + { + delete testTune; + return FALSE; + } + + delete testTune; + return TRUE; +} + + +void xs_sidplay2_close(t_xs_status *myStatus) +{ + t_xs_sidplay2 *myPlayer; + sidbuilder *myBuilder; + + /* Check pointer */ + if (!myStatus) return; + + /* Free internals */ + myPlayer = (t_xs_sidplay2 *) myStatus->player; + + myBuilder = myPlayer->currConfig.sidEmulation; + myPlayer->currEng->config(myPlayer->currConfig); + + delete myBuilder; + delete myPlayer->currEng; + + xs_sidplay2_deletesid(myStatus); + + free(myPlayer); + myStatus->player = NULL; + + /* Miscellaneous */ + free(myStatus->currFileName); + myStatus->currFileName = NULL; +} + + +gboolean xs_sidplay2_init(t_xs_status *myStatus) +{ + t_xs_sidplay2 *myPlayer; + + /* Check pointer */ + if (!myStatus) return FALSE; + + /* Allocate internal structures */ + myPlayer = (t_xs_sidplay2 *) g_malloc0(sizeof(t_xs_sidplay2)); + if (!myPlayer) return FALSE; + + /* Initialize engine */ + myPlayer->currEng = new sidplay2; + if (!myPlayer->currEng) + { + XSERR("Could not initialize libSIDPlay2 emulation engine\n"); + free(myPlayer); + return FALSE; + } + + myStatus->player = myPlayer; + return TRUE; +} + + +gboolean xs_sidplay2_initsong(t_xs_status *myStatus) +{ + t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; + + if (!myPlayer || !myPlayer->currTune) return FALSE; + + myPlayer->currTune->selectSong(myStatus->currSong); + + return myPlayer->currEng->load(myPlayer->currTune); +} + + +gboolean xs_sidplay2_fillbuffer(t_xs_status *myStatus, gchar *audioBuffer, gint audioBufSize) +{ + t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; + + if (!myPlayer) return FALSE; + + return (myPlayer->currEng->play(audioBuffer, audioBufSize) == audioBufSize); +} + + +gboolean xs_sidplay2_loadsid(t_xs_status *myStatus, gchar *pcFileName) +{ + t_xs_sidplay2 *myPlayer = (t_xs_sidplay2 *) myStatus->player; + SidTune *newTune; + SidTuneInfo tuneInfo; + + /* Try to get the tune */ + if (!pcFileName) return FALSE; + newTune = new SidTune(pcFileName); + if (!newTune) return FALSE; + + /* Get current configuration */ + myPlayer->currEng->getConfig(myPlayer->currConfig); + + /* Configure channels and stuff */ + switch (xs_cfg.fmtChannels) { + + case XS_CHN_AUTOPAN: + myPlayer->currConfig.channels = SIDEMU_STEREO; + myPlayer->currConfig.autoPanning = SIDEMU_CENTEREDAUTOPANNING; + myPlayer->currConfig.volumeControl = SIDEMU_FULLPANNING; + break; + + case XS_CHN_STEREO: + myPlayer->currConfig.channels = SIDEMU_STEREO; + myPlayer->currConfig.autoPanning = SIDEMU_NONE; + myPlayer->currConfig.volumeControl = SIDEMU_NONE; + break; + + case XS_CHN_MONO: + default: + myPlayer->currConfig.channels = SIDEMU_MONO; + myPlayer->currConfig.autoPanning = SIDEMU_NONE; + myPlayer->currConfig.volumeControl = SIDEMU_NONE; + break; + } + + + /* Memory mode settings */ + switch (xs_cfg.memoryMode) { + case XS_MPU_BANK_SWITCHING: + myPlayer->currConfig.memoryMode = MPU_BANK_SWITCHING; + break; + + case XS_MPU_TRANSPARENT_ROM: + myPlayer->currConfig.memoryMode = MPU_TRANSPARENT_ROM; + break; + + case XS_MPU_PLAYSID_ENVIRONMENT: + myPlayer->currConfig.memoryMode = MPU_PLAYSID_ENVIRONMENT; + break; + + default: + myPlayer->currConfig.memoryMode = MPU_BANK_SWITCHING; + break; + } + + + /* Clockspeed settings */ + switch (xs_cfg.clockSpeed) { + case XS_CLOCK_NTSC: + myPlayer->currConfig.clockSpeed = SIDTUNE_CLOCK_NTSC; + break; + + case XS_CLOCK_PAL: + default: + myPlayer->currConfig.clockSpeed = SIDTUNE_CLOCK_PAL; + break; + } + + + /* 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; + + /* Now set the emulator configuration */ + myPlayer->currEng->setConfig(myPlayer->currConfig); + + /* Initialize status information */ + newTune->getInfo(tuneInfo); + + myStatus->isPlaying = TRUE; + myStatus->isError = FALSE; + myStatus->currSong = tuneInfo.startSong; + myStatus->nSongs = tuneInfo.songs; + myPlayer->currTune = newTune; + myStatus->currFileName = g_strdup(pcFileName); + + return TRUE; +} + + +/* + * Delete tune + */ +void xs_sidplay2_deletesid(t_xs_status *myStatus) +{ + t_xs_sidplay2 *myPlayer; + + if (!myStatus) return; + + myPlayer = (t_xs_sidplay2 *) myStatus->player; + if (!myPlayer) return; + + if (myPlayer->currTune) + delete myPlayer->currTune; +} + + +gint xs_sidplay2_gettunespeed(t_xs_status *myStatus) +{ + return 0; +} + +/* + * Return song information + */ +void xs_sidplay2_getsidinfo(gchar *songFileName, gchar **songTitle, gint *songLength) +{ +} + + +} /* extern "C" */ +#endif /* HAVE_SIDPLAY2 */