r363 - in trunk/code: client qcommon

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Nov 16 15:23:37 EST 2005


Author: tma
Date: 2005-11-16 15:23:37 -0500 (Wed, 16 Nov 2005)
New Revision: 363

Modified:
   trunk/code/client/snd_codec_wav.c
   trunk/code/qcommon/files.c
Log:
* Partial implementation of FS_Seek for files in pk3s
* A couple of RIFF decoder tweaks/fixes


Modified: trunk/code/client/snd_codec_wav.c
===================================================================
--- trunk/code/client/snd_codec_wav.c	2005-11-15 23:49:14 UTC (rev 362)
+++ trunk/code/client/snd_codec_wav.c	2005-11-16 20:23:37 UTC (rev 363)
@@ -66,44 +66,38 @@
 		return 0;
 
 	len = FGetLittleLong(f);
-	if(len < 0 || len > 0xffffffff)
+	if( len < 0 ) {
+		Com_Printf( S_COLOR_YELLOW "WARNING: Negative chunk length\n" );
 		return 0;
+	}
 
-	//FIXME: 11/11/05 <tim at ngus.net>
-	// I'm not sure I understand why this needs to be padded.
-	// Surely this results in reading past the end of the data?
-	//len = (len + 1 ) & ~1;		// pad to word boundary
-
 	return len;
 }
 
 /*
 =================
-S_FindWavChunk
+S_FindRIFFChunk
 
 Returns the length of the data in the chunk, or 0 if not found
 =================
 */
-static int S_FindWavChunk( fileHandle_t f, char *chunk ) {
+static int S_FindRIFFChunk( fileHandle_t f, char *chunk ) {
 	char	name[5];
 	int		len;
 
-	// This is a bit dangerous...
-	while(1)
+	while( ( len = S_ReadChunkInfo(f, name) ) )
 	{
-		len = S_ReadChunkInfo(f, name);
-
-		// Read failure?
-		if(len == 0)
-			return 0;
-
 		// If this is the right chunk, return
-		if(!strcmp(name, chunk))
+		if( !Q_strncmp( name, chunk, 4 ) )
 			return len;
 
+		len = (len + 1 ) & ~1; // pad to word boundary
+
 		// Not the right chunk - skip it
 		FS_Seek( f, len, FS_SEEK_CUR );
 	}
+
+	return 0;
 }
 
 /*
@@ -131,10 +125,10 @@
 
 /*
 =================
-S_ReadWavHeader
+S_ReadRIFFHeader
 =================
 */
-static qboolean S_ReadWavHeader(fileHandle_t file, snd_info_t *info)
+static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info)
 {
 	char dump[16];
 	int wav_format;
@@ -144,9 +138,9 @@
 	FS_Read(dump, 12, file);
 
 	// Scan for the format chunk
-	if((fmtlen = S_FindWavChunk(file, "fmt ")) == 0)
+	if((fmtlen = S_FindRIFFChunk(file, "fmt ")) == 0)
 	{
-		Com_Printf("No fmt chunk\n");
+		Com_Printf( S_COLOR_RED "ERROR: Couldn't find \"fmt\" chunk\n");
 		return qfalse;
 	}
 
@@ -167,9 +161,9 @@
 	}
 
 	// Scan for the data chunk
-	if( (info->size = S_FindWavChunk(file, "data")) == 0)
+	if( (info->size = S_FindRIFFChunk(file, "data")) == 0)
 	{
-		Com_Printf("No data chunk\n");
+		Com_Printf( S_COLOR_RED "ERROR: Couldn't find \"data\" chunk\n");
 		return qfalse;
 	}
 	info->samples = (info->size / info->width) / info->channels;
@@ -202,15 +196,17 @@
 	FS_FOpenFileRead(filename, &file, qtrue);
 	if(!file)
 	{
-		Com_Printf("Can't read sound file %s\n", filename);
+		Com_Printf( S_COLOR_RED "ERROR: Could not open \"%s\"\n",
+				filename);
 		return NULL;
 	}
 
 	// Read the RIFF header
-	if(!S_ReadWavHeader(file, info))
+	if(!S_ReadRIFFHeader(file, info))
 	{
 		FS_FCloseFile(file);
-		Com_Printf("Can't understand wav file %s\n", filename);
+		Com_Printf( S_COLOR_RED "ERROR: Incorrect/unsupported format in \"%s\"\n",
+				filename);
 		return NULL;
 	}
 
@@ -219,7 +215,8 @@
 	if(!buffer)
 	{
 		FS_FCloseFile(file);
-		Com_Printf("Out of memory reading %s\n", filename);
+		Com_Printf( S_COLOR_RED "ERROR: Out of memory reading \"%s\"\n",
+				filename);
 		return NULL;
 	}
 
@@ -247,7 +244,7 @@
 		return NULL;
 
 	// Read the RIFF header
-	if(!S_ReadWavHeader(rv->file, &rv->info))
+	if(!S_ReadRIFFHeader(rv->file, &rv->info))
 	{
 		S_CodecUtilClose(rv);
 		return NULL;

Modified: trunk/code/qcommon/files.c
===================================================================
--- trunk/code/qcommon/files.c	2005-11-15 23:49:14 UTC (rev 362)
+++ trunk/code/qcommon/files.c	2005-11-16 20:23:37 UTC (rev 363)
@@ -1361,6 +1361,8 @@
 	FS_Write(msg, strlen(msg), h);
 }
 
+#define PK3_SEEK_BUFFER_SIZE 65536
+
 /*
 =================
 FS_Seek
@@ -1369,7 +1371,6 @@
 */
 int FS_Seek( fileHandle_t f, long offset, int origin ) {
 	int		_origin;
-	char	foo[65536];
 
 	if ( !fs_searchpaths ) {
 		Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" );
@@ -1383,19 +1384,38 @@
 	}
 
 	if (fsh[f].zipFile == qtrue) {
-		if (offset == 0 && origin == FS_SEEK_SET) {
-			// set the file position in the zip file (also sets the current file info)
-			unzSetCurrentFileInfoPosition(fsh[f].handleFiles.file.z, fsh[f].zipFilePos);
-			return unzOpenCurrentFile(fsh[f].handleFiles.file.z);
-		} else if (offset<65536) {
-			// set the file position in the zip file (also sets the current file info)
-			unzSetCurrentFileInfoPosition(fsh[f].handleFiles.file.z, fsh[f].zipFilePos);
-			unzOpenCurrentFile(fsh[f].handleFiles.file.z);
-			return FS_Read(foo, offset, f);
-		} else {
-			Com_Error( ERR_FATAL, "ZIP FILE FSEEK NOT YET IMPLEMENTED\n" );
+    //FIXME: this is incomplete and really, really
+    //crappy (but better than what was here before)
+		byte	buffer[PK3_SEEK_BUFFER_SIZE];
+		int		remainder = offset;
+
+		Com_Printf( S_COLOR_YELLOW "%s %d %d\n", fsh[f].name, offset, origin );
+		if( offset < 0 || origin == FS_SEEK_END ) {
+			Com_Error( ERR_FATAL, "Negative offsets and FS_SEEK_END not implemented "
+					"for FS_Seek on pk3 file contents\n" );
 			return -1;
 		}
+
+		switch( origin ) {
+			case FS_SEEK_SET:
+				unzSetCurrentFileInfoPosition(fsh[f].handleFiles.file.z, fsh[f].zipFilePos);
+				unzOpenCurrentFile(fsh[f].handleFiles.file.z);
+				//fallthrough
+
+			case FS_SEEK_CUR:
+				while( remainder > PK3_SEEK_BUFFER_SIZE ) {
+					FS_Read( buffer, PK3_SEEK_BUFFER_SIZE, f );
+					remainder -= PK3_SEEK_BUFFER_SIZE;
+				}
+				FS_Read( buffer, remainder, f );
+				return offset;
+				break;
+
+			default:
+				Com_Error( ERR_FATAL, "Bad origin in FS_Seek\n" );
+				return -1;
+				break;
+		}
 	} else {
 		FILE *file;
 		file = FS_FileForHandle(f);




More information about the quake3-commits mailing list