summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThilo Schulz <arny@ats.s.bawue.de>2011-05-09 22:40:25 +0000
committerTim Angus <tim@ngus.net>2013-01-09 21:38:38 +0000
commit91afb0a90e002901a98139be600a550a34d9eced (patch)
treec0c2f5c0261ab7889e6cf7412904ff4701a2a598
parent2ca9be1c6cd7641ebe03069d77064fb4eca76d63 (diff)
Add codec fallback support for sound files not found, Patch by Zack Middleton (#4982)
-rw-r--r--src/client/snd_codec.c131
-rw-r--r--src/client/snd_codec_wav.c2
2 files changed, 76 insertions, 57 deletions
diff --git a/src/client/snd_codec.c b/src/client/snd_codec.c
index b11e0871..f3c5dda9 100644
--- a/src/client/snd_codec.c
+++ b/src/client/snd_codec.c
@@ -54,46 +54,90 @@ static char *S_FileExtension(const char *fni)
/*
=================
-S_FindCodecForFile
+S_CodecGetSound
-Select an appropriate codec for a file based on its extension
+Opens/loads a sound, tries codec based on the sound's file extension
+then tries all supported codecs.
=================
*/
-static snd_codec_t *S_FindCodecForFile(const char *filename)
+static void *S_CodecGetSound(const char *filename, snd_info_t *info)
{
- char *ext = S_FileExtension(filename);
- snd_codec_t *codec = codecs;
+ snd_codec_t *codec;
+ snd_codec_t *orgCodec = NULL;
+ qboolean orgNameFailed = qfalse;
+ char localName[ MAX_QPATH ];
+ const char *ext;
+ char altName[ MAX_QPATH ];
+ void *rtn = NULL;
+
+ Q_strncpyz(localName, filename, MAX_QPATH);
- if(!ext)
+ ext = S_FileExtension(localName);
+
+ if( *ext )
{
- // No extension - auto-detect
- while(codec)
+ // Look for the correct loader and use it
+ for( codec = codecs; codec; codec = codec->next )
{
- char fn[MAX_QPATH];
-
- // 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
- if(FS_ReadFile(fn, NULL) != -1)
- return codec;
-
- // Nope. Next!
- codec = codec->next;
+ if( !Q_stricmp( ext, codec->ext ) )
+ {
+ // Load
+ if( info )
+ rtn = codec->load(localName, info);
+ else
+ rtn = codec->open(localName);
+ break;
+ }
}
- // Nothin'
- return NULL;
+ // A loader was found
+ if( codec )
+ {
+ if( !rtn )
+ {
+ // Loader failed, most likely because the file isn't there;
+ // try again without the extension
+ orgNameFailed = qtrue;
+ orgCodec = codec;
+ COM_StripExtension( filename, localName, MAX_QPATH );
+ }
+ else
+ {
+ // Something loaded
+ return rtn;
+ }
+ }
}
- while(codec)
+ // Try and find a suitable match using all
+ // the sound codecs supported
+ for( codec = codecs; codec; codec = codec->next )
{
- if(!Q_stricmp(ext, codec->ext))
- return codec;
- codec = codec->next;
+ if( codec == orgCodec )
+ continue;
+
+ Com_sprintf( altName, sizeof (altName), "%s%s", localName, codec->ext );
+
+ // Load
+ if( info )
+ rtn = codec->load(altName, info);
+ else
+ rtn = codec->open(altName);
+
+ if( rtn )
+ {
+ if( orgNameFailed )
+ {
+ Com_DPrintf(S_COLOR_YELLOW "WARNING: %s not present, using %s instead\n",
+ filename, altName );
+ }
+
+ return rtn;
+ }
}
+ Com_Printf(S_COLOR_YELLOW "WARNING: Failed to %s sound %s!\n", info ? "load" : "open", filename);
+
return NULL;
}
@@ -105,10 +149,13 @@ S_CodecInit
void S_CodecInit()
{
codecs = NULL;
- S_CodecRegister(&wav_codec);
+
#ifdef USE_CODEC_VORBIS
S_CodecRegister(&ogg_codec);
#endif
+
+// Register wav codec last so that it is always tried first when a file extension was not found
+ S_CodecRegister(&wav_codec);
}
/*
@@ -139,20 +186,7 @@ S_CodecLoad
*/
void *S_CodecLoad(const char *filename, snd_info_t *info)
{
- snd_codec_t *codec;
- char fn[MAX_QPATH];
-
- codec = S_FindCodecForFile(filename);
- if(!codec)
- {
- Com_Printf("Unknown extension for %s\n", filename);
- return NULL;
- }
-
- strncpy(fn, filename, sizeof(fn));
- COM_DefaultExtension(fn, sizeof(fn), codec->ext);
-
- return codec->load(fn, info);
+ return S_CodecGetSound(filename, info);
}
/*
@@ -162,20 +196,7 @@ S_CodecOpenStream
*/
snd_stream_t *S_CodecOpenStream(const char *filename)
{
- snd_codec_t *codec;
- char fn[MAX_QPATH];
-
- codec = S_FindCodecForFile(filename);
- if(!codec)
- {
- Com_Printf("Unknown extension for %s\n", filename);
- return NULL;
- }
-
- strncpy(fn, filename, sizeof(fn));
- COM_DefaultExtension(fn, sizeof(fn), codec->ext);
-
- return codec->open(fn);
+ return S_CodecGetSound(filename, NULL);
}
void S_CodecCloseStream(snd_stream_t *stream)
diff --git a/src/client/snd_codec_wav.c b/src/client/snd_codec_wav.c
index dce561a2..1655a10e 100644
--- a/src/client/snd_codec_wav.c
+++ b/src/client/snd_codec_wav.c
@@ -206,8 +206,6 @@ void *S_WAV_CodecLoad(const char *filename, snd_info_t *info)
FS_FOpenFileRead(filename, &file, qtrue);
if(!file)
{
- Com_Printf( S_COLOR_RED "ERROR: Could not open \"%s\"\n",
- filename);
return NULL;
}