foxygit / doom Log in
commit be0bd464d19758f3e87b79766e9820b1efbda04b
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Sun Mar 23 01:15:03 2014 -0400
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Sun Mar 23 01:15:03 2014 -0400

    pcsound: Extend frequency table to 128 entries.

    Extend from 96 to the full 128 entries found in the frequency table in
    the Vanilla .exes. This was helpfully posted by Gez to the Doom wiki:

      http://doomwiki.org/wiki/Talk:PC_speaker_sound_effects

    Change from the current scheme of storing frequency values to using
    the timer divisor values used by the Vanilla .exes; divide into the PC
    timer frequency to calculate the frequencies to play.

    Thanks to Gez for dumping the full list of frequencies; this fixes #336.
---
 src/i_pcsound.c | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/src/i_pcsound.c b/src/i_pcsound.c
index 907aeb54..655f5a8b 100644
--- a/src/i_pcsound.c
+++ b/src/i_pcsound.c
@@ -36,6 +36,8 @@

 #include "pcsound.h"

+#define TIMER_FREQ 1193181 /* hz */
+
 static boolean pcs_initialized = false;

 static SDL_mutex *sound_lock;
@@ -47,18 +49,24 @@ static unsigned int current_sound_remaining = 0;
 static int current_sound_handle = 0;
 static int current_sound_lump_num = -1;

-static const float frequencies[] = {
-    0.0f, 175.00f, 180.02f, 185.01f, 190.02f, 196.02f, 202.02f, 208.01f, 214.02f, 220.02f,
-    226.02f, 233.04f, 240.02f, 247.03f, 254.03f, 262.00f, 269.03f, 277.03f, 285.04f,
-    294.03f, 302.07f, 311.04f, 320.05f, 330.06f, 339.06f, 349.08f, 359.06f, 370.09f,
-    381.08f, 392.10f, 403.10f, 415.01f, 427.05f, 440.12f, 453.16f, 466.08f, 480.15f,
-    494.07f, 508.16f, 523.09f, 539.16f, 554.19f, 571.17f, 587.19f, 604.14f, 622.09f,
-    640.11f, 659.21f, 679.10f, 698.17f, 719.21f, 740.18f, 762.41f, 784.47f, 807.29f,
-    831.48f, 855.32f, 880.57f, 906.67f, 932.17f, 960.69f, 988.55f, 1017.20f, 1046.64f,
-    1077.85f, 1109.93f, 1141.79f, 1175.54f, 1210.12f, 1244.19f, 1281.61f, 1318.43f,
-    1357.42f, 1397.16f, 1439.30f, 1480.37f, 1523.85f, 1569.97f, 1614.58f, 1661.81f,
-    1711.87f, 1762.45f, 1813.34f, 1864.34f, 1921.38f, 1975.46f, 2036.14f, 2093.29f,
-    2157.64f, 2217.80f, 2285.78f, 2353.41f, 2420.24f, 2490.98f, 2565.97f, 2639.77f,
+static const uint16_t divisors[] = {
+    0,
+    6818, 6628, 6449, 6279, 6087, 5906, 5736, 5575,
+    5423, 5279, 5120, 4971, 4830, 4697, 4554, 4435,
+    4307, 4186, 4058, 3950, 3836, 3728, 3615, 3519,
+    3418, 3323, 3224, 3131, 3043, 2960, 2875, 2794,
+    2711, 2633, 2560, 2485, 2415, 2348, 2281, 2213,
+    2153, 2089, 2032, 1975, 1918, 1864, 1810, 1757,
+    1709, 1659, 1612, 1565, 1521, 1478, 1435, 1395,
+    1355, 1316, 1280, 1242, 1207, 1173, 1140, 1107,
+    1075, 1045, 1015,  986,  959,  931,  905,  879,
+     854,  829,  806,  783,  760,  739,  718,  697,
+     677,  658,  640,  621,  604,  586,  570,  553,
+     538,  522,  507,  493,  479,  465,  452,  439,
+     427,  415,  403,  391,  380,  369,  359,  348,
+     339,  329,  319,  310,  302,  293,  285,  276,
+     269,  261,  253,  246,  239,  232,  226,  219,
+     213,  207,  201,  195,  190,  184,  179,
 };

 static void PCSCallbackFunc(int *duration, int *freq)
@@ -72,7 +80,7 @@ static void PCSCallbackFunc(int *duration, int *freq)
         *freq = 0;
         return;
     }
-
+
     if (current_sound_lump != NULL && current_sound_remaining > 0)
     {
         // Read the next tone
@@ -83,9 +91,9 @@ static void PCSCallbackFunc(int *duration, int *freq)
         // for a full discussion of this.
         // Check we don't overflow the frequency table.

-        if (tone < arrlen(frequencies))
+        if (tone < arrlen(divisors) && divisors[tone] != 0)
         {
-            *freq = (int) frequencies[tone];
+            *freq = (int) (TIMER_FREQ / divisors[tone]);
         }
         else
         {