diff --git a/polymer/eduke32/Makefile.common b/polymer/eduke32/Makefile.common index 3ddbb711f..b343bf9d3 100644 --- a/polymer/eduke32/Makefile.common +++ b/polymer/eduke32/Makefile.common @@ -282,7 +282,6 @@ ifeq (1,$(strip $(shell expr $(GCC_MAJOR) \>= 4))) endif ifeq ($(PLATFORM),WII) - override USE_LIBPNG = 0 override USE_LIBVPX = 0 endif diff --git a/polymer/eduke32/build/src/sdlayer.c b/polymer/eduke32/build/src/sdlayer.c index 264b49f08..94a22bbf2 100644 --- a/polymer/eduke32/build/src/sdlayer.c +++ b/polymer/eduke32/build/src/sdlayer.c @@ -37,6 +37,10 @@ # include #elif defined HAVE_GTK2 # include "gtkbits.h" +#elif defined GEKKO +# define HW_RVL +# include +# include #endif #if !defined _WIN32 && !defined HAVE_GTK2 && !defined __APPLE__ @@ -890,7 +894,9 @@ uint64_t gethiticks(void) ticks = now.tv_sec; ticks *= 1000000000; ticks += now.tv_nsec; - return (ticks); + return ticks; +# elif defined GEKKO + return ticks_to_nanosecs(gettime()); # else // Blar. This pragma is unsupported on earlier GCC versions. // At least we'll get a warning and a reference to this line... @@ -914,6 +920,8 @@ uint64_t gethitickspersec(void) return (1000000000LL*ti.denom)/ti.numer; # elif _POSIX_TIMERS>0 && defined _POSIX_MONOTONIC_CLOCK return 1000000000; +# elif defined GEKKO + return TB_NSPERSEC; # else return 1000; # endif diff --git a/polymer/eduke32/source/jaudiolib/Makefile b/polymer/eduke32/source/jaudiolib/Makefile index 185ecb15e..11f78c596 100644 --- a/polymer/eduke32/source/jaudiolib/Makefile +++ b/polymer/eduke32/source/jaudiolib/Makefile @@ -7,9 +7,9 @@ SRC=src INC=include # for BUILD_ECHOFLAGS: -OURCOMMONFLAGS=$(BASECOMMONFLAGS) $(BUILDCOMMONFLAGS) -I$(INC) -I$(SRC) +OURCOMMONFLAGS=$(BASECOMMONFLAGS) $(BUILDCOMMONFLAGS) -I$(INC) -I$(SRC) -DHAVE_VORBIS ifneq ($(PLATFORM),WII) - OURCOMMONFLAGS+= -DHAVE_VORBIS -DHAVE_FLAC + OURCOMMONFLAGS+= -DHAVE_FLAC endif ifneq ($(RELEASE),0) # Debugging disabled diff --git a/polymer/eduke32/source/jaudiolib/src/vorbis.c b/polymer/eduke32/source/jaudiolib/src/vorbis.c index 5cf4172e1..bf88e92cf 100644 --- a/polymer/eduke32/source/jaudiolib/src/vorbis.c +++ b/polymer/eduke32/source/jaudiolib/src/vorbis.c @@ -37,8 +37,11 @@ #define OV_EXCLUDE_STATIC_CALLBACKS -#ifdef __APPLE__ +#if defined __APPLE__ # include +#elif defined GEKKO +# define USING_TREMOR +# include #else # include "vorbis/vorbisfile.h" #endif @@ -60,18 +63,41 @@ typedef struct { // designed with multiple calls in mind static void MV_GetVorbisCommentLoops(VoiceNode *voice, vorbis_comment *vc) { + int32_t comment; uint8_t loopTagCount; + const char *vc_loopstart = NULL; + const char *vc_loopend = NULL; + const char *vc_looplength = NULL; + if (vc == NULL) return; + for (comment = 0; comment < vc->comments; ++comment) { - char *vc_loopstart = NULL; + const char *entry = (const char *) vc->user_comments[comment]; + if (entry != NULL && entry[0] != '\0') + { + const char *value = strchr(entry,'='); + const size_t field = value-entry; + value += 1; - for (loopTagCount = 0; loopTagCount < loopStartTagCount && vc_loopstart == NULL; ++loopTagCount) - vc_loopstart = vorbis_comment_query(vc, loopStartTags[loopTagCount], 0); + for (loopTagCount = 0; loopTagCount < loopStartTagCount && vc_loopstart == NULL; ++loopTagCount) + if (strncasecmp(entry, loopStartTags[loopTagCount], field) == 0) + vc_loopstart = value; - if (vc_loopstart != NULL) + for (loopTagCount = 0; loopTagCount < loopEndTagCount && vc_loopend == NULL; ++loopTagCount) + if (strncasecmp(entry, loopEndTags[loopTagCount], field) == 0) + vc_loopend = value; + + for (loopTagCount = 0; loopTagCount < loopLengthTagCount && vc_looplength == NULL; ++loopTagCount) + if (strncasecmp(entry, loopLengthTags[loopTagCount], field) == 0) + vc_looplength = value; + } + } + + if (vc_loopstart != NULL) + { { const ogg_int64_t ov_loopstart = atol(vc_loopstart); if (ov_loopstart >= 0) // a loop starting at 0 is valid @@ -81,36 +107,22 @@ static void MV_GetVorbisCommentLoops(VoiceNode *voice, vorbis_comment *vc) } } } - - if (voice->LoopSize > 0) + if (vc_loopend != NULL) { + if (voice->LoopSize > 0) { - char *vc_loopend = NULL; - - for (loopTagCount = 0; loopTagCount < loopEndTagCount && vc_loopend == NULL; ++loopTagCount) - vc_loopend = vorbis_comment_query(vc, loopEndTags[loopTagCount], 0); - - if (vc_loopend != NULL) - { - const ogg_int64_t ov_loopend = atol(vc_loopend); - if (ov_loopend > 0) // a loop ending at 0 is invalid - voice->LoopEnd = (const char *) (intptr_t) ov_loopend; - } + const ogg_int64_t ov_loopend = atol(vc_loopend); + if (ov_loopend > 0) // a loop ending at 0 is invalid + voice->LoopEnd = (const char *) (intptr_t) ov_loopend; } - - if (voice->LoopEnd == 0) + } + if (vc_looplength != NULL) + { + if (voice->LoopSize > 0 && voice->LoopEnd == 0) { - char *vc_looplength = NULL; - - for (loopTagCount = 0; loopTagCount < loopLengthTagCount && vc_looplength == NULL; ++loopTagCount) - vc_looplength = vorbis_comment_query(vc, loopLengthTags[loopTagCount], 0); - - if (vc_looplength != NULL) - { - const ogg_int64_t ov_looplength = atol(vc_looplength); - if (ov_looplength > 0) // a loop of length 0 is invalid - voice->LoopEnd = (const char *) ((intptr_t) ov_looplength + (intptr_t) voice->LoopStart); - } + const ogg_int64_t ov_looplength = atol(vc_looplength); + if (ov_looplength > 0) // a loop of length 0 is invalid + voice->LoopEnd = (const char *) ((intptr_t) ov_looplength + (intptr_t) voice->LoopStart); } } } @@ -209,7 +221,11 @@ static playbackstatus MV_GetNextVorbisBlock bytesread = 0; do { +#ifdef USING_TREMOR + bytes = ov_read(&vd->vf, vd->block + bytesread, BLOCKSIZE - bytesread, &bitstream); +#else bytes = ov_read(&vd->vf, vd->block + bytesread, BLOCKSIZE - bytesread, 0, 2, 1, &bitstream); +#endif //fprintf(stderr, "ov_read = %d\n", bytes); if (bytes > 0) { bytesread += bytes; @@ -273,6 +289,16 @@ static playbackstatus MV_GetNextVorbisBlock voice->sound = vd->block; voice->BlockLength = 0; voice->length = bytesread << 16; // ???: Should the literal 16 be voice->bits? + +#ifdef GEKKO + { + // If libtremor had the three additional ov_read() parameters that libvorbis has, + // this would be better handled using the endianness parameter. + int16_t *data = (int16_t*)(voice->sound); // assumes signed 16-bit + for (bytesread = 0; bytesread < BLOCKSIZE / 2; ++bytesread) + data[bytesread] = (data[bytesread] & 0xff) << 8 | ((data[bytesread] & 0xff00) >> 8); + } +#endif return KeepPlaying; }