Tremor can be used instead of Vorbis. Usefull for ARM based machines

This commit is contained in:
ptitSeb 2016-04-06 13:32:52 +02:00
parent ebb70977ea
commit 205d71eccc
2 changed files with 47 additions and 16 deletions

View File

@ -312,7 +312,7 @@ inline FLOAT NormByteToFloat( const ULONG ul)
// fast float to int conversion // fast float to int conversion
inline SLONG FloatToInt( FLOAT f) inline SLONG FloatToInt( FLOAT f)
{ {
#if (defined USE_PORTABLE_C) #if defined(__arm__) || defined(USE_PORTABLE_C)
return((SLONG) (f + 0.5f)); /* best of luck to you. */ return((SLONG) (f + 0.5f)); /* best of luck to you. */
#elif (defined __MSVC_INLINE__) #elif (defined __MSVC_INLINE__)
@ -340,7 +340,7 @@ inline SLONG FloatToInt( FLOAT f)
// log base 2 of any float numero // log base 2 of any float numero
inline FLOAT Log2( FLOAT f) { inline FLOAT Log2( FLOAT f) {
#if (defined USE_PORTABLE_C) #if (defined USE_PORTABLE_C) || defined(__arm__)
// !!! FIXME: What's wrong with log2()? // !!! FIXME: What's wrong with log2()?
return (FLOAT)(log10(f)*3.321928094887); // log10(x)/log10(2) return (FLOAT)(log10(f)*3.321928094887); // log10(x)/log10(2)
@ -377,12 +377,12 @@ inline SLONG FastLog2( SLONG x)
{ {
#if (defined USE_PORTABLE_C) #if (defined USE_PORTABLE_C)
register SLONG val = x; register SLONG val = x;
register SLONG retval = 0; register SLONG retval = 31;
while (retval < 32) while (retval > 0)
{ {
if (val & (1 << retval)) if (val & (1 << retval))
return retval; return retval;
retval++; retval--;
} }
return 0; return 0;
@ -497,31 +497,50 @@ ENGINE_API FLOAT Sin(ANGLE a);
ENGINE_API FLOAT Cos(ANGLE a); ENGINE_API FLOAT Cos(ANGLE a);
ENGINE_API FLOAT Tan(ANGLE a); ENGINE_API FLOAT Tan(ANGLE a);
#ifdef __arm__
inline ENGINE_API FLOAT SinFast(ANGLE a) { return sinf(a*(PI/ANGLE_180)); };
inline ENGINE_API FLOAT CosFast(ANGLE a) { return cosf(a*(PI/ANGLE_180)); };
inline ENGINE_API FLOAT TanFast(ANGLE a) { return tanf(a*(PI/ANGLE_180)); };
inline ANGLE ASin(FLOAT y) {
return AngleRad (asinf(Clamp(y, -1.0f, 1.0f)));
}
inline ANGLE ACos(FLOAT x) {
return AngleRad (acosf(Clamp(x, -1.0f, 1.0f)));
}
inline ANGLE ATan(FLOAT z) {
return AngleRad (atanf(z));
}
inline ANGLE ATan2(FLOAT y, FLOAT x) {
return AngleRad (atan2f(y, x));
}
#else
inline ENGINE_API FLOAT SinFast(ANGLE a) { return (FLOAT)sin(a*(PI/ANGLE_180)); }; inline ENGINE_API FLOAT SinFast(ANGLE a) { return (FLOAT)sin(a*(PI/ANGLE_180)); };
inline ENGINE_API FLOAT CosFast(ANGLE a) { return (FLOAT)cos(a*(PI/ANGLE_180)); }; inline ENGINE_API FLOAT CosFast(ANGLE a) { return (FLOAT)cos(a*(PI/ANGLE_180)); };
inline ENGINE_API FLOAT TanFast(ANGLE a) { return (FLOAT)tan(a*(PI/ANGLE_180)); }; inline ENGINE_API FLOAT TanFast(ANGLE a) { return (FLOAT)tan(a*(PI/ANGLE_180)); };
inline ANGLE ASin(FLOAT y) { inline ANGLE ASin(FLOAT y) {
return AngleRad (asin(Clamp(y, -1.0f, 1.0f))); return AngleRad (asin(Clamp(y, -1.0f, 1.0f)));
} }
inline ANGLE ASin(DOUBLE y) {
return AngleRad (asin(Clamp(y, -1.0, 1.0)));
}
inline ANGLE ACos(FLOAT x) { inline ANGLE ACos(FLOAT x) {
return AngleRad (acos(Clamp(x, -1.0f, 1.0f))); return AngleRad (acos(Clamp(x, -1.0f, 1.0f)));
} }
inline ANGLE ACos(DOUBLE x) {
return AngleRad (acos(Clamp(x, -1.0, 1.0)));
}
inline ANGLE ATan(FLOAT z) { inline ANGLE ATan(FLOAT z) {
return AngleRad (atan(z)); return AngleRad (atan(z));
} }
inline ANGLE ATan(DOUBLE z) {
return AngleRad (atan(z));
}
inline ANGLE ATan2(FLOAT y, FLOAT x) { inline ANGLE ATan2(FLOAT y, FLOAT x) {
return AngleRad (atan2(y, x)); return AngleRad (atan2(y, x));
} }
#endif
inline ANGLE ASin(DOUBLE y) {
return AngleRad (asin(Clamp(y, -1.0, 1.0)));
}
inline ANGLE ACos(DOUBLE x) {
return AngleRad (acos(Clamp(x, -1.0, 1.0)));
}
inline ANGLE ATan(DOUBLE z) {
return AngleRad (atan(z));
}
inline ANGLE ATan2(DOUBLE y, DOUBLE x) { inline ANGLE ATan2(DOUBLE y, DOUBLE x) {
return AngleRad (atan2(y, x)); return AngleRad (atan2(y, x));
} }

View File

@ -96,7 +96,11 @@ public:
// ------------------------------------ Ogg Vorbis // ------------------------------------ Ogg Vorbis
#ifdef USE_TREMOR
#include <tremor/ivorbisfile.h> // we define needed stuff ourselves, and ignore the rest
#else
#include <vorbis/vorbisfile.h> // we define needed stuff ourselves, and ignore the rest #include <vorbis/vorbisfile.h> // we define needed stuff ourselves, and ignore the rest
#endif
// vorbis vars // vorbis vars
BOOL _bOVEnabled = FALSE; BOOL _bOVEnabled = FALSE;
@ -207,9 +211,13 @@ void CSoundDecoder::InitPlugins(void)
if (_hOV==NULL) { if (_hOV==NULL) {
#if ((defined PLATFORM_WIN32) && (defined NDEBUG)) #if ((defined PLATFORM_WIN32) && (defined NDEBUG))
#define VORBISLIB "vorbisfile_d" #define VORBISLIB "vorbisfile_d"
#else
#ifdef USE_TREMOR
#define VORBISLIB "vorbisidec"
#else #else
#define VORBISLIB "vorbisfile" #define VORBISLIB "vorbisfile"
#endif #endif
#endif
_hOV = CDynamicLoader::GetInstance(VORBISLIB); _hOV = CDynamicLoader::GetInstance(VORBISLIB);
if( _hOV->GetError() != NULL) { if( _hOV->GetError() != NULL) {
ThrowF_t(TRANS("Cannot load " VORBISLIB " shared library: %s."), _hOV->GetError()); ThrowF_t(TRANS("Cannot load " VORBISLIB " shared library: %s."), _hOV->GetError());
@ -571,8 +579,12 @@ INDEX CSoundDecoder::Decode(void *pvDestBuffer, INDEX ctBytesToDecode)
char *pch = (char *)pvDestBuffer; char *pch = (char *)pvDestBuffer;
INDEX ctDecoded = 0; INDEX ctDecoded = 0;
while (ctDecoded<ctBytesToDecode) { while (ctDecoded<ctBytesToDecode) {
#ifdef USE_TREMOR
long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded, &iCurrrentSection);
#else
long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded, long iRes = pov_read(sdc_pogg->ogg_vfVorbisFile, pch, ctBytesToDecode-ctDecoded,
0, 2, 1, &iCurrrentSection); 0, 2, 1, &iCurrrentSection);
#endif
if (iRes<=0) { if (iRes<=0) {
return ctDecoded; return ctDecoded;
} }