about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/client/snd.cpp7
-rw-r--r--src/engine/datafile.cpp28
2 files changed, 22 insertions, 13 deletions
diff --git a/src/engine/client/snd.cpp b/src/engine/client/snd.cpp
index fa8ba07c..5944655e 100644
--- a/src/engine/client/snd.cpp
+++ b/src/engine/client/snd.cpp
@@ -447,6 +447,13 @@ int snd_load_wav(const char *filename)
 				snd.data = (short*)mem_alloc(chunk_size, 1);
 				file.read(snd.data, chunk_size);
 				snd.num_samples = chunk_size/(2);
+#if defined(CONF_ARCH_ENDIAN_BIG)
+				for(unsigned i = 0; i < (unsigned)snd.num_samples; i++)
+				{
+					unsigned j = i << 1;
+					snd.data[i] = ((short)((char*)snd.data)[j]) + ((short)((char*)snd.data)[j+1] << 8);
+				}
+#endif
 				snd.sustain_start = -1;
 				snd.sustain_end = -1;
 				snd.last_played = 0;
diff --git a/src/engine/datafile.cpp b/src/engine/datafile.cpp
index 5c064819..b3a23589 100644
--- a/src/engine/datafile.cpp
+++ b/src/engine/datafile.cpp
@@ -66,31 +66,27 @@ datafile *datafile_load(const char *filename)
 		return 0;
 	
 	// TODO: change this header
-	int header[4];
+	unsigned char header[16];
 	file.read(header, sizeof(header));
-	if(((header[0]>>24)&0xff) != 'D' || ((header[0]>>16)&0xff) != 'A' || ((header[0]>>8)&0xff) != 'T' || (header[0]&0xff) != 'A')
+	if(header[3] != 'D' || header[2] != 'A' || header[1] != 'T' || header[0] != 'A')
 	{
 		dbg_msg("datafile", "wrong signature. %x %x %x %x", header[0], header[1], header[2], header[3]);
 		return 0;
 	}
 	
-	int version = header[1];
+	int version = (unsigned)header[4] | (unsigned)header[5]<<8 | (unsigned)header[6]<<16 | (unsigned)header[7]<<24;
 	if(version != 3)
 	{
 		dbg_msg("datafile", "wrong version. version=%x", version);
 		return 0;
 	}
 	
-	unsigned size = header[2];
-	unsigned swapsize = header[3];
+	unsigned size = (unsigned)header[8] | (unsigned)header[9]<<8 | (unsigned)header[10]<<16 | (unsigned)header[11]<<24;
+	unsigned swapsize = (unsigned)header[12] | (unsigned)header[13]<<8 | (unsigned)header[14]<<16 | (unsigned)header[15]<<24;
 	
 	if(DEBUG)
 		dbg_msg("datafile", "loading. size=%d", size);
 	
-	// TODO: use this variable for good and awesome
-	(void)swapsize;
-	
-	//map_unload();
 	datafile *df = (datafile*)mem_alloc(size+sizeof(datafile_info), 1);
 	unsigned readsize = file.read(&df->data, size);
 	if(readsize != size)
@@ -98,14 +94,20 @@ datafile *datafile_load(const char *filename)
 		dbg_msg("datafile", "couldn't load the whole thing, wanted=%d got=%d", size, readsize);
 		return 0;
 	}
-	
-	// TODO: byteswap
-	//map->byteswap();
 
+#if defined(CONF_ARCH_ENDIAN_BIG)
+	unsigned *dst = (unsigned*)df;
+	unsigned char *src = (unsigned char*)df;
+	for(unsigned i = 0; i < swapsize; i++)
+	{
+		unsigned j = i << 2;
+		dst[i] = src[j] | src[j+1]<<8 | src[j+2]<<16 | src[j+3]<<24;
+	}
+#endif
+	
 	if(DEBUG)
 		dbg_msg("datafile", "item_size=%d", df->data.item_size);
 	
-	
 	df->info.item_types = (item_type *)df->data.start;
 	df->info.item_offsets = (int *)&df->info.item_types[df->data.num_item_types];
 	df->info.data_offsets = (int *)&df->info.item_offsets[df->data.num_items];