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