diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-07-26 10:04:43 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-07-26 10:04:43 +0200 |
commit | fe3f99c92a8437a353ba12075d6c3273d04c4e3f (patch) | |
tree | 34d97babbe5696f21779866fafad217b60c2bead /plugins/sid | |
parent | 4deca01c3a7edaf66374bd35e6fb50d4d9564b17 (diff) |
merged non-android-specific changes from android branch
Diffstat (limited to 'plugins/sid')
31 files changed, 165 insertions, 260 deletions
diff --git a/plugins/sid/Makefile.am b/plugins/sid/Makefile.am index 5034c222..38caa014 100644 --- a/plugins/sid/Makefile.am +++ b/plugins/sid/Makefile.am @@ -27,22 +27,22 @@ sidplay-libs/libsidplay/src/xsid/xsid.cpp\ sidplay-libs/libsidplay/src/mos6526/mos6526.cpp\ sidplay-libs/builders/resid-builder/src/resid.cpp\ sidplay-libs/builders/resid-builder/src/resid-builder.cpp\ -sidplay-libs/resid/wave8580_PS_.cc\ -sidplay-libs/resid/filter.cc\ -sidplay-libs/resid/pot.cc\ -sidplay-libs/resid/wave.cc\ -sidplay-libs/resid/version.cc\ -sidplay-libs/resid/wave6581__ST.cc\ -sidplay-libs/resid/extfilt.cc\ -sidplay-libs/resid/wave8580_PST.cc\ -sidplay-libs/resid/wave6581_PST.cc\ -sidplay-libs/resid/wave6581_P_T.cc\ -sidplay-libs/resid/wave6581_PS_.cc\ -sidplay-libs/resid/envelope.cc\ -sidplay-libs/resid/voice.cc\ -sidplay-libs/resid/sid.cc\ -sidplay-libs/resid/wave8580__ST.cc\ -sidplay-libs/resid/wave8580_P_T.cc\ +sidplay-libs/resid/wave8580_PS_.cpp\ +sidplay-libs/resid/filter.cpp\ +sidplay-libs/resid/pot.cpp\ +sidplay-libs/resid/wave.cpp\ +sidplay-libs/resid/version.cpp\ +sidplay-libs/resid/wave6581__ST.cpp\ +sidplay-libs/resid/extfilt.cpp\ +sidplay-libs/resid/wave8580_PST.cpp\ +sidplay-libs/resid/wave6581_PST.cpp\ +sidplay-libs/resid/wave6581_P_T.cpp\ +sidplay-libs/resid/wave6581_PS_.cpp\ +sidplay-libs/resid/envelope.cpp\ +sidplay-libs/resid/voice.cpp\ +sidplay-libs/resid/sid.cpp\ +sidplay-libs/resid/wave8580__ST.cpp\ +sidplay-libs/resid/wave8580_P_T.cpp\ sidplay-libs/libsidplay/src/reloc65.c\ sidplay-libs/unix/config.h\ sidplay-libs/libsidplay/win/VC/sidconfig.h\ diff --git a/plugins/sid/csid.cpp b/plugins/sid/csid.cpp index c3d8c8b6..ccb2ecb3 100644 --- a/plugins/sid/csid.cpp +++ b/plugins/sid/csid.cpp @@ -18,11 +18,14 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> -#define LIBICONV_PLUG -#include <iconv.h> +#include <ctype.h> #ifdef HAVE_CONFIG_H # include <config.h> #endif +#if HAVE_ICONV +#define LIBICONV_PLUG +#include <iconv.h> +#endif #include "sidplay/sidplay2.h" #include "sidplay/builders/resid.h" //#include "md5.h" @@ -297,7 +300,7 @@ csid_init (DB_fileinfo_t *_info, DB_playItem_t *it) { // resid->create (1); info->resid->filter (true); - int samplerate = deadbeef->conf_get_int ("sid.samplerate", 48000); + int samplerate = deadbeef->conf_get_int ("sid.samplerate", 44100); int bps = deadbeef->get_output ()->bitspersample (); info->resid->sampling (samplerate); @@ -354,6 +357,7 @@ csid_read (DB_fileinfo_t *_info, char *bytes, int size) { int rd = info->sidplay->play (bytes, size/_info->channels); _info->readpos += size/_info->channels/2 / (float)_info->samplerate; +#if 0 #if WORDS_BIGENDIAN // convert samples from le to be int n = rd * _info->channels/2; @@ -366,6 +370,7 @@ csid_read (DB_fileinfo_t *_info, char *bytes, int size) { n--; } #endif +#endif return rd * _info->channels; } @@ -401,8 +406,9 @@ csid_seek (DB_fileinfo_t *_info, float time) { static const char * convstr (const char* str) { +#ifdef HAVE_ICONV int sz = strlen (str); - static char out[2048]; + static char out[2048]; // FIXME: this is not thread-safe const char *enc = "iso8859-1"; iconv_t cd = iconv_open ("utf-8", enc); if (cd == (iconv_t)-1) { @@ -423,17 +429,24 @@ convstr (const char* str) { iconv_close (cd); } return out; +#else + return str; +#endif } extern "C" DB_playItem_t * csid_insert (DB_playItem_t *after, const char *fname) { + trace ("inserting %s\n", fname); sldb_load (); SidTune *tune; + trace ("new SidTune\n"); tune = new SidTune (fname); int tunes = tune->getInfo ().songs; + trace ("subtunes: %d\n", tunes); uint8_t sig[16]; unsigned char tmp[2]; #if 1 + trace ("calculating md5\n"); DB_md5_t md5; deadbeef->md5_init (&md5); deadbeef->md5_append (&md5, (const uint8_t *)tune->cache.get () + tune->fileOffset, tune->getInfo ().c64dataLen); @@ -486,13 +499,15 @@ csid_insert (DB_playItem_t *after, const char *fname) { memcpy (sig, myMD5.getDigest (), 16); #endif - sldb_load (); +// sldb_load (); int song = -1; if (sldb_loaded) { song = sldb_find (sig); } + trace ("inserting tunes...\n"); for (int s = 0; s < tunes; s++) { + trace ("select %d...\n", s); if (tune->selectSong (s+1)) { DB_playItem_t *it = deadbeef->pl_item_alloc (); it->decoder_id = deadbeef->plug_get_decoder_id (sid_plugin.plugin.id); @@ -502,6 +517,7 @@ csid_insert (DB_playItem_t *after, const char *fname) { tune->getInfo (sidinfo); int i = sidinfo.numberOfInfoStrings; int title_added = 0; + trace ("set %d metainfo...\n", s); if (i >= 1 && sidinfo.infoString[0] && sidinfo.infoString[0][0]) { const char *meta; if (sidinfo.songs > 1) { @@ -553,10 +569,12 @@ csid_insert (DB_playItem_t *after, const char *fname) { deadbeef->pl_item_unref (it); } } + trace ("delete sidtune\n"); delete tune; return after; } +#if 0 int csid_numvoices (DB_fileinfo_t *_info) { return 3; @@ -580,6 +598,7 @@ csid_mutevoice (DB_fileinfo_t *_info, int voice, int mute) { } } } +#endif static int csid_on_configchanged (DB_event_t *ev, uintptr_t data) { diff --git a/plugins/sid/plugin.c b/plugins/sid/plugin.c index 91c74bb5..9a2e9a27 100644 --- a/plugins/sid/plugin.c +++ b/plugins/sid/plugin.c @@ -49,8 +49,9 @@ DB_decoder_t sid_plugin = { .seek = csid_seek, .seek_sample = NULL, .insert = csid_insert, - .numvoices = csid_numvoices, - .mutevoice = csid_mutevoice, +// .numvoices = csid_numvoices, +// .mutevoice = csid_mutevoice, .exts = exts, .filetypes = filetypes, }; + diff --git a/plugins/sid/sidplay-libs/Makefile.am b/plugins/sid/sidplay-libs/Makefile.am deleted file mode 100644 index 9adeb2e9..00000000 --- a/plugins/sid/sidplay-libs/Makefile.am +++ /dev/null @@ -1,107 +0,0 @@ -noinst_LIBRARIES = libsidplay2.a - -sidpath=@top_srcdir@/plugins/sid/sidplay-libs - -EXTRA_DIST = \ - $(sidpath)/libsidutils/README $(sidpath)/libsidplay/README $(sidpath)/resid/README\ - $(sidpath)/libsidutils/COPYING $(sidpath)/libsidplay/COPYING $(sidpath)/resid/COPYING\ - $(sidpath)/libsidutils/AUTHORS $(sidpath)/libsidplay/AUTHORS $(sidpath)/resid/AUTHORS - -AM_CPPFLAGS = $(INSANE_CXXFLAGS) -DHAVE_UNIX -I$(sidpath)/unix -I$(sidpath)/libsidplay -I$(sidpath)/libsidplay/include -I$(sidpath)/libsidplay/include/sidplay -I$(sidpath)/libsidutils/include/sidplay/utils -I$(sidpath)/builders/resid-builder/include/sidplay/builders -I$(sidpath)/builders/resid-builder/include -DHAVE_STRCASECMP -DHAVE_STRNCASECMP -fPIC - -libsidplay2_a_SOURCES = \ -libsidplay/src/mixer.cpp\ -libsidplay/src/player.cpp\ -libsidplay/src/mos656x/mos656x.cpp\ -libsidplay/src/mos6510/mos6510.cpp\ -libsidplay/src/sid6526/sid6526.cpp\ -libsidplay/src/sidtune/MUS.cpp\ -libsidplay/src/sidtune/SidTuneTools.cpp\ -libsidplay/src/sidtune/InfoFile.cpp\ -libsidplay/src/sidtune/SidTune.cpp\ -libsidplay/src/sidtune/PSID.cpp\ -libsidplay/src/sidtune/PP20.cpp\ -libsidplay/src/sidtune/IconInfo.cpp\ -libsidplay/src/event.cpp\ -libsidplay/src/psiddrv.cpp\ -libsidplay/src/config.cpp\ -libsidplay/src/sidplay2.cpp\ -libsidplay/src/xsid/xsid.cpp\ -libsidplay/src/mos6526/mos6526.cpp\ -builders/resid-builder/src/resid.cpp\ -builders/resid-builder/src/resid-builder.cpp\ -resid/wave8580_PS_.cc\ -resid/filter.cc\ -resid/pot.cc\ -resid/wave.cc\ -resid/version.cc\ -resid/wave6581__ST.cc\ -resid/extfilt.cc\ -resid/wave8580_PST.cc\ -resid/wave6581_PST.cc\ -resid/wave6581_P_T.cc\ -resid/wave6581_PS_.cc\ -resid/envelope.cc\ -resid/voice.cc\ -resid/sid.cc\ -resid/wave8580__ST.cc\ -resid/wave8580_P_T.cc\ -libsidplay/src/reloc65.c\ -unix/config.h\ -libsidplay/win/VC/sidconfig.h\ -libsidplay/win/VC/sidint.h\ -libsidplay/win/VC/config.h\ -libsidplay/unix/sidconfig.h\ -libsidplay/unix/sidint.h\ -libsidplay/src/xsid/xsid.h\ -libsidplay/src/mos6526/mos6526.h\ -libsidplay/src/sid6526/sid6526.h\ -libsidplay/src/mos656x/mos656x.h\ -libsidplay/src/c64/c64xsid.h\ -libsidplay/src/c64/c64cia.h\ -libsidplay/src/c64/c64vic.h\ -libsidplay/src/nullsid.h\ -libsidplay/src/sidtune/PP20_Defs.h\ -libsidplay/src/sidtune/SidTuneTools.h\ -libsidplay/src/sidtune/SidTuneCfg.h\ -libsidplay/src/sidtune/PP20.h\ -libsidplay/src/mos6510/cycle_based/sid6510c.h\ -libsidplay/src/mos6510/cycle_based/mos6510c.h\ -libsidplay/src/mos6510/mos6510.h\ -libsidplay/src/mos6510/conf6510.h\ -libsidplay/src/mos6510/opcodes.h\ -libsidplay/src/player.h\ -libsidplay/include/sidplay/SmartPtr.h\ -libsidplay/include/sidplay/sidusage.h\ -libsidplay/include/sidplay/sidtypes.h\ -libsidplay/include/sidplay/sidplay2.h\ -libsidplay/include/sidplay/sidconfig.h\ -libsidplay/include/sidplay/SidTune.h\ -libsidplay/include/sidplay/sid2types.h\ -libsidplay/include/sidplay/c64env.h\ -libsidplay/include/sidplay/sidbuilder.h\ -libsidplay/include/sidplay/sidint.h\ -libsidplay/include/sidplay/component.h\ -libsidplay/include/sidplay/event.h\ -libsidplay/include/sidplay/sidendian.h\ -libsidplay/include/sidplay/Buffer.h\ -libsidplay/include/sidenv.h\ -libsidplay/include/config.h\ -builders/resid-builder/win/VC/config.h\ -builders/resid-builder/src/resid-emu.h\ -builders/resid-builder/include/sidplay/builders/resid.h\ -builders/resid-builder/include/config.h\ -resid/voice.h\ -resid/siddefs.h\ -resid/wave.h\ -resid/sid.h\ -resid/filter.h\ -resid/envelope.h\ -resid/spline.h\ -resid/pot.h\ -resid/extfilt.h\ -libsidplay/src/mos6510/cycle_based/mos6510c.i\ -libsidplay/src/mos6510/cycle_based/sid6510c.i\ -libsidplay/src/kernal.bin\ -libsidplay/src/psiddrv.bin\ -libsidplay/src/poweron.bin diff --git a/plugins/sid/sidplay-libs/builders/resid-builder/include/sidplay/builders/resid.h b/plugins/sid/sidplay-libs/builders/resid-builder/include/sidplay/builders/resid.h index aa6ccffa..8f8f2636 100644 --- a/plugins/sid/sidplay-libs/builders/resid-builder/include/sidplay/builders/resid.h +++ b/plugins/sid/sidplay-libs/builders/resid-builder/include/sidplay/builders/resid.h @@ -22,7 +22,6 @@ * creating a wrapper instead of implementing a SID emulation */ -#include <vector> #include <sidplay/sidbuilder.h> #include <sidplay/event.h> @@ -37,11 +36,13 @@ private: static const char *ERR_FILTER_DEFINITION; char m_errorBuffer[100]; const char *m_error; - std::vector<sidemu *> sidobjs; + enum { MAX_SIDOBJS = 10 }; + sidemu * sidobjs[MAX_SIDOBJS]; + int n_sidobjs; public: sidemu *getsidemu (int i) { - if (i >= sidobjs.size ()) { + if (i >= n_sidobjs) { return NULL; } return sidobjs[i]; diff --git a/plugins/sid/sidplay-libs/builders/resid-builder/src/resid-builder.cpp b/plugins/sid/sidplay-libs/builders/resid-builder/src/resid-builder.cpp index 4c7650f6..ebf63b86 100644 --- a/plugins/sid/sidplay-libs/builders/resid-builder/src/resid-builder.cpp +++ b/plugins/sid/sidplay-libs/builders/resid-builder/src/resid-builder.cpp @@ -37,7 +37,7 @@ ***************************************************************************/ #include <stdio.h> -#include <cstring> +#include <string.h> #include "config.h" #ifdef HAVE_EXCEPTIONS @@ -53,6 +53,7 @@ const char *ReSIDBuilder::ERR_FILTER_DEFINITION = "RESID ERROR: Filter definitio ReSIDBuilder::ReSIDBuilder (const char * const name) :sidbuilder (name) { + n_sidobjs = 0; m_error = "N/A"; } @@ -97,7 +98,7 @@ uint ReSIDBuilder::create (uint sids) m_error = sid->error (); goto ReSIDBuilder_create_error; } - sidobjs.push_back (sid); + sidobjs[n_sidobjs++] = sid; } return count; @@ -113,7 +114,7 @@ const char *ReSIDBuilder::credits () m_status = true; // Available devices - if (sidobjs.size ()) + if (n_sidobjs) { ReSID *sid = (ReSID *) sidobjs[0]; return sid->credits (); @@ -136,14 +137,14 @@ uint ReSIDBuilder::devices (bool created) { m_status = true; if (created) - return sidobjs.size (); + return n_sidobjs; else // Available devices return 0; } void ReSIDBuilder::filter (const sid_filter_t *filter) { - int size = sidobjs.size (); + int size = n_sidobjs; m_status = true; for (int i = 0; i < size; i++) { @@ -160,7 +161,7 @@ ReSIDBuilder_sidFilterDef_error: void ReSIDBuilder::filter (bool enable) { - int size = sidobjs.size (); + int size = n_sidobjs; m_status = true; for (int i = 0; i < size; i++) { @@ -172,7 +173,7 @@ void ReSIDBuilder::filter (bool enable) // Find a free SID of the required specs sidemu *ReSIDBuilder::lock (c64env *env, sid2_model_t model) { - int size = sidobjs.size (); + int size = n_sidobjs; m_status = true; for (int i = 0; i < size; i++) @@ -193,7 +194,7 @@ sidemu *ReSIDBuilder::lock (c64env *env, sid2_model_t model) // Allow something to use this SID void ReSIDBuilder::unlock (sidemu *device) { - int size = sidobjs.size (); + int size = n_sidobjs; // Maek sure this is our SID for (int i = 0; i < size; i++) { @@ -209,15 +210,15 @@ void ReSIDBuilder::unlock (sidemu *device) // Remove all SID emulations. void ReSIDBuilder::remove () { - int size = sidobjs.size (); + int size = n_sidobjs; for (int i = 0; i < size; i++) delete sidobjs[i]; - sidobjs.clear(); + n_sidobjs = 0; } void ReSIDBuilder::sampling (uint_least32_t freq) { - int size = sidobjs.size (); + int size = n_sidobjs; m_status = true; for (int i = 0; i < size; i++) { diff --git a/plugins/sid/sidplay-libs/libsidplay/include/sidplay/SidTune.h b/plugins/sid/sidplay-libs/libsidplay/include/sidplay/SidTune.h index f544afb6..5af215b1 100644 --- a/plugins/sid/sidplay-libs/libsidplay/include/sidplay/SidTune.h +++ b/plugins/sid/sidplay-libs/libsidplay/include/sidplay/SidTune.h @@ -24,7 +24,7 @@ #include "Buffer.h" #include "SmartPtr.h" -#include <fstream> +//#include <fstream> const uint_least16_t SIDTUNE_MAX_SONGS = 256; @@ -237,7 +237,7 @@ class SID_EXTERN SidTune // to load files. Error string is put into info.statusString, though. bool loadFile(const char* fileName, Buffer_sidtt<const uint_least8_t>& bufferRef); - bool saveToOpenFile( std::ofstream& toFile, const uint_least8_t* buffer, uint_least32_t bufLen ); +// bool saveToOpenFile( std::ofstream& toFile, const uint_least8_t* buffer, uint_least32_t bufLen ); protected: // ------------------------------------------------------------- @@ -288,11 +288,11 @@ class SID_EXTERN SidTune // Support for various file formats. virtual bool PSID_fileSupport(const void* buffer, const uint_least32_t bufLen); - virtual bool PSID_fileSupportSave(std::ofstream& toFile, const uint_least8_t* dataBuffer); + //virtual bool PSID_fileSupportSave(std::ofstream& toFile, const uint_least8_t* dataBuffer); virtual bool SID_fileSupport(const void* dataBuffer, uint_least32_t dataBufLen, const void* sidBuffer, uint_least32_t sidBufLen); - virtual bool SID_fileSupportSave(std::ofstream& toFile); + //virtual bool SID_fileSupportSave(std::ofstream& toFile); virtual bool MUS_fileSupport(Buffer_sidtt<const uint_least8_t>& musBufRef, Buffer_sidtt<const uint_least8_t>& strBufRef); diff --git a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h index 9a046d2e..93d222a3 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h +++ b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h @@ -71,11 +71,12 @@ #include "sidtypes.h" #include "sidendian.h" - +#include <setjmp.h> class MOS6510: public C64Environment, public Event { private: + jmp_buf jmp_env; // External signals bool aec; /* Address Controller, blocks all */ bool rdy; /* Bus Access, blocks reads */ @@ -293,9 +294,22 @@ public: inline void MOS6510::clock (void) { int_least8_t i = cycleCount++; - try { + +// C++ exception version +// try { +// (this->*procCycle[i]) (); +// } catch (int_least8_t delta) { +// cycleCount += delta; +// m_blocked = true; +// eventContext.cancel (this); +// } + + // longjmp version + int_least8_t delta = setjmp (jmp_env); + if (delta == 0) { (this->*procCycle[i]) (); - } catch (int_least8_t delta) { + } + else { cycleCount += delta; m_blocked = true; eventContext.cancel (this); diff --git a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.i b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.i index 78d57ba6..22794e0f 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.i +++ b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.i @@ -168,10 +168,15 @@ const char _sidtune_CHRtab[256] = // CHR$ conversion table (0x01 = no output) #define getFlagZ() (Register_z_Flag == 0) #define getFlagC() (Register_c_Flag != 0) +// c++ exception version +//#define stealCycle() \ +// interrupts.delay++; \ +// throw((int_least8_t) -1); + +// longjmp version #define stealCycle() \ interrupts.delay++; \ - throw((int_least8_t) -1); - + longjmp (jmp_env, -1); // Handle bus access signals void MOS6510::aecSignal (bool state) diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/IconInfo.cpp b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/IconInfo.cpp index 30df20b4..03faf1b4 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/IconInfo.cpp +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/IconInfo.cpp @@ -37,7 +37,6 @@ # include <new> #endif #include <string.h> -#include <sstream> // Amiga Workbench specific structures. @@ -359,12 +358,13 @@ bool SidTune::INFO_fileSupport(const void* dataBuffer, uint_least32_t dataLength // Now check all possible keywords. if ( SidTuneTools::myStrNcaseCmp(cmpBuf,_sidtune_keyword_address) == 0 ) { - std::string s (cmpBuf + strlen(_sidtune_keyword_address), toolLen - strlen(_sidtune_keyword_address)); - std::istringstream addrIn(s); - info.loadAddr = (uint_least16_t)SidTuneTools::readHex( addrIn ); - info.initAddr = (uint_least16_t)SidTuneTools::readHex( addrIn ); - info.playAddr = (uint_least16_t)SidTuneTools::readHex( addrIn ); - if ( !addrIn ) + const char *addrIn= cmpBuf + strlen(_sidtune_keyword_address); + int len = toolLen - strlen(_sidtune_keyword_address); + int pos = 0; + info.loadAddr = (uint_least16_t)SidTuneTools::readHex( addrIn, len, pos ); + info.initAddr = (uint_least16_t)SidTuneTools::readHex( addrIn, len, pos ); + info.playAddr = (uint_least16_t)SidTuneTools::readHex( addrIn, len, pos ); + if ( pos >= len ) { return false; } @@ -372,25 +372,27 @@ bool SidTune::INFO_fileSupport(const void* dataBuffer, uint_least32_t dataLength } else if ( SidTuneTools::myStrNcaseCmp(cmpBuf,_sidtune_keyword_songs) == 0 ) { - std::string s ( cmpBuf + strlen(_sidtune_keyword_songs), toolLen - strlen(_sidtune_keyword_songs)); - std::istringstream numIn(s); - if ( !numIn ) + const char *numIn = cmpBuf + strlen(_sidtune_keyword_songs); + int len = toolLen - strlen(_sidtune_keyword_songs); + int pos = 0; + if ( !pos >= len ) { return false; } - info.songs = (uint_least16_t)SidTuneTools::readDec( numIn ); - info.startSong = (uint_least16_t)SidTuneTools::readDec( numIn ); + info.songs = (uint_least16_t)SidTuneTools::readDec( numIn, len, pos ); + info.startSong = (uint_least16_t)SidTuneTools::readDec( numIn, len, pos ); hasSongs = true; } else if ( SidTuneTools::myStrNcaseCmp(cmpBuf,_sidtune_keyword_speed) == 0 ) { - std::string s (cmpBuf + strlen(_sidtune_keyword_speed), toolLen - strlen(_sidtune_keyword_speed)); - std::istringstream speedIn (s); - if ( !speedIn ) + const char *speedIn = cmpBuf + strlen(_sidtune_keyword_speed); + int len = toolLen - strlen(_sidtune_keyword_speed); + int pos = 0; + if ( pos >= len ) { return false; } - oldStyleSpeed = SidTuneTools::readHex(speedIn); + oldStyleSpeed = SidTuneTools::readHex(speedIn, len, pos); hasSpeed = true; } else if ( SidTuneTools::myStrNcaseCmp(cmpBuf,_sidtune_keyword_name) == 0 ) diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/InfoFile.cpp b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/InfoFile.cpp index 0c03b23c..6ddb77f5 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/InfoFile.cpp +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/InfoFile.cpp @@ -23,9 +23,6 @@ #ifdef HAVE_EXCEPTIONS # include <new> #endif -#include <iostream> -#include <iomanip> -#include <sstream> #include <ctype.h> #include <string.h> @@ -135,35 +132,27 @@ bool SidTune::SID_fileSupport(const void* dataBuffer, uint_least32_t dataBufLen, } // Create whitespace eating (!) input string stream. - std::string s (pParseBuf, restLen); - - std::istringstream parseStream (s); - // A second one just for copying. - std::istringstream parseCopyStream (s); - if ( !parseStream || !parseCopyStream ) - { - break; - } + const char *s = pParseBuf; + int pos = 0; + int posCopy = 0; // Now copy the next X characters except white-spaces. for ( uint_least16_t i = 0; i < parseChunkLen; i++ ) { - char c; - parseCopyStream >> c; - pParseChunk[i] = c; + pParseChunk[i] = s[i]; } pParseChunk[parseChunkLen]=0; // Now check for the possible keywords. // ADDRESS if ( SidTuneTools::myStrNcaseCmp( pParseChunk, keyword_address ) == 0 ) { - SidTuneTools::skipToEqu( parseStream ); - info.loadAddr = (uint_least16_t)SidTuneTools::readHex( parseStream ); - if ( !parseStream ) + SidTuneTools::skipToEqu( s, restLen, pos ); + info.loadAddr = (uint_least16_t)SidTuneTools::readHex( s, restLen, pos ); + if ( pos>=restLen ) break; - info.initAddr = (uint_least16_t)SidTuneTools::readHex( parseStream ); - if ( !parseStream ) + info.initAddr = (uint_least16_t)SidTuneTools::readHex( s, restLen, pos ); + if ( pos>=restLen ) break; - info.playAddr = (uint_least16_t)SidTuneTools::readHex( parseStream ); + info.playAddr = (uint_least16_t)SidTuneTools::readHex( s, restLen, pos ); hasAddress = true; } // NAME @@ -197,16 +186,16 @@ bool SidTune::SID_fileSupport(const void* dataBuffer, uint_least32_t dataBufLen, // SONGS else if ( SidTuneTools::myStrNcaseCmp( pParseChunk, keyword_songs ) == 0 ) { - SidTuneTools::skipToEqu( parseStream ); - info.songs = (uint_least16_t)SidTuneTools::readDec( parseStream ); - info.startSong = (uint_least16_t)SidTuneTools::readDec( parseStream ); + SidTuneTools::skipToEqu( s, restLen, pos ); + info.songs = (uint_least16_t)SidTuneTools::readDec( s, restLen, pos ); + info.startSong = (uint_least16_t)SidTuneTools::readDec( s, restLen, pos ); hasSongs = true; } // SPEED else if ( SidTuneTools::myStrNcaseCmp( pParseChunk, keyword_speed ) == 0 ) { - SidTuneTools::skipToEqu( parseStream ); - oldStyleSpeed = SidTuneTools::readHex(parseStream); + SidTuneTools::skipToEqu( s, restLen, pos ); + oldStyleSpeed = SidTuneTools::readHex( s, restLen, pos ); hasSpeed = true; } // SIDSONG @@ -217,10 +206,10 @@ bool SidTune::SID_fileSupport(const void* dataBuffer, uint_least32_t dataBufLen, // RELOC else if ( SidTuneTools::myStrNcaseCmp( pParseChunk, keyword_reloc ) == 0 ) { - info.relocStartPage = (uint_least8_t)SidTuneTools::readHex( parseStream ); - if ( !parseStream ) + info.relocStartPage = (uint_least8_t)SidTuneTools::readHex( s, restLen, pos ); + if ( pos >= restLen ) break; - info.relocPages = (uint_least8_t)SidTuneTools::readHex( parseStream ); + info.relocPages = (uint_least8_t)SidTuneTools::readHex( s, restLen, pos ); } // CLOCK else if ( SidTuneTools::myStrNcaseCmp( pParseChunk, keyword_clock ) == 0 ) @@ -307,6 +296,7 @@ bool SidTune::SID_fileSupport(const void* dataBuffer, uint_least32_t dataBufLen, } +#if 0 bool SidTune::SID_fileSupportSave( std::ofstream& toFile ) { toFile << keyword_id << std::endl @@ -396,3 +386,4 @@ bool SidTune::SID_fileSupportSave( std::ofstream& toFile ) return true; } } +#endif diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/PSID.cpp b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/PSID.cpp index 0cc96969..a6322c36 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/PSID.cpp +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/PSID.cpp @@ -242,6 +242,7 @@ bool SidTune::PSID_fileSupport(const void* buffer, const uint_least32_t bufLen) } +#if 0 bool SidTune::PSID_fileSupportSave(std::ofstream& fMyOut, const uint_least8_t* dataBuffer) { psidHeader myHeader; @@ -311,3 +312,4 @@ bool SidTune::PSID_fileSupportSave(std::ofstream& fMyOut, const uint_least8_t* d else return true; } +#endif diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTune.cpp b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTune.cpp index 29638775..4dfba1d7 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTune.cpp +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTune.cpp @@ -24,12 +24,11 @@ #include "SidTuneTools.h" #include "sidendian.h" #include "PP20.h" +#include <stdio.h> #ifdef HAVE_EXCEPTIONS # include <new> #endif -#include <iostream> -#include <iomanip> #include <string.h> #include <limits.h> @@ -100,6 +99,7 @@ inline void SidTune::setFileNameExtensions(const char **fileNameExt) { fileNameExtensions = ((fileNameExt!=0)?fileNameExt:defaultFileNameExt); } +#define SIDTUNE_NO_STDIN_LOADER SidTune::SidTune(const char* fileName, const char **fileNameExt, const bool separatorIsSlash) @@ -252,39 +252,18 @@ bool SidTune::loadFile(const char* fileName, Buffer_sidtt<const uint_least8_t>& Buffer_sidtt<uint_least8_t> fileBuf; uint_least32_t fileLen = 0; - // This sucks big time - //openmode createAtrr = std::ios::in; - std::_Ios_Openmode createAtrr = std::ios::in; -#ifdef HAVE_IOS_NOCREATE - createAtrr |= std::ios::nocreate; -#endif - // Open binary input file stream at end of file. -#if defined(HAVE_IOS_BIN) - createAtrr |= std::ios::bin; -#else - createAtrr |= std::ios::binary; -#endif + FILE *fp = fopen (fileName, "rb"); - std::fstream myIn(fileName,createAtrr); - // As a replacement for !is_open(), bad() and the NOT-operator don't seem - // to work on all systems. -#if defined(DONT_HAVE_IS_OPEN) - if ( !myIn ) -#else - if ( !myIn.is_open() ) -#endif + if (!fp) { info.statusString = SidTune::txt_cantOpenFile; return false; } else { -#if defined(HAVE_SEEKG_OFFSET) - fileLen = (myIn.seekg(0,std::ios::end)).offset(); -#else - myIn.seekg(0,std::ios::end); - fileLen = (uint_least32_t)myIn.tellg(); -#endif + fseek (fp, 0, SEEK_END); + fileLen = ftell (fp); + rewind (fp); #ifdef HAVE_EXCEPTIONS if ( !fileBuf.assign(new(std::nothrow) uint_least8_t[fileLen],fileLen) ) #else @@ -294,19 +273,9 @@ bool SidTune::loadFile(const char* fileName, Buffer_sidtt<const uint_least8_t>& info.statusString = SidTune::txt_notEnoughMemory; return false; } - myIn.seekg(0,std::ios::beg); uint_least32_t restFileLen = fileLen; - // 16-bit compatible loading. Is this really necessary? - while ( restFileLen > INT_MAX ) - { - myIn.read((char*)fileBuf.get()+(fileLen-restFileLen),INT_MAX); // !cast! - restFileLen -= INT_MAX; - } - if ( restFileLen > 0 ) - { - myIn.read((char*)fileBuf.get()+(fileLen-restFileLen),restFileLen); // !cast! - } - if ( myIn.bad() ) + int res = fread((char*)fileBuf.get()+(fileLen-restFileLen),1,restFileLen,fp); + if ( res != restFileLen ) { info.statusString = SidTune::txt_cantLoadFile; return false; @@ -316,7 +285,7 @@ bool SidTune::loadFile(const char* fileName, Buffer_sidtt<const uint_least8_t>& info.statusString = SidTune::txt_noErrors; } } - myIn.close(); + fclose(fp); if ( fileLen==0 ) { info.statusString = SidTune::txt_empty; @@ -443,6 +412,7 @@ void SidTune::cleanup() status = false; } +#define SIDTUNE_NO_STDIN_LOADER #if !defined(SIDTUNE_NO_STDIN_LOADER) void SidTune::getFromStdIn() @@ -839,7 +809,8 @@ void SidTune::convertOldStyleSpeedToTables(uint_least32_t speed, int clock) // // File format conversion --------------------------------------------------- // - + +#if 0 bool SidTune::saveToOpenFile(std::ofstream& toFile, const uint_least8_t* buffer, uint_least32_t bufLen ) { @@ -984,6 +955,7 @@ bool SidTune::savePSIDfile( const char* fileName, bool overWriteFlag ) } return success; } +#endif bool SidTune::checkRealC64Info (uint_least32_t speed) { diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.cpp b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.cpp index 450795b9..6a100062 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.cpp +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.cpp @@ -101,15 +101,16 @@ char* SidTuneTools::fileExtOfPath(char* s) // Parse input string stream. Read and convert a hexa-decimal number up // to a ``,'' or ``:'' or ``\0'' or end of stream. -uint_least32_t SidTuneTools::readHex( std::istringstream& hexin ) +uint_least32_t SidTuneTools::readHex( const char *s, int size, int &pos) { uint_least32_t hexLong = 0; char c; do { - hexin >> c; - if ( !hexin ) + if (pos >= size) { break; + } + c = s[pos++]; if (( c != ',') && ( c != ':' ) && ( c != 0 )) { // machine independed to_upper @@ -120,25 +121,27 @@ uint_least32_t SidTuneTools::readHex( std::istringstream& hexin ) } else { - if ( c == 0 ) - hexin.putback(c); + if ( c == 0 ) { + pos--; + } break; } - } while ( hexin ); + } while ( pos < size ); return hexLong; } // Parse input string stream. Read and convert a decimal number up // to a ``,'' or ``:'' or ``\0'' or end of stream. -uint_least32_t SidTuneTools::readDec( std::istringstream& decin ) +uint_least32_t SidTuneTools::readDec( const char *s, int size, int &pos ) { uint_least32_t hexLong = 0; char c; do { - decin >> c; - if ( !decin ) + if (pos >= size) { break; + } + c = s[pos++]; if (( c != ',') && ( c != ':' ) && ( c != 0 )) { c &= 0x0f; @@ -147,11 +150,12 @@ uint_least32_t SidTuneTools::readDec( std::istringstream& decin ) } else { - if ( c == 0 ) - decin.putback(c); + if ( c == 0 ) { + pos--; + } break; } - } while ( decin ); + } while ( pos < size); return hexLong; } @@ -187,12 +191,15 @@ const char* SidTuneTools::returnNextLine(const char* s) } // Skip any characters in an input string stream up to '='. -void SidTuneTools::skipToEqu( std::istringstream& parseStream ) +void SidTuneTools::skipToEqu( const char *s, int size, int &pos ) { char c; do { - parseStream >> c; + if (pos >= size) { + break; + } + c = s[pos++]; } while ( c != '=' ); } diff --git a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.h b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.h index 5a06046b..7c3fabfa 100644 --- a/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.h +++ b/plugins/sid/sidplay-libs/libsidplay/src/sidtune/SidTuneTools.h @@ -26,8 +26,6 @@ #include <string.h> -#include <sstream> - #define MYSTRICMP stricmp #if defined(HAVE_STRCASECMP) #undef MYSTRICMP @@ -66,18 +64,17 @@ class SidTuneTools // Parse input string stream. Read and convert a hexa-decimal number up // to a ``,'' or ``:'' or ``\0'' or end of stream. - static uint_least32_t readHex(std::istringstream& parseStream); + static uint_least32_t readHex(const char *parseStream, int size, int &pos); // Parse input string stream. Read and convert a decimal number up // to a ``,'' or ``:'' or ``\0'' or end of stream. - static uint_least32_t readDec(std::istringstream& parseStream); - + static uint_least32_t readDec(const char *parseStream, int size, int &pos); // Search terminated string for next newline sequence. // Skip it and return pointer to start of next line. static const char* returnNextLine(const char* pBuffer); // Skip any characters in an input string stream up to '='. - static void skipToEqu(std::istringstream& parseStream); + static void skipToEqu(const char *parseStream, int size, int &pos); // Start at first character behind '=' and copy rest of string. static void copyStringValueToEOL(const char* pSourceStr, char* pDestStr, int destMaxLen); diff --git a/plugins/sid/sidplay-libs/resid/envelope.cc b/plugins/sid/sidplay-libs/resid/envelope.cpp index a4bbd511..a4bbd511 100644 --- a/plugins/sid/sidplay-libs/resid/envelope.cc +++ b/plugins/sid/sidplay-libs/resid/envelope.cpp diff --git a/plugins/sid/sidplay-libs/resid/extfilt.cc b/plugins/sid/sidplay-libs/resid/extfilt.cpp index 461cdaf7..461cdaf7 100644 --- a/plugins/sid/sidplay-libs/resid/extfilt.cc +++ b/plugins/sid/sidplay-libs/resid/extfilt.cpp diff --git a/plugins/sid/sidplay-libs/resid/filter.cc b/plugins/sid/sidplay-libs/resid/filter.cpp index 9ca793e0..9ca793e0 100644 --- a/plugins/sid/sidplay-libs/resid/filter.cc +++ b/plugins/sid/sidplay-libs/resid/filter.cpp diff --git a/plugins/sid/sidplay-libs/resid/pot.cc b/plugins/sid/sidplay-libs/resid/pot.cpp index 805f9a7c..805f9a7c 100644 --- a/plugins/sid/sidplay-libs/resid/pot.cc +++ b/plugins/sid/sidplay-libs/resid/pot.cpp diff --git a/plugins/sid/sidplay-libs/resid/sid.cc b/plugins/sid/sidplay-libs/resid/sid.cpp index f3cd02a3..f3cd02a3 100644 --- a/plugins/sid/sidplay-libs/resid/sid.cc +++ b/plugins/sid/sidplay-libs/resid/sid.cpp diff --git a/plugins/sid/sidplay-libs/resid/version.cc b/plugins/sid/sidplay-libs/resid/version.cpp index ebb0e607..ebb0e607 100644 --- a/plugins/sid/sidplay-libs/resid/version.cc +++ b/plugins/sid/sidplay-libs/resid/version.cpp diff --git a/plugins/sid/sidplay-libs/resid/voice.cc b/plugins/sid/sidplay-libs/resid/voice.cpp index 049e0530..049e0530 100644 --- a/plugins/sid/sidplay-libs/resid/voice.cc +++ b/plugins/sid/sidplay-libs/resid/voice.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave.cc b/plugins/sid/sidplay-libs/resid/wave.cpp index 6f5ec5dd..6f5ec5dd 100644 --- a/plugins/sid/sidplay-libs/resid/wave.cc +++ b/plugins/sid/sidplay-libs/resid/wave.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave6581_PST.cc b/plugins/sid/sidplay-libs/resid/wave6581_PST.cpp index 37b54734..37b54734 100644 --- a/plugins/sid/sidplay-libs/resid/wave6581_PST.cc +++ b/plugins/sid/sidplay-libs/resid/wave6581_PST.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave6581_PS_.cc b/plugins/sid/sidplay-libs/resid/wave6581_PS_.cpp index 9304df8c..9304df8c 100644 --- a/plugins/sid/sidplay-libs/resid/wave6581_PS_.cc +++ b/plugins/sid/sidplay-libs/resid/wave6581_PS_.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave6581_P_T.cc b/plugins/sid/sidplay-libs/resid/wave6581_P_T.cpp index 35a246af..35a246af 100644 --- a/plugins/sid/sidplay-libs/resid/wave6581_P_T.cc +++ b/plugins/sid/sidplay-libs/resid/wave6581_P_T.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave6581__ST.cc b/plugins/sid/sidplay-libs/resid/wave6581__ST.cpp index 55ec36b7..55ec36b7 100644 --- a/plugins/sid/sidplay-libs/resid/wave6581__ST.cc +++ b/plugins/sid/sidplay-libs/resid/wave6581__ST.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave8580_PST.cc b/plugins/sid/sidplay-libs/resid/wave8580_PST.cpp index 5141f0f7..5141f0f7 100644 --- a/plugins/sid/sidplay-libs/resid/wave8580_PST.cc +++ b/plugins/sid/sidplay-libs/resid/wave8580_PST.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave8580_PS_.cc b/plugins/sid/sidplay-libs/resid/wave8580_PS_.cpp index 15de9f9a..15de9f9a 100644 --- a/plugins/sid/sidplay-libs/resid/wave8580_PS_.cc +++ b/plugins/sid/sidplay-libs/resid/wave8580_PS_.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave8580_P_T.cc b/plugins/sid/sidplay-libs/resid/wave8580_P_T.cpp index f3a3d835..f3a3d835 100644 --- a/plugins/sid/sidplay-libs/resid/wave8580_P_T.cc +++ b/plugins/sid/sidplay-libs/resid/wave8580_P_T.cpp diff --git a/plugins/sid/sidplay-libs/resid/wave8580__ST.cc b/plugins/sid/sidplay-libs/resid/wave8580__ST.cpp index 08e7c5a8..08e7c5a8 100644 --- a/plugins/sid/sidplay-libs/resid/wave8580__ST.cc +++ b/plugins/sid/sidplay-libs/resid/wave8580__ST.cpp |