ref: f6deaba729b678fa92d3edddf1b1b1ea944f78fc
parent: ad116c05d87fe788cd459df2b1c229bfcf6928a4
author: Jonathan Dowland <jon+github@alcopop.org>
date: Wed Jun 24 16:59:59 EDT 2015
Replace ->driver_data with GetAllocatedSoundBySfxinfo GetAllocatedSoundBySfxinfo is a linked-list look-up on the list of allocated sounds, rather than the direct-access of the driver_data pointer. Previously we used the ->driver_data field of sfxinfo_t to point at the corresponding allocated_sound_t, but this assumes a 1:1 mapping which won't be true with pitch-shifted sounds. The lookups are still cheap, but I did some instrumenting to see how many iterations this results in. Note that when I ran these tests there were a few more calls that I've since eliminated, so this is slightly worse than current. For Doom 2 v1.9 demos: ____demo:___ iter 1 2 3 0 296 636 1691 1 104 205 620 2 57 134 488 3 55 90 287 4 58 56 204 5 28 48 146 6 18 33 119 7 6 44 99 8 4 33 86 9 8 57 72 10 6 30 62 11 6 18 68 12 6 22 46 13 2 18 42 14 4 18 48 15 0 6 22 16 4 12 16 17 0 12 14 18 0 8 12 19 0 12 14 20 0 16 12 21 0 10 10 22 0 2 20 23 0 10 10 24 0 2 6 25 0 2 8 26 0 0 10 27 0 0 4 28 0 0 6 29 0 0 2 30 0 0 12 31 0 0 8 32 0 0 4 33 0 0 2 34 0 0 4 35 0 0 0 36 0 0 0 37 0 0 0
--- a/src/i_sdlsound.c
+++ b/src/i_sdlsound.c
@@ -136,10 +136,6 @@
AllocatedSoundUnlink(snd);
- // Unlink from higher-level code.
-
- snd->sfxinfo->driver_data = NULL;
-
// Keep track of the amount of allocated sound data:
allocated_sounds_size -= snd->chunk.alen;
@@ -235,10 +231,6 @@
snd->sfxinfo = sfxinfo;
snd->use_count = 0;
- // driver_data pointer points to the allocated_sound structure.
-
- sfxinfo->driver_data = snd;
-
// Keep track of how much memory all these cached sounds are using...
allocated_sounds_size += len;
@@ -279,6 +271,24 @@
//printf("-- %s: Use count=%i\n", snd->sfxinfo->name, snd->use_count);
}
+// Search through the list of allocated sounds and return the one that matches
+// the supplied sfxinfo entry.
+
+static allocated_sound_t * GetAllocatedSoundBySfxInfo(sfxinfo_t *sfxinfo)
+{
+ allocated_sound_t * p = allocated_sounds_head;
+
+ while(p != NULL)
+ {
+ if(p->sfxinfo == sfxinfo)
+ {
+ return p;
+ }
+ p = p->next;
+ }
+ return NULL;
+}
+
// When a sound stops, check if it is still playing. If it is not,
// we can mark the sound data as CACHE to be freed back for other
// means.
@@ -787,8 +797,7 @@
static boolean LockSound(sfxinfo_t *sfxinfo)
{
// If the sound isn't loaded, load it now
-
- if (sfxinfo->driver_data == NULL)
+ if (GetAllocatedSoundBySfxInfo(sfxinfo) == NULL)
{
if (!CacheSFX(sfxinfo))
{
@@ -796,7 +805,7 @@
}
}
- LockAllocatedSound(sfxinfo->driver_data);
+ LockAllocatedSound(GetAllocatedSoundBySfxInfo(sfxinfo));
return true;
}
@@ -879,7 +888,7 @@
return -1;
}
- snd = sfxinfo->driver_data;
+ snd = GetAllocatedSoundBySfxInfo(sfxinfo);
// play sound