foxygit / doom Log in
commit f6deaba729b678fa92d3edddf1b1b1ea944f78fc
Author:     Jonathan Dowland <jon+github@alcopop.org>
AuthorDate: Wed Jun 24 20:59:59 2015 +0100
Commit:     Jonathan Dowland <jon+github@alcopop.org>
CommitDate: Mon Jul 6 20:00:47 2015 +0100

    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
---
 src/i_sdlsound.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/i_sdlsound.c b/src/i_sdlsound.c
index f9188b2c..8d612280 100644
--- a/src/i_sdlsound.c
+++ b/src/i_sdlsound.c
@@ -136,10 +136,6 @@ static void FreeAllocatedSound(allocated_sound_t *snd)

     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 @@ static Mix_Chunk *AllocateSound(sfxinfo_t *sfxinfo, size_t len)
     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 @@ static void UnlockAllocatedSound(allocated_sound_t *snd)
     //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 void I_SDL_PrecacheSounds(sfxinfo_t *sounds, int num_sounds)
 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 @@ static boolean LockSound(sfxinfo_t *sfxinfo)
         }
     }

-    LockAllocatedSound(sfxinfo->driver_data);
+    LockAllocatedSound(GetAllocatedSoundBySfxInfo(sfxinfo));

     return true;
 }
@@ -879,7 +888,7 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep, i
         return -1;
     }

-    snd = sfxinfo->driver_data;
+    snd = GetAllocatedSoundBySfxInfo(sfxinfo);

     // play sound