summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
{