From 7162fd4029d248c66d96f6e04c208d84d29a6199 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 16 Jan 2011 19:24:18 -0700 Subject: [PATCH] Q3 code integrated, almost compiles except for some ogg link error --- Quake/snd_codec.c | 46 +++++++++++++++++++----------- Quake/snd_codec.h | 2 +- Quake/snd_codec_ogg.c | 25 ++++++++-------- Quake/snd_codec_wav.c | 66 ++++++++++++++++++++++--------------------- Quake/snd_dma.c | 15 +++++----- Quake/sys.h | 2 ++ Quake/sys_sdl_unix.c | 10 +++++++ 7 files changed, 99 insertions(+), 67 deletions(-) diff --git a/Quake/snd_codec.c b/Quake/snd_codec.c index 6cd26ae0..5f4a0f1f 100644 --- a/Quake/snd_codec.c +++ b/Quake/snd_codec.c @@ -60,7 +60,16 @@ Select an appropriate codec for a file based on its extension */ static snd_codec_t *S_FindCodecForFile(const char *filename) { - char *ext = S_FileExtension(filename); + int i; + char filenameLowercase[MAX_QPATH]; + strncpy(filenameLowercase, filename, MAX_QPATH); + filenameLowercase[MAX_QPATH-1] = '\0'; + for (i=0; iext); + strncpy(fn, filenameLowercase, MAX_QPATH); + fn[MAX_QPATH-1] = '\0'; + COM_DefaultExtension(fn, codec->ext); // Check it exists - if(FS_ReadFile(fn, NULL) != -1) + int handle; + if (Sys_FileOpenRead(fn, &handle) > 0) + { + Sys_FileClose(handle); return codec; - + } + // Nope. Next! codec = codec->next; } @@ -88,7 +102,7 @@ static snd_codec_t *S_FindCodecForFile(const char *filename) while(codec) { - if(!Q_stricmp(ext, codec->ext)) + if(0 == strcmp(ext, codec->ext)) return codec; codec = codec->next; } @@ -144,12 +158,12 @@ void *S_CodecLoad(const char *filename, snd_info_t *info) codec = S_FindCodecForFile(filename); if(!codec) { - Com_Printf("Unknown extension for %s\n", filename); + Con_Printf("Unknown extension for %s\n", filename); return NULL; } strncpy(fn, filename, sizeof(fn)); - COM_DefaultExtension(fn, sizeof(fn), codec->ext); + COM_DefaultExtension(fn, codec->ext); return codec->load(fn, info); } @@ -167,12 +181,12 @@ snd_stream_t *S_CodecOpenStream(const char *filename) codec = S_FindCodecForFile(filename); if(!codec) { - Com_Printf("Unknown extension for %s\n", filename); + Con_Printf("Unknown extension for %s\n", filename); return NULL; } strncpy(fn, filename, sizeof(fn)); - COM_DefaultExtension(fn, sizeof(fn), codec->ext); + COM_DefaultExtension(fn, codec->ext); return codec->open(fn); } @@ -198,14 +212,14 @@ S_CodecUtilOpen snd_stream_t *S_CodecUtilOpen(const char *filename, snd_codec_t *codec) { snd_stream_t *stream; - fileHandle_t hnd; + int hnd; int length; // Try to open the file - length = FS_FOpenFileRead(filename, &hnd, qtrue); - if(!hnd) + length = Sys_FileOpenRead(filename, &hnd); + if(hnd == -1) { - Com_Printf("Can't read sound file %s\n", filename); + Con_Printf("Can't read sound file %s\n", filename); return NULL; } @@ -213,7 +227,7 @@ snd_stream_t *S_CodecUtilOpen(const char *filename, snd_codec_t *codec) stream = Z_Malloc(sizeof(snd_stream_t)); if(!stream) { - FS_FCloseFile(hnd); + Sys_FileClose(hnd); return NULL; } @@ -231,7 +245,7 @@ S_CodecUtilClose */ void S_CodecUtilClose(snd_stream_t **stream) { - FS_FCloseFile((*stream)->file); + Sys_FileClose((*stream)->file); Z_Free(*stream); *stream = NULL; } diff --git a/Quake/snd_codec.h b/Quake/snd_codec.h index 4adf19c0..ded7a996 100644 --- a/Quake/snd_codec.h +++ b/Quake/snd_codec.h @@ -39,7 +39,7 @@ typedef struct snd_codec_s snd_codec_t; typedef struct snd_stream_s { snd_codec_t *codec; - FILE *file; + int file; // handle snd_info_t info; int length; int pos; diff --git a/Quake/snd_codec_ogg.c b/Quake/snd_codec_ogg.c index 2e811ac6..ce546aa5 100644 --- a/Quake/snd_codec_ogg.c +++ b/Quake/snd_codec_ogg.c @@ -88,7 +88,7 @@ size_t S_OGG_Callback_read(void *ptr, size_t size, size_t nmemb, void *datasourc byteSize = nmemb * size; // read it with the Q3 function FS_Read() - bytesRead = FS_Read(ptr, byteSize, stream->file); + bytesRead = Sys_FileRead(stream->file, ptr, byteSize); // update the file position stream->pos += bytesRead; @@ -128,12 +128,13 @@ int S_OGG_Callback_seek(void *datasource, ogg_int64_t offset, int whence) case SEEK_SET : { // set the file position in the actual file with the Q3 function - retVal = FS_Seek(stream->file, (long) offset, FS_SEEK_SET); + errno = 0; + Sys_FileSeek(stream->file, (long) offset); // something has gone wrong, so we return here - if(retVal < 0) + if(errno != 0) { - return retVal; + return errno; } // keep track of file position @@ -144,12 +145,13 @@ int S_OGG_Callback_seek(void *datasource, ogg_int64_t offset, int whence) case SEEK_CUR : { // set the file position in the actual file with the Q3 function - retVal = FS_Seek(stream->file, (long) offset, FS_SEEK_CUR); + errno = 0; + Sys_FileSeek(stream->file, (long) stream->pos + (long) offset); // something has gone wrong, so we return here - if(retVal < 0) + if(errno != 0) { - return retVal; + return errno; } // keep track of file position @@ -163,12 +165,13 @@ int S_OGG_Callback_seek(void *datasource, ogg_int64_t offset, int whence) // so we use the file length and FS_SEEK_SET // set the file position in the actual file with the Q3 function - retVal = FS_Seek(stream->file, (long) stream->length + (long) offset, FS_SEEK_SET); + errno = 0; + Sys_FileSeek(stream->file, (long) stream->length + (long) offset); // something has gone wrong, so we return here - if(retVal < 0) + if(errno != 0) { - return retVal; + return errno; } // keep track of file position @@ -213,7 +216,7 @@ long S_OGG_Callback_tell(void *datasource) // snd_stream_t in the generic pointer stream = (snd_stream_t *) datasource; - return (long) FS_FTell(stream->file); + return (long) Sys_FileTell(stream->file); } // the callback structure diff --git a/Quake/snd_codec_wav.c b/Quake/snd_codec_wav.c index b6c56fa9..5d5a9b96 100644 --- a/Quake/snd_codec_wav.c +++ b/Quake/snd_codec_wav.c @@ -24,15 +24,17 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "quakedef.h" #include "snd_codec.h" +#define PAD(x,y) (((x)+(y)-1) & ~((y)-1)) + /* ================= FGetLittleLong ================= */ -static int FGetLittleLong( fileHandle_t f ) { +static int FGetLittleLong( int handle ) { int v; - FS_Read( &v, sizeof(v), f ); + Sys_FileRead( handle, &v, sizeof(v) ); return LittleLong( v); } @@ -42,10 +44,10 @@ static int FGetLittleLong( fileHandle_t f ) { FGetLittleShort ================= */ -static short FGetLittleShort( fileHandle_t f ) { +static short FGetLittleShort( int handle ) { short v; - FS_Read( &v, sizeof(v), f ); + Sys_FileRead( handle, &v, sizeof(v) ); return LittleShort( v); } @@ -55,19 +57,19 @@ static short FGetLittleShort( fileHandle_t f ) { S_ReadChunkInfo ================= */ -static int S_ReadChunkInfo(fileHandle_t f, char *name) +static int S_ReadChunkInfo(int handle, char *name) { int len, r; name[4] = 0; - r = FS_Read(name, 4, f); + r = Sys_FileRead(handle, name, 4); if(r != 4) return -1; - len = FGetLittleLong(f); + len = FGetLittleLong(handle); if( len < 0 ) { - Com_Printf( S_COLOR_YELLOW "WARNING: Negative chunk length\n" ); + Con_Printf( "WARNING: Negative chunk length\n" ); return -1; } @@ -81,11 +83,11 @@ S_FindRIFFChunk Returns the length of the data in the chunk, or -1 if not found ================= */ -static int S_FindRIFFChunk( fileHandle_t f, char *chunk ) { +static int S_FindRIFFChunk( int handle, char *chunk ) { char name[5]; int len; - while( ( len = S_ReadChunkInfo(f, name) ) >= 0 ) + while( ( len = S_ReadChunkInfo(handle, name) ) >= 0 ) { // If this is the right chunk, return if( !Q_strncmp( name, chunk, 4 ) ) @@ -94,7 +96,7 @@ static int S_FindRIFFChunk( fileHandle_t f, char *chunk ) { len = PAD( len, 2 ); // Not the right chunk - skip it - FS_Seek( f, len, FS_SEEK_CUR ); + Sys_FileSeekRelative( handle, len ); } return -1; @@ -128,7 +130,7 @@ static void S_ByteSwapRawSamples( int samples, int width, int s_channels, const S_ReadRIFFHeader ================= */ -static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info) +static qboolean S_ReadRIFFHeader( int file, snd_info_t *info) { char dump[16]; int wav_format; @@ -136,13 +138,13 @@ static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info) int fmtlen = 0; // skip the riff wav header - FS_Read(dump, 12, file); + Sys_FileRead(file, dump, 12); // Scan for the format chunk if((fmtlen = S_FindRIFFChunk(file, "fmt ")) < 0) { - Com_Printf( S_COLOR_RED "ERROR: Couldn't find \"fmt\" chunk\n"); - return qfalse; + Con_Printf( "ERROR: Couldn't find \"fmt\" chunk\n"); + return false; } // Save the parameters @@ -155,8 +157,8 @@ static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info) if( bits < 8 ) { - Com_Printf( S_COLOR_RED "ERROR: Less than 8 bit sound is not supported\n"); - return qfalse; + Con_Printf( "ERROR: Less than 8 bit sound is not supported\n"); + return false; } info->width = bits / 8; @@ -166,18 +168,18 @@ static qboolean S_ReadRIFFHeader(fileHandle_t file, snd_info_t *info) if(fmtlen > 16) { fmtlen -= 16; - FS_Seek( file, fmtlen, FS_SEEK_CUR ); + Sys_FileSeekRelative( file, fmtlen ); } // Scan for the data chunk if( (info->size = S_FindRIFFChunk(file, "data")) < 0) { - Com_Printf( S_COLOR_RED "ERROR: Couldn't find \"data\" chunk\n"); - return qfalse; + Con_Printf( "ERROR: Couldn't find \"data\" chunk\n"); + return false; } info->samples = (info->size / info->width) / info->channels; - return qtrue; + return true; } // WAV codec @@ -198,14 +200,14 @@ S_WAV_CodecLoad */ void *S_WAV_CodecLoad(const char *filename, snd_info_t *info) { - fileHandle_t file; + int file; void *buffer; // Try to open the file - FS_FOpenFileRead(filename, &file, qtrue); - if(!file) + Sys_FileOpenRead(filename, &file); + if(file == -1) { - Com_Printf( S_COLOR_RED "ERROR: Could not open \"%s\"\n", + Con_Printf( "ERROR: Could not open \"%s\"\n", filename); return NULL; } @@ -213,8 +215,8 @@ void *S_WAV_CodecLoad(const char *filename, snd_info_t *info) // Read the RIFF header if(!S_ReadRIFFHeader(file, info)) { - FS_FCloseFile(file); - Com_Printf( S_COLOR_RED "ERROR: Incorrect/unsupported format in \"%s\"\n", + Sys_FileClose(file); + Con_Printf( "ERROR: Incorrect/unsupported format in \"%s\"\n", filename); return NULL; } @@ -223,18 +225,18 @@ void *S_WAV_CodecLoad(const char *filename, snd_info_t *info) buffer = Z_Malloc(info->size); if(!buffer) { - FS_FCloseFile(file); - Com_Printf( S_COLOR_RED "ERROR: Out of memory reading \"%s\"\n", + Sys_FileClose(file); + Con_Printf( "ERROR: Out of memory reading \"%s\"\n", filename); return NULL; } // Read, byteswap - FS_Read(buffer, info->size, file); + Sys_FileRead(file, buffer, info->size); S_ByteSwapRawSamples(info->samples, info->width, info->channels, (byte *)buffer); // Close and return - FS_FCloseFile(file); + Sys_FileClose(file); return buffer; } @@ -288,7 +290,7 @@ int S_WAV_CodecReadStream(snd_stream_t *stream, int bytes, void *buffer) bytes = remaining; stream->pos += bytes; samples = (bytes / stream->info.width) / stream->info.channels; - FS_Read(buffer, bytes, stream->file); + Sys_FileRead(stream->file, buffer, bytes); S_ByteSwapRawSamples(samples, stream->info.width, stream->info.channels, buffer); return bytes; } diff --git a/Quake/snd_dma.c b/Quake/snd_dma.c index aa2f5103..52d9655d 100644 --- a/Quake/snd_dma.c +++ b/Quake/snd_dma.c @@ -627,13 +627,13 @@ void S_Base_RawSamples( int stream, int samples, int rate, int width, int s_chan intVolume = 256 * volume; if ( s_rawend[stream] < soundtime ) { - Com_DPrintf( "S_Base_RawSamples: resetting minimum: %i < %i\n", s_rawend[stream], soundtime ); + Con_DPrintf( "S_Base_RawSamples: resetting minimum: %i < %i\n", s_rawend[stream], soundtime ); s_rawend[stream] = soundtime; } scale = (float)rate / shm->speed; - //Com_Printf ("%i < %i < %i\n", soundtime, s_paintedtime, s_rawend[stream]); + //Con_Printf ("%i < %i < %i\n", soundtime, s_paintedtime, s_rawend[stream]); if (s_channels == 2 && width == 2) { if (scale == 1.0) @@ -705,7 +705,7 @@ void S_Base_RawSamples( int stream, int samples, int rate, int width, int s_chan } if ( s_rawend[stream] > soundtime + MAX_RAW_SAMPLES ) { - Com_DPrintf( "S_Base_RawSamples: overflowed %i > %i\n", s_rawend[stream], soundtime ); + Con_DPrintf( "S_Base_RawSamples: overflowed %i > %i\n", s_rawend[stream], soundtime ); } } @@ -979,7 +979,7 @@ void S_Base_StartBackgroundTrack( const char *intro, const char *loop ){ if ( !loop || !loop[0] ) { loop = intro; } - Com_DPrintf( "S_StartBackgroundTrack( %s, %s )\n", intro, loop ); + Con_DPrintf( "S_StartBackgroundTrack( %s, %s )\n", intro, loop ); if(!*intro) { @@ -990,7 +990,8 @@ void S_Base_StartBackgroundTrack( const char *intro, const char *loop ){ if( !loop ) { s_backgroundLoop[0] = 0; } else { - Q_strncpyz( s_backgroundLoop, loop, sizeof( s_backgroundLoop ) ); + strncpy( s_backgroundLoop, loop, sizeof( s_backgroundLoop ) ); + s_backgroundLoop[MAX_QPATH-1] = '\0'; } // close the background track, but DON'T reset s_rawend @@ -1004,12 +1005,12 @@ void S_Base_StartBackgroundTrack( const char *intro, const char *loop ){ // Open stream s_backgroundStream = S_CodecOpenStream(intro); if(!s_backgroundStream) { - Com_Printf( "WARNING: couldn't open music file %s\n", intro ); + Con_Printf( "WARNING: couldn't open music file %s\n", intro ); return; } if(s_backgroundStream->info.channels != 2 || s_backgroundStream->info.rate != 22050) { - Com_Printf( "WARNING: music file %s is not 22k stereo\n", intro ); + Con_Printf( "WARNING: music file %s is not 22k stereo\n", intro ); } } diff --git a/Quake/sys.h b/Quake/sys.h index 548129c5..9ec01ef7 100644 --- a/Quake/sys.h +++ b/Quake/sys.h @@ -38,9 +38,11 @@ int Sys_FileOpenRead (const char *path, int *hndl); int Sys_FileOpenWrite (const char *path); void Sys_FileClose (int handle); void Sys_FileSeek (int handle, int position); +void Sys_FileSeekRelative (int handle, int position); int Sys_FileRead (int handle, void *dest, int count); int Sys_FileWrite (int handle,const void *data, int count); int Sys_FileTime (const char *path); +int Sys_FileTell (int handle); void Sys_mkdir (const char *path); // diff --git a/Quake/sys_sdl_unix.c b/Quake/sys_sdl_unix.c index db7d37e9..dd5f7e9a 100644 --- a/Quake/sys_sdl_unix.c +++ b/Quake/sys_sdl_unix.c @@ -114,6 +114,11 @@ void Sys_FileSeek (int handle, int position) fseek (sys_handles[handle], position, SEEK_SET); } +void Sys_FileSeekRelative (int handle, int position) +{ + fseek (sys_handles[handle], position, SEEK_CUR); +} + int Sys_FileRead (int handle, void *dest, int count) { return fread (dest, 1, count, sys_handles[handle]); @@ -139,6 +144,11 @@ int Sys_FileTime (const char *path) return -1; } +int Sys_FileTell (int handle) +{ + return ftell(sys_handles[handle]); +} + void Sys_Init (void) { }