fix the overflow checks in snd_ogg to handle different input and output sampling...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 29 Dec 2010 10:59:30 +0000 (10:59 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 29 Dec 2010 10:59:30 +0000 (10:59 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10687 d7cf8633-e32d-0410-b094-e92efae38249

snd_modplug.c
snd_ogg.c

index ec14ce9..596b38f 100644 (file)
@@ -341,10 +341,10 @@ static const snd_buffer_t* ModPlug_FetchSound (void *sfxfetcher, void **chfetche
        // 1- to ensure we won't lose many samples during the resampling process
        // 2- to reduce calls to ModPlug_FetchSound to regulate workload
        newlength = (int)(per_sfx->format.speed*STREAM_BUFFER_FILL);
-       if (newlength + sb->nbframes > sb->maxframes)
+       if ((size_t) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed) + sb->nbframes > sb->maxframes)
        {
-               Con_Printf ("ModPlug_FetchSound: stream buffer overflow (%u sample frames / %u)\n",
-                                       sb->format.speed + sb->nbframes, sb->maxframes);
+               Con_Printf ("ModPlug_FetchSound: stream buffer overflow (%u + %u = %u sample frames / %u)\n",
+                                       (unsigned int) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed), sb->nbframes, (unsigned int) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed) + sb->nbframes, sb->maxframes);
                return NULL;
        }
        newlength *= factor; // convert from sample frames to bytes
index e383655..0ee16ba 100644 (file)
--- a/snd_ogg.c
+++ b/snd_ogg.c
@@ -534,10 +534,11 @@ static const snd_buffer_t* OGG_FetchSound (void *sfxfetcher, void **chfetcherpoi
        // 1- to ensure we won't lose many samples during the resampling process
        // 2- to reduce calls to OGG_FetchSound to regulate workload
        newlength = (int)(per_sfx->format.speed*STREAM_BUFFER_FILL);
-       if (newlength + sb->nbframes > sb->maxframes)
+       // this is how much we FETCH...
+       if ((size_t) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed) + sb->nbframes > sb->maxframes)
        {
                Con_Printf ("OGG_FetchSound: stream buffer overflow (%u + %u = %u sample frames / %u)\n",
-                                       newlength, sb->nbframes, newlength + sb->nbframes, sb->maxframes);
+                                       (unsigned int) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed), sb->nbframes, (unsigned int) ((double) newlength * (double)sb->format.speed / (double)per_sfx->format.speed) + sb->nbframes, sb->maxframes);
                return NULL;
        }
        newlength *= factor; // convert from sample frames to bytes