diff options
author | Thilo Schulz <arny@ats.s.bawue.de> | 2011-05-09 22:40:25 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-09 21:38:38 +0000 |
commit | 91afb0a90e002901a98139be600a550a34d9eced (patch) | |
tree | c0c2f5c0261ab7889e6cf7412904ff4701a2a598 | |
parent | 2ca9be1c6cd7641ebe03069d77064fb4eca76d63 (diff) |
Add codec fallback support for sound files not found, Patch by Zack Middleton (#4982)
-rw-r--r-- | src/client/snd_codec.c | 131 | ||||
-rw-r--r-- | src/client/snd_codec_wav.c | 2 |
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; } |