summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2014-03-23 01:15:03 -0400
committerSimon Howard2014-03-23 01:15:03 -0400
commitbe0bd464d19758f3e87b79766e9820b1efbda04b (patch)
treec600478ef51f4d902aceee64985031e8e728f8b6
parent4878ba55d2db88aaab117628cc1e91933cc0e50e (diff)
downloadchocolate-doom-be0bd464d19758f3e87b79766e9820b1efbda04b.tar.gz
chocolate-doom-be0bd464d19758f3e87b79766e9820b1efbda04b.tar.bz2
chocolate-doom-be0bd464d19758f3e87b79766e9820b1efbda04b.zip
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.
-rw-r--r--src/i_pcsound.c38
1 files 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
{