/* ================= S_FindCodecForFile 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); snd_codec_t *codec = codecs; if(!ext) { // No extension - auto-detect while(codec) { char fn[MAX_QPATH]; Q_strncpyz(fn, filename, sizeof(fn) - 4); COM_DefaultExtension(fn, sizeof(fn), codec->ext); // Check it exists if(FS_ReadFile(fn, NULL) != -1) return codec; // Nope. Next! codec = codec->next; } // Nothin' return NULL; } while(codec) { if(!Q_stricmp(ext, codec->ext)) return codec; codec = codec->next; } return NULL; }
/* ================= S_FindCodecForFile 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); snd_codec_t *codec = codecs; if (!ext) { // No extension - auto-detect while (codec) { 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; } // Nothin' return NULL; } while (codec) { if (!Q_stricmp(ext, codec->ext)) { return codec; } codec = codec->next; } return NULL; }
/* ================= S_CodecGetSound Opens/loads a sound, tries codec based on the sound's file extension then tries all supported codecs. ================= */ static void *S_CodecGetSound(const char *filename, snd_info_t *info) { 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); ext = S_FileExtension(localName); if( ext && *ext ) { // Look for the correct loader and use it for( codec = codecs; codec; codec = codec->next ) { if( !Q_stricmp( ext, codec->ext ) ) { // Load if( info ) rtn = codec->load(localName, info); else rtn = codec->open(localName); break; } } // 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; } } } // Try and find a suitable match using all // the sound codecs supported for( codec = codecs; 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; }