X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=snd_ogg.c;h=73aa52f7132f96f2d492918361fb8cb4e23ef475;hp=fa64393becad0e7ca7deb4962464b34683cfa5ca;hb=c32e446060df3ccfcbec6fa49ab1146ae2ba7076;hpb=3b7db4cb67e7468650e039c7ea8dac854e4deae6 diff --git a/snd_ogg.c b/snd_ogg.c index fa64393b..73aa52f7 100644 --- a/snd_ogg.c +++ b/snd_ogg.c @@ -23,6 +23,7 @@ #include "quakedef.h" +#include "snd_main.h" #include "snd_ogg.h" #include "snd_wav.h" @@ -214,7 +215,8 @@ static dllfunction_t oggvorbisfuncs[] = {NULL, NULL} }; -// Handle for the Vorbisfile DLL +// Handles for the Vorbis and Vorbisfile DLLs +static dllhandle_t vo_dll = NULL; static dllhandle_t vf_dll = NULL; typedef struct @@ -292,7 +294,30 @@ Try to load the VorbisFile DLL */ qboolean OGG_OpenLibrary (void) { - const char* dllname; + const char* dllnames_vo [] = + { +#ifdef WIN32 + "vorbis.dll", +#elif defined(MACOSX) + "libvorbis.dylib", +#else + "libvorbis.so.0", + "libvorbis.so", +#endif + NULL + }; + const char* dllnames_vf [] = + { +#ifdef WIN32 + "vorbisfile.dll", +#elif defined(MACOSX) + "libvorbisfile.dylib", +#else + "libvorbisfile.so.3", + "libvorbisfile.so", +#endif + NULL + }; // Already loaded? if (vf_dll) @@ -302,15 +327,13 @@ qboolean OGG_OpenLibrary (void) if (COM_CheckParm("-novorbis")) return false; -#ifdef WIN32 - dllname = "vorbisfile.dll"; -#else - dllname = "libvorbisfile.so"; -#endif - - // Load the DLL - if (! Sys_LoadLibrary (dllname, &vf_dll, oggvorbisfuncs)) + // Load the DLLs + // We need to load both by hand because some OSes seem to not load + // the vorbis DLL automatically when loading the VorbisFile DLL + if (! Sys_LoadLibrary (dllnames_vo, &vo_dll, NULL) || + ! Sys_LoadLibrary (dllnames_vf, &vf_dll, oggvorbisfuncs)) { + Sys_UnloadLibrary (&vo_dll); Con_Printf ("Ogg Vorbis support disabled\n"); return false; } @@ -330,6 +353,7 @@ Unload the VorbisFile DLL void OGG_CloseLibrary (void) { Sys_UnloadLibrary (&vf_dll); + Sys_UnloadLibrary (&vo_dll); } @@ -435,19 +459,17 @@ static const sfxbuffer_t* OGG_FetchSound (channel_t* ch, unsigned int start, uns { if (qov_pcm_seek (&per_ch->vf, (ogg_int64_t)start) != 0) return NULL; - - sb->offset = start; sb->length = 0; - newlength = 0; } // Else, move forward the samples we need to keep in the sfxbuffer else { memmove (sb->data, sb->data + (start - sb->offset) * factor, newlength * factor); - sb->offset = start; sb->length = newlength; } + sb->offset = start; + // We add exactly 1 sec of sound to the buffer: // 1- to ensure we won't lose any sample during the resampling process // 2- to force one call to OGG_FetchSound per second to regulate the workload @@ -457,7 +479,7 @@ static const sfxbuffer_t* OGG_FetchSound (channel_t* ch, unsigned int start, uns (sfx->format.speed + sb->length) * factor, buff_len); return NULL; } - newlength = per_sfx->format.speed * factor; // 1 sec of sound before resampling + newlength = per_sfx->format.speed * factor; // -> 1 sec of sound before resampling // Decompress in the resampling_buffer #if BYTE_ORDER == LITTLE_ENDIAN @@ -587,7 +609,7 @@ qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *s) long ret; sfxbuffer_t *sb; - Con_DPrintf ("\"%s\" will be streamed\n", filename); + Con_DPrintf ("\"%s\" will be cached\n", filename); // Decode it buff = Mem_Alloc (s->mempool, (int)len);