============================================================================
*/
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-short (*BigShort) (short l);
-short (*LittleShort) (short l);
-int (*BigLong) (int l);
-int (*LittleLong) (int l);
-float (*BigFloat) (float l);
-float (*LittleFloat) (float l);
-#endif
-
short ShortSwap (short l)
{
qbyte b1,b2;
return (b1<<8) + b2;
}
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-short ShortNoSwap (short l)
-{
- return l;
-}
-#endif
-
int LongSwap (int l)
{
qbyte b1,b2,b3,b4;
return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
}
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-int LongNoSwap (int l)
-{
- return l;
-}
-#endif
-
float FloatSwap (float f)
{
union
return dat2.f;
}
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-float FloatNoSwap (float f)
-{
- return f;
-}
-#endif
-
// Extract integers from buffers
*/
void COM_Init (void)
{
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
- qbyte swaptest[2] = {1,0};
-
-// set the byte swapping variables in a portable manner
- if ( *(short *)swaptest == 1)
- {
- BigShort = ShortSwap;
- LittleShort = ShortNoSwap;
- BigLong = LongSwap;
- LittleLong = LongNoSwap;
- BigFloat = FloatSwap;
- LittleFloat = FloatNoSwap;
- }
- else
- {
- BigShort = ShortNoSwap;
- LittleShort = ShortSwap;
- BigLong = LongNoSwap;
- LittleLong = LongSwap;
- BigFloat = FloatNoSwap;
- LittleFloat = FloatSwap;
- }
-#endif
-
Cvar_RegisterVariable (®istered);
Cvar_RegisterVariable (&cmdline);
void Com_HexDumpToConsole(const qbyte *data, int size);
+
//============================================================================
-#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-#if defined(__i386__) || defined(__ia64__) || defined(WIN32) || (defined(__alpha__) || defined(__alpha)) || defined(__arm__) || (defined(__mips__) && defined(__MIPSEL__)) || defined(__LITTLE_ENDIAN__)
-#define ENDIAN_LITTLE
-#else
-#define ENDIAN_BIG
+// Endianess handling
+//============================================================================
+
+// We use BSD-style defines: BYTE_ORDER is defined to either BIG_ENDIAN or LITTLE_ENDIAN
+
+// Initializations
+#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
+# undef BYTE_ORDER
+# undef LITTLE_ENDIAN
+# undef BIG_ENDIAN
+# define LITTLE_ENDIAN 1234
+# define BIG_ENDIAN 4321
#endif
+
+// If we still don't know the CPU endianess at this point, we try to guess
+#ifndef BYTE_ORDER
+# if defined(WIN32)
+# define BYTE_ORDER LITTLE_ENDIAN
+# else
+# warning "Unable to determine the CPU endianess. Defaulting to little endian"
+# define BYTE_ORDER LITTLE_ENDIAN
+# endif
#endif
+
short ShortSwap (short l);
int LongSwap (int l);
float FloatSwap (float f);
-#ifdef ENDIAN_LITTLE
+#if BYTE_ORDER == LITTLE_ENDIAN
// little endian
#define BigShort(l) ShortSwap(l)
#define LittleShort(l) (l)
#define LittleLong(l) (l)
#define BigFloat(l) FloatSwap(l)
#define LittleFloat(l) (l)
-#elif defined(ENDIAN_BIG)
+#else
// big endian
#define BigShort(l) (l)
#define LittleShort(l) ShortSwap(l)
#define LittleLong(l) LongSwap(l)
#define BigFloat(l) (l)
#define LittleFloat(l) FloatSwap(l)
-#else
-// figure it out at runtime
-extern short (*BigShort) (short l);
-extern short (*LittleShort) (short l);
-extern int (*BigLong) (int l);
-extern int (*LittleLong) (int l);
-extern float (*BigFloat) (float l);
-extern float (*LittleFloat) (float l);
#endif
unsigned int BuffBigLong (const qbyte *buffer);
struct audio_buf_info info;
int caps;
int format16bit;
- // LordHavoc: a quick patch to support big endian cpu, I hope
- union
- {
- unsigned char c[2];
- unsigned short s;
- }
- endiantest;
- endiantest.s = 1;
- if (endiantest.c[1])
- format16bit = AFMT_S16_BE;
- else
- format16bit = AFMT_S16_LE;
+#if BYTE_ORDER == BIG_ENDIAN
+ format16bit = AFMT_S16_BE;
+#else
+ format16bit = AFMT_S16_LE;
+#endif
snd_inited = 0;
// open /dev/dsp, confirm capability to mmap, and get size of dma buffer