Fix engine not starting on Windows if linked against SDL > 2.0.5
[xonotic/darkplaces.git] / snd_mem.c
index 15e571b..f6f9c14 100644 (file)
--- a/snd_mem.c
+++ b/snd_mem.c
@@ -58,12 +58,12 @@ snd_ringbuffer_t *Snd_CreateRingBuffer (const snd_format_t* format, unsigned int
                        maxframes = sampleframes;
 
                memsize = maxframes * format->width * format->channels;
-               ringbuffer->ring = Mem_Alloc(snd_mempool, memsize);
+               ringbuffer->ring = (unsigned char *) Mem_Alloc(snd_mempool, memsize);
                ringbuffer->maxframes = maxframes;
        }
        else
        {
-               ringbuffer->ring = buffer;
+               ringbuffer->ring = (unsigned char *) buffer;
                ringbuffer->maxframes = sampleframes;
        }
 
@@ -80,8 +80,8 @@ snd_buffer_t *Snd_CreateSndBuffer (const unsigned char *samples, unsigned int sa
 {
        size_t newsampleframes, memsize;
        snd_buffer_t* sb;
-       
-       newsampleframes = (double)sampleframes * (double)sb_speed / (double)in_format->speed;
+
+       newsampleframes = (size_t) ceil((double)sampleframes * (double)sb_speed / (double)in_format->speed);
 
        memsize = newsampleframes * in_format->channels * in_format->width;
        memsize += sizeof (*sb) - sizeof (sb->samples);
@@ -90,7 +90,7 @@ snd_buffer_t *Snd_CreateSndBuffer (const unsigned char *samples, unsigned int sa
        sb->format.channels = in_format->channels;
        sb->format.width = in_format->width;
        sb->format.speed = sb_speed;
-       sb->maxframes = newsampleframes;
+       sb->maxframes = (unsigned int)newsampleframes;
        sb->nbframes = 0;
 
        if (!Snd_AppendToSndBuffer (sb, samples, sampleframes, in_format))
@@ -123,7 +123,7 @@ qboolean Snd_AppendToSndBuffer (snd_buffer_t* sb, const unsigned char *samples,
                return false;
        }
 
-       outcount = (double)sampleframes * (double)sb->format.speed / (double)format->speed;
+       outcount = (size_t) ((double)sampleframes * (double)sb->format.speed / (double)format->speed);
 
        // If the sound buffer is too short
        if (outcount > sb->maxframes - sb->nbframes)
@@ -289,7 +289,7 @@ qboolean Snd_AppendToSndBuffer (snd_buffer_t* sb, const unsigned char *samples,
                }
        }
 
-       sb->nbframes += outcount;
+       sb->nbframes += (unsigned int)outcount;
        return true;
 }
 
@@ -311,6 +311,7 @@ qboolean S_LoadSound (sfx_t *sfx, qboolean complain)
                return true;
 
        // If we weren't able to load it previously, no need to retry
+       // Note: S_PrecacheSound clears this flag to cause a retry
        if (sfx->flags & SFXFLAG_FILEMISSING)
                return false;
 
@@ -318,42 +319,59 @@ qboolean S_LoadSound (sfx_t *sfx, qboolean complain)
        if (snd_renderbuffer == NULL)
                return false;
 
+       // Initialize volume peak to 0; if ReplayGain is supported, the loader will change this away
+       sfx->volume_peak = 0.0;
+
+       if (developer_loading.integer)
+               Con_Printf("loading sound %s\n", sfx->name);
+
+       SCR_PushLoadingScreen(true, sfx->name, 1);
+
        // LordHavoc: if the sound filename does not begin with sound/, try adding it
        if (strncasecmp(sfx->name, "sound/", 6))
        {
-               len = dpsnprintf (namebuffer, sizeof(namebuffer), "sound/%s", sfx->name);
-               if (len < 0)
-               {
-                       // name too long
-                       Con_Printf("S_LoadSound: name \"%s\" is too long\n", sfx->name);
-                       return false;
-               }
-               if (S_LoadWavFile (namebuffer, sfx))
-                       return true;
+               dpsnprintf (namebuffer, sizeof(namebuffer), "sound/%s", sfx->name);
+               len = strlen(namebuffer);
                if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
+               {
+                       if (S_LoadWavFile (namebuffer, sfx))
+                               goto loaded;
                        memcpy (namebuffer + len - 3, "ogg", 4);
-               if (OGG_LoadVorbisFile (namebuffer, sfx))
-                       return true;
+               }
+               if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".ogg"))
+               {
+                       if (OGG_LoadVorbisFile (namebuffer, sfx))
+                               goto loaded;
+               }
        }
 
        // LordHavoc: then try without the added sound/ as wav and ogg
-       len = dpsnprintf (namebuffer, sizeof(namebuffer), "%s", sfx->name);
-       if (len < 0)
-       {
-               // name too long
-               Con_Printf("S_LoadSound: name \"%s\" is too long\n", sfx->name);
-               return false;
-       }
-       if (S_LoadWavFile (namebuffer, sfx))
-               return true;
+       dpsnprintf (namebuffer, sizeof(namebuffer), "%s", sfx->name);
+       len = strlen(namebuffer);
+       // request foo.wav: tries foo.wav, then foo.ogg
+       // request foo.ogg: tries foo.ogg only
+       // request foo.mod: tries foo.mod only
        if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
+       {
+               if (S_LoadWavFile (namebuffer, sfx))
+                       goto loaded;
                memcpy (namebuffer + len - 3, "ogg", 4);
-       if (OGG_LoadVorbisFile (namebuffer, sfx))
-               return true;
+       }
+       if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".ogg"))
+       {
+               if (OGG_LoadVorbisFile (namebuffer, sfx))
+                       goto loaded;
+       }
 
        // Can't load the sound!
        sfx->flags |= SFXFLAG_FILEMISSING;
        if (complain)
-               Con_Printf("S_LoadSound: Couldn't load \"%s\"\n", sfx->name);
+               Con_DPrintf("failed to load sound \"%s\"\n", sfx->name);
+
+       SCR_PopLoadingScreen(false);
        return false;
+
+loaded:
+       SCR_PopLoadingScreen(false);
+       return true;
 }