Partially applied patch from Joerg Dietrich. Fixes:

- incorrect handling of file names when opening sound files by name without extension
 - byte endian issues in ogg decoder.
This commit is contained in:
Thilo Schulz 2006-06-01 00:14:56 +00:00
parent 997dffc649
commit 503c0a22c6
2 changed files with 18 additions and 6 deletions

View file

@ -33,13 +33,16 @@ S_FileExtension
*/ */
static char *S_FileExtension(const char *fni) static char *S_FileExtension(const char *fni)
{ {
char *fn = (char *)fni; // we should search from the ending to the last '/'
char *fn = (char *) fni + strlen(fni) - 1;
char *eptr = NULL; char *eptr = NULL;
while(*fn)
while(*fn != '/' && fn != fni)
{ {
if(*fn == '.') if(*fn == '.')
eptr = fn; eptr = fn;
fn++; fn--;
} }
return eptr; return eptr;
@ -63,8 +66,10 @@ static snd_codec_t *S_FindCodecForFile(const char *filename)
while(codec) while(codec)
{ {
char fn[MAX_QPATH]; char fn[MAX_QPATH];
Q_strncpyz(fn, filename, sizeof(fn) - 4);
COM_DefaultExtension(fn, sizeof(fn), codec->ext); // there is no extension so we do not need to subtract 4 chars
Q_strncpyz(fn, filename, MAX_QPATH);
COM_DefaultExtension(fn, MAX_QPATH, codec->ext);
// Check it exists // Check it exists
if(FS_ReadFile(fn, NULL) != -1) if(FS_ReadFile(fn, NULL) != -1)

View file

@ -360,6 +360,13 @@ int S_OGG_CodecReadStream(snd_stream_t *stream, int bytes, void *buffer)
// Bitstream for the decoder // Bitstream for the decoder
int BS = 0; int BS = 0;
// big endian machines want their samples in big endian order
int IsBigEndian = 0;
# ifdef Q3_BIG_ENDIAN
IsBigEndian = 1;
# endif // Q3_BIG_ENDIAN
// check if input is valid // check if input is valid
if(!(stream && buffer)) if(!(stream && buffer))
{ {
@ -379,7 +386,7 @@ int S_OGG_CodecReadStream(snd_stream_t *stream, int bytes, void *buffer)
while(-1) while(-1)
{ {
// read some bytes from the OGG codec // read some bytes from the OGG codec
c = ov_read((OggVorbis_File *) stream->ptr, bufPtr, bytesLeft, 0, OGG_SAMPLEWIDTH, 1, &BS); c = ov_read((OggVorbis_File *) stream->ptr, bufPtr, bytesLeft, IsBigEndian, OGG_SAMPLEWIDTH, 1, &BS);
// no more bytes are left // no more bytes are left
if(c <= 0) if(c <= 0)