ref: 47c0b5207ed5bc077f1d9d59f94c12c522f2a0b9
parent: 1a9f364f3fe08bc769b66f162edec4f1bdf22345
author: Simon Howard <[email protected]>
date: Wed Sep 17 15:10:54 EDT 2008
Split sound code out of Heretic's i_ibm.c into s_sound.c. Rename soundst.h to s_sound.h to fit. Reformat sounds.c files to declare sounds through macros and harmonise on the common sfxinfo_t. Fix up Heretic sound code to use common sound API. Subversion-branch: /branches/raven-branch Subversion-revision: 1236
--- a/src/doom/deh_sound.c
+++ b/src/doom/deh_sound.c
@@ -41,7 +41,7 @@
DEH_MAPPING("Zero 1", link)
DEH_MAPPING("Zero 2", pitch)
DEH_MAPPING("Zero 3", volume)
- DEH_MAPPING("Zero 4", data)
+ DEH_UNSUPPORTED_MAPPING("Zero 4")
DEH_MAPPING("Neg. One 1", usefulness)
DEH_MAPPING("Neg. One 2", lumpnum)
DEH_END_MAPPING
--- a/src/doom/sounds.c
+++ b/src/doom/sounds.c
@@ -36,76 +36,79 @@
// Information about all the music
//
+#define MUSIC(name) \
+ { name, 0, NULL, NULL }
+
musicinfo_t S_music[] =
{
- { NULL, 0, 0, 0 },
- { "e1m1", 0, 0, 0 },
- { "e1m2", 0, 0, 0 },
- { "e1m3", 0, 0, 0 },
- { "e1m4", 0, 0, 0 },
- { "e1m5", 0, 0, 0 },
- { "e1m6", 0, 0, 0 },
- { "e1m7", 0, 0, 0 },
- { "e1m8", 0, 0, 0 },
- { "e1m9", 0, 0, 0 },
- { "e2m1", 0, 0, 0 },
- { "e2m2", 0, 0, 0 },
- { "e2m3", 0, 0, 0 },
- { "e2m4", 0, 0, 0 },
- { "e2m5", 0, 0, 0 },
- { "e2m6", 0, 0, 0 },
- { "e2m7", 0, 0, 0 },
- { "e2m8", 0, 0, 0 },
- { "e2m9", 0, 0, 0 },
- { "e3m1", 0, 0, 0 },
- { "e3m2", 0, 0, 0 },
- { "e3m3", 0, 0, 0 },
- { "e3m4", 0, 0, 0 },
- { "e3m5", 0, 0, 0 },
- { "e3m6", 0, 0, 0 },
- { "e3m7", 0, 0, 0 },
- { "e3m8", 0, 0, 0 },
- { "e3m9", 0, 0, 0 },
- { "inter", 0, 0, 0 },
- { "intro", 0, 0, 0 },
- { "bunny", 0, 0, 0 },
- { "victor", 0, 0, 0 },
- { "introa", 0, 0, 0 },
- { "runnin", 0, 0, 0 },
- { "stalks", 0, 0, 0 },
- { "countd", 0, 0, 0 },
- { "betwee", 0, 0, 0 },
- { "doom", 0, 0, 0 },
- { "the_da", 0, 0, 0 },
- { "shawn", 0, 0, 0 },
- { "ddtblu", 0, 0, 0 },
- { "in_cit", 0, 0, 0 },
- { "dead", 0, 0, 0 },
- { "stlks2", 0, 0, 0 },
- { "theda2", 0, 0, 0 },
- { "doom2", 0, 0, 0 },
- { "ddtbl2", 0, 0, 0 },
- { "runni2", 0, 0, 0 },
- { "dead2", 0, 0, 0 },
- { "stlks3", 0, 0, 0 },
- { "romero", 0, 0, 0 },
- { "shawn2", 0, 0, 0 },
- { "messag", 0, 0, 0 },
- { "count2", 0, 0, 0 },
- { "ddtbl3", 0, 0, 0 },
- { "ampie", 0, 0, 0 },
- { "theda3", 0, 0, 0 },
- { "adrian", 0, 0, 0 },
- { "messg2", 0, 0, 0 },
- { "romer2", 0, 0, 0 },
- { "tense", 0, 0, 0 },
- { "shawn3", 0, 0, 0 },
- { "openin", 0, 0, 0 },
- { "evil", 0, 0, 0 },
- { "ultima", 0, 0, 0 },
- { "read_m", 0, 0, 0 },
- { "dm2ttl", 0, 0, 0 },
- { "dm2int", 0, 0, 0 }
+ MUSIC(NULL),
+ MUSIC("e1m1"),
+ MUSIC("e1m2"),
+ MUSIC("e1m3"),
+ MUSIC("e1m4"),
+ MUSIC("e1m5"),
+ MUSIC("e1m6"),
+ MUSIC("e1m7"),
+ MUSIC("e1m8"),
+ MUSIC("e1m9"),
+ MUSIC("e2m1"),
+ MUSIC("e2m2"),
+ MUSIC("e2m3"),
+ MUSIC("e2m4"),
+ MUSIC("e2m5"),
+ MUSIC("e2m6"),
+ MUSIC("e2m7"),
+ MUSIC("e2m8"),
+ MUSIC("e2m9"),
+ MUSIC("e3m1"),
+ MUSIC("e3m2"),
+ MUSIC("e3m3"),
+ MUSIC("e3m4"),
+ MUSIC("e3m5"),
+ MUSIC("e3m6"),
+ MUSIC("e3m7"),
+ MUSIC("e3m8"),
+ MUSIC("e3m9"),
+ MUSIC("inter"),
+ MUSIC("intro"),
+ MUSIC("bunny"),
+ MUSIC("victor"),
+ MUSIC("introa"),
+ MUSIC("runnin"),
+ MUSIC("stalks"),
+ MUSIC("countd"),
+ MUSIC("betwee"),
+ MUSIC("doom"),
+ MUSIC("the_da"),
+ MUSIC("shawn"),
+ MUSIC("ddtblu"),
+ MUSIC("in_cit"),
+ MUSIC("dead"),
+ MUSIC("stlks2"),
+ MUSIC("theda2"),
+ MUSIC("doom2"),
+ MUSIC("ddtbl2"),
+ MUSIC("runni2"),
+ MUSIC("dead2"),
+ MUSIC("stlks3"),
+ MUSIC("romero"),
+ MUSIC("shawn2"),
+ MUSIC("messag"),
+ MUSIC("count2"),
+ MUSIC("ddtbl3"),
+ MUSIC("ampie"),
+ MUSIC("theda3"),
+ MUSIC("adrian"),
+ MUSIC("messg2"),
+ MUSIC("romer2"),
+ MUSIC("tense"),
+ MUSIC("shawn3"),
+ MUSIC("openin"),
+ MUSIC("evil"),
+ MUSIC("ultima"),
+ MUSIC("read_m"),
+ MUSIC("dm2ttl"),
+ MUSIC("dm2int")
};
@@ -113,117 +116,122 @@
// Information about all the sfx
//
+#define SOUND(name, priority) \
+ { name, priority, NULL, -1, -1, 0, 0, -1, NULL }
+#define SOUND_LINK(name, priority, link_id, pitch, volume) \
+ { name, priority, &S_sfx[link_id], pitch, volume, 0, 0, -1, NULL }
+
sfxinfo_t S_sfx[] =
{
// S_sfx[0] needs to be a dummy for odd reasons.
- { "none", 0, 0, -1, -1, 0, 0, 0, NULL },
- { "pistol", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "shotgn", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "sgcock", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "dshtgn", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "dbopn", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "dbcls", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "dbload", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "plasma", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "bfg", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "sawup", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "sawidl", 118, 0, -1, -1, 0, 0, 0, NULL },
- { "sawful", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "sawhit", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "rlaunc", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "rxplod", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "firsht", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "firxpl", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "pstart", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "pstop", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "doropn", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "dorcls", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "stnmov", 119, 0, -1, -1, 0, 0, 0, NULL },
- { "swtchn", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "swtchx", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "plpain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "dmpain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "popain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "vipain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "mnpain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "pepain", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "slop", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "itemup", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "wpnup", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "oof", 96, 0, -1, -1, 0, 0, 0, NULL },
- { "telept", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "posit1", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "posit2", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "posit3", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "bgsit1", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "bgsit2", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "sgtsit", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "cacsit", 98, 0, -1, -1, 0, 0, 0, NULL },
- { "brssit", 94, 0, -1, -1, 0, 0, 0, NULL },
- { "cybsit", 92, 0, -1, -1, 0, 0, 0, NULL },
- { "spisit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "bspsit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "kntsit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "vilsit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "mansit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "pesit", 90, 0, -1, -1, 0, 0, 0, NULL },
- { "sklatk", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "sgtatk", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skepch", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "vilatk", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "claw", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skeswg", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "pldeth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "pdiehi", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "podth1", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "podth2", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "podth3", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "bgdth1", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "bgdth2", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "sgtdth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "cacdth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skldth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "brsdth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "cybdth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "spidth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "bspdth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "vildth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "kntdth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "pedth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "skedth", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "posact", 120, 0, -1, -1, 0, 0, 0, NULL },
- { "bgact", 120, 0, -1, -1, 0, 0, 0, NULL },
- { "dmact", 120, 0, -1, -1, 0, 0, 0, NULL },
- { "bspact", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "bspwlk", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "vilact", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "noway", 78, 0, -1, -1, 0, 0, 0, NULL },
- { "barexp", 60, 0, -1, -1, 0, 0, 0, NULL },
- { "punch", 64, 0, -1, -1, 0, 0, 0, NULL },
- { "hoof", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "metal", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "chgun", 64, &S_sfx[sfx_pistol], 150, 0, 0, 0, 0, NULL },
- { "tink", 60, 0, -1, -1, 0, 0, 0, NULL },
- { "bdopn", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "bdcls", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "itmbk", 100, 0, -1, -1, 0, 0, 0, NULL },
- { "flame", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "flamst", 32, 0, -1, -1, 0, 0, 0, NULL },
- { "getpow", 60, 0, -1, -1, 0, 0, 0, NULL },
- { "bospit", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "boscub", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "bossit", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "bospn", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "bosdth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "manatk", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "mandth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "sssit", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "ssdth", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "keenpn", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "keendt", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skeact", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skesit", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "skeatk", 70, 0, -1, -1, 0, 0, 0, NULL },
- { "radio", 60, 0, -1, -1, 0, 0, 0, NULL }
+ SOUND("none", 0),
+ SOUND("pistol", 64),
+ SOUND("shotgn", 64),
+ SOUND("sgcock", 64),
+ SOUND("dshtgn", 64),
+ SOUND("dbopn", 64),
+ SOUND("dbcls", 64),
+ SOUND("dbload", 64),
+ SOUND("plasma", 64),
+ SOUND("bfg", 64),
+ SOUND("sawup", 64),
+ SOUND("sawidl", 118),
+ SOUND("sawful", 64),
+ SOUND("sawhit", 64),
+ SOUND("rlaunc", 64),
+ SOUND("rxplod", 70),
+ SOUND("firsht", 70),
+ SOUND("firxpl", 70),
+ SOUND("pstart", 100),
+ SOUND("pstop", 100),
+ SOUND("doropn", 100),
+ SOUND("dorcls", 100),
+ SOUND("stnmov", 119),
+ SOUND("swtchn", 78),
+ SOUND("swtchx", 78),
+ SOUND("plpain", 96),
+ SOUND("dmpain", 96),
+ SOUND("popain", 96),
+ SOUND("vipain", 96),
+ SOUND("mnpain", 96),
+ SOUND("pepain", 96),
+ SOUND("slop", 78),
+ SOUND("itemup", 78),
+ SOUND("wpnup", 78),
+ SOUND("oof", 96),
+ SOUND("telept", 32),
+ SOUND("posit1", 98),
+ SOUND("posit2", 98),
+ SOUND("posit3", 98),
+ SOUND("bgsit1", 98),
+ SOUND("bgsit2", 98),
+ SOUND("sgtsit", 98),
+ SOUND("cacsit", 98),
+ SOUND("brssit", 94),
+ SOUND("cybsit", 92),
+ SOUND("spisit", 90),
+ SOUND("bspsit", 90),
+ SOUND("kntsit", 90),
+ SOUND("vilsit", 90),
+ SOUND("mansit", 90),
+ SOUND("pesit", 90),
+ SOUND("sklatk", 70),
+ SOUND("sgtatk", 70),
+ SOUND("skepch", 70),
+ SOUND("vilatk", 70),
+ SOUND("claw", 70),
+ SOUND("skeswg", 70),
+ SOUND("pldeth", 32),
+ SOUND("pdiehi", 32),
+ SOUND("podth1", 70),
+ SOUND("podth2", 70),
+ SOUND("podth3", 70),
+ SOUND("bgdth1", 70),
+ SOUND("bgdth2", 70),
+ SOUND("sgtdth", 70),
+ SOUND("cacdth", 70),
+ SOUND("skldth", 70),
+ SOUND("brsdth", 32),
+ SOUND("cybdth", 32),
+ SOUND("spidth", 32),
+ SOUND("bspdth", 32),
+ SOUND("vildth", 32),
+ SOUND("kntdth", 32),
+ SOUND("pedth", 32),
+ SOUND("skedth", 32),
+ SOUND("posact", 120),
+ SOUND("bgact", 120),
+ SOUND("dmact", 120),
+ SOUND("bspact", 100),
+ SOUND("bspwlk", 100),
+ SOUND("vilact", 100),
+ SOUND("noway", 78),
+ SOUND("barexp", 60),
+ SOUND("punch", 64),
+ SOUND("hoof", 70),
+ SOUND("metal", 70),
+ SOUND_LINK("chgun", 64, sfx_pistol, 150, 0),
+ SOUND("tink", 60),
+ SOUND("bdopn", 100),
+ SOUND("bdcls", 100),
+ SOUND("itmbk", 100),
+ SOUND("flame", 32),
+ SOUND("flamst", 32),
+ SOUND("getpow", 60),
+ SOUND("bospit", 70),
+ SOUND("boscub", 70),
+ SOUND("bossit", 70),
+ SOUND("bospn", 70),
+ SOUND("bosdth", 70),
+ SOUND("manatk", 70),
+ SOUND("mandth", 70),
+ SOUND("sssit", 70),
+ SOUND("ssdth", 70),
+ SOUND("keenpn", 70),
+ SOUND("keendt", 70),
+ SOUND("skeact", 70),
+ SOUND("skesit", 70),
+ SOUND("skeatk", 70),
+ SOUND("radio", 60),
};
--- a/src/heretic/Makefile.am
+++ b/src/heretic/Makefile.am
@@ -1,4 +1,6 @@
+AM_CFLAGS=-I..
+
noinst_LIBRARIES=libheretic.a
SOURCE_FILES= \
@@ -12,7 +14,6 @@
dstrings.h \
f_finale.c \
g_game.c \
- i_header.h \
info.c info.h \
in_lude.c \
m_misc.c \
@@ -46,7 +47,7 @@
r_things.c \
sb_bar.c \
sounds.c sounds.h \
- soundst.h \
+s_sound.c s_sound.h \
v_video.c
EXTRA_DIST= \
@@ -55,5 +56,4 @@
i_ibm.c
libheretic_a_SOURCES=$(SOURCE_FILES)
-libheretic_a_CFLAGS=-I..
--- a/src/heretic/ct_chat.c
+++ b/src/heretic/ct_chat.c
@@ -28,7 +28,7 @@
#include <ctype.h>
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
#define QUEUESIZE 128
#define MESSAGESIZE 128
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -33,7 +33,7 @@
#include <stdlib.h>
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
boolean shareware = false; // true if only episode 1 present
boolean ExtendedWAD = false; // true if episodes 4 and 5 present
--- a/src/heretic/f_finale.c
+++ b/src/heretic/f_finale.c
@@ -23,7 +23,7 @@
// F_finale.c
#include "doomdef.h"
-#include "soundst.h"
+#include "s_sound.h"
#include <ctype.h>
int finalestage; // 0 = text, 1 = art screen
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -27,7 +27,7 @@
#include <string.h>
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/i_header.h
+++ /dev/null
@@ -1,99 +1,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 1993-2008 Raven Software
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-//
-//-----------------------------------------------------------------------------
-#ifndef __I_HEADER_H__
-#define __I_HEADER_H__
-
-#include "doomdef.h"
-
-//--------
-//SOUND IO
-//--------
-#define FREQ_LOW 0x40
-#define FREQ_NORM 0x80
-#define FREQ_HIGH 0xff
-
-void I_SetMasterVolume(int volume);
-
-void I_TurnOffSfx(void);
-void I_TurnOnSfx(void);
-void I_TurnOffMusic(void);
-void I_TurnOnMusic(void);
-
-// MUSIC I/O
-//
-
-int I_RegisterSong(void *songdata);
-// called by anything that wants to register a song lump with the sound lib
-// calls Paul's function of the similar name to register music only.
-// note that the song data is the same for any sound card and is paul's
-// MUS format. Returns a handle which will be passed to all other music
-// functions.
-
-void I_UnregisterSong(int handle);
-// called by anything which is finished with a song and no longer needs
-// the sound library to be aware of it. All songs should be stopped
-// before calling this, but it will double check and stop it if necessary.
-
-void I_LoopSong(int handle);
-// called by anything that wishes to start music.
-// plays a song, and when the song is done, starts playing it again in
-// an endless loop. the start is faded in over three seconds.
-
-void I_FadeOutSong(int handle, int fotime);
-// called by anything that wishes to stop music.
-// fades out the song over <fotime> milliseconds.
-
-void I_StopSong(int handle);
-// called by anything that wishes to stop music.
-// stops a song abruptly.
-
-// SFX I/O
-//
-
-void *I_GetSoundEffect(char *soundname);
-// called by routines which wish to play a sound effect at some later
-// time. Pass it the lump name of a sound effect WITHOUT the sfx
-// prefix. This means the maximum name length is 7 letters/digits.
-// The prefixes for different sound cards are 'S','M','A', and 'P'.
-// They refer to the card type. The routine will cache in the
-// appropriate sound effect when it is played.
-
-void I_UngetSoundEffect(void *soundset);
-// called by routines which wish to no longer use the sounds at all
-// frees up the associated structure. It stops any currently playing
-// sound effects.
-
-void I_StartSound(channel_t * c, int vol, int sep, int pitch, int priority);
-// Starts a sound in a particular sound channel
-
-void I_UpdateSoundParams(channel_t * c, int vol, int sep, int pitch);
-// Updates the volume, separation, and pitch of a sound channel
-
-void I_StopSound(channel_t * c);
-// Stops a sound channel
-
-int I_SoundIsPlaying(channel_t * c);
-// called by S_*()'s to see if a channel is still playing. Returns 0
-// if no longer playing, 1 if playing.
-
-#endif
--- a/src/heretic/i_ibm.c
+++ b/src/heretic/i_ibm.c
@@ -30,8 +30,6 @@
#include <graph.h>
#include "doomdef.h"
#include "r_local.h"
-#include "sounds.h"
-#include "i_sound.h"
#include "dmx.h"
// Macros
@@ -71,598 +69,6 @@
extern int usemouse, usejoystick;
extern void **lumpcache;
-
-/*
-===============================================================================
-
- MUSIC & SFX API
-
-===============================================================================
-*/
-
-static channel_t channel[MAX_CHANNELS];
-
-static int rs; //the current registered song.
-int mus_song = -1;
-int mus_lumpnum;
-void *mus_sndptr;
-byte *soundCurve;
-
-extern sfxinfo_t S_sfx[];
-extern musicinfo_t S_music[];
-
-extern int snd_DesiredMusicDevice;
-extern int snd_DesiredSfxDevice;
-extern int snd_MaxVolume;
-extern int snd_MusicVolume;
-extern int snd_Channels;
-
-extern int startepisode;
-extern int startmap;
-
-int AmbChan;
-
-void S_Start(void)
-{
- int i;
-
- S_StartSong((gameepisode - 1) * 9 + gamemap - 1, true);
-
- //stop all sounds
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].handle)
- {
- S_StopSound(channel[i].mo);
- }
- }
- memset(channel, 0, 8 * sizeof(channel_t));
-}
-
-void S_StartSong(int song, boolean loop)
-{
- if (song == mus_song)
- { // don't replay an old song
- return;
- }
- if (rs)
- {
- I_StopSong(rs);
- I_UnRegisterSong(rs);
- Z_ChangeTag(lumpcache[mus_lumpnum], PU_CACHE);
-#ifdef __WATCOMC__
- _dpmi_unlockregion(mus_sndptr, lumpinfo[mus_lumpnum].size);
-#endif
- }
- if (song < mus_e1m1 || song > NUMMUSIC)
- {
- return;
- }
- mus_lumpnum = W_GetNumForName(S_music[song].name);
- mus_sndptr = W_CacheLumpNum(mus_lumpnum, PU_MUSIC);
-#ifdef __WATCOMC__
- _dpmi_lockregion(mus_sndptr, lumpinfo[mus_lumpnum].size);
-#endif
- rs = I_RegisterSong(mus_sndptr);
- I_PlaySong(rs, loop); //'true' denotes endless looping.
- mus_song = song;
-}
-
-void S_StartSound(mobj_t * origin, int sound_id)
-{
- int dist, vol;
- int i;
- int sound;
- int priority;
- int sep;
- int angle;
- int absx;
- int absy;
-
- static int sndcount = 0;
- int chan;
-
- if (sound_id == 0 || snd_MaxVolume == 0)
- return;
- if (origin == NULL)
- {
- origin = players[consoleplayer].mo;
- }
-
-// calculate the distance before other stuff so that we can throw out
-// sounds that are beyond the hearing range.
- absx = abs(origin->x - players[consoleplayer].mo->x);
- absy = abs(origin->y - players[consoleplayer].mo->y);
- dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1);
- dist >>= FRACBITS;
-// dist = P_AproxDistance(origin->x-viewx, origin->y-viewy)>>FRACBITS;
-
- if (dist >= MAX_SND_DIST)
- {
-// dist = MAX_SND_DIST - 1;
- return; //sound is beyond the hearing range...
- }
- if (dist < 0)
- {
- dist = 0;
- }
- priority = S_sfx[sound_id].priority;
- priority *= (10 - (dist / 160));
- if (!S_StopSoundID(sound_id, priority))
- {
- return; // other sounds have greater priority
- }
- for (i = 0; i < snd_Channels; i++)
- {
- if (origin->player)
- {
- i = snd_Channels;
- break; // let the player have more than one sound.
- }
- if (origin == channel[i].mo)
- { // only allow other mobjs one sound
- S_StopSound(channel[i].mo);
- break;
- }
- }
- if (i >= snd_Channels)
- {
- if (sound_id >= sfx_wind)
- {
- if (AmbChan != -1 && S_sfx[sound_id].priority <=
- S_sfx[channel[AmbChan].sound_id].priority)
- {
- return; //ambient channel already in use
- }
- else
- {
- AmbChan = -1;
- }
- }
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].mo == NULL)
- {
- break;
- }
- }
- if (i >= snd_Channels)
- {
- //look for a lower priority sound to replace.
- sndcount++;
- if (sndcount >= snd_Channels)
- {
- sndcount = 0;
- }
- for (chan = 0; chan < snd_Channels; chan++)
- {
- i = (sndcount + chan) % snd_Channels;
- if (priority >= channel[i].priority)
- {
- chan = -1; //denote that sound should be replaced.
- break;
- }
- }
- if (chan != -1)
- {
- return; //no free channels.
- }
- else //replace the lower priority sound.
- {
- if (channel[i].handle)
- {
- if (I_SoundIsPlaying(channel[i].handle))
- {
- I_StopSound(channel[i].handle);
- }
- if (S_sfx[channel[i].sound_id].usefulness > 0)
- {
- S_sfx[channel[i].sound_id].usefulness--;
- }
-
- if (AmbChan == i)
- {
- AmbChan = -1;
- }
- }
- }
- }
- }
- if (S_sfx[sound_id].lumpnum == 0)
- {
- S_sfx[sound_id].lumpnum = I_GetSfxLumpNum(&S_sfx[sound_id]);
- }
- if (S_sfx[sound_id].snd_ptr == NULL)
- {
- S_sfx[sound_id].snd_ptr = W_CacheLumpNum(S_sfx[sound_id].lumpnum,
- PU_SOUND);
-#ifdef __WATCOMC__
- _dpmi_lockregion(S_sfx[sound_id].snd_ptr,
- lumpinfo[S_sfx[sound_id].lumpnum].size);
-#endif
- }
-
- // calculate the volume based upon the distance from the sound origin.
-// vol = (snd_MaxVolume*16 + dist*(-snd_MaxVolume*16)/MAX_SND_DIST)>>9;
- vol = soundCurve[dist];
-
- if (origin == players[consoleplayer].mo)
- {
- sep = 128;
- }
- else
- {
- angle = R_PointToAngle2(players[consoleplayer].mo->x,
- players[consoleplayer].mo->y,
- channel[i].mo->x, channel[i].mo->y);
- angle = (angle - viewangle) >> 24;
- sep = angle * 2 - 128;
- if (sep < 64)
- sep = -sep;
- if (sep > 192)
- sep = 512 - sep;
- }
-
- channel[i].pitch = (byte) (127 + (M_Random() & 7) - (M_Random() & 7));
- channel[i].handle =
- I_StartSound(sound_id, S_sfx[sound_id].snd_ptr, vol, sep,
- channel[i].pitch, 0);
- channel[i].mo = origin;
- channel[i].sound_id = sound_id;
- channel[i].priority = priority;
- if (sound_id >= sfx_wind)
- {
- AmbChan = i;
- }
- if (S_sfx[sound_id].usefulness == -1)
- {
- S_sfx[sound_id].usefulness = 1;
- }
- else
- {
- S_sfx[sound_id].usefulness++;
- }
-}
-
-void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume)
-{
- int dist;
- int i;
- int sep;
-
- static int sndcount;
- int chan;
-
- if (sound_id == 0 || snd_MaxVolume == 0)
- return;
- if (origin == NULL)
- {
- origin = players[consoleplayer].mo;
- }
-
- if (volume == 0)
- {
- return;
- }
- volume = (volume * (snd_MaxVolume + 1) * 8) >> 7;
-
-// no priority checking, as ambient sounds would be the LOWEST.
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].mo == NULL)
- {
- break;
- }
- }
- if (i >= snd_Channels)
- {
- return;
- }
- if (S_sfx[sound_id].lumpnum == 0)
- {
- S_sfx[sound_id].lumpnum = I_GetSfxLumpNum(&S_sfx[sound_id]);
- }
- if (S_sfx[sound_id].snd_ptr == NULL)
- {
- S_sfx[sound_id].snd_ptr = W_CacheLumpNum(S_sfx[sound_id].lumpnum,
- PU_SOUND);
-#ifdef __WATCOMC__
- _dpmi_lockregion(S_sfx[sound_id].snd_ptr,
- lumpinfo[S_sfx[sound_id].lumpnum].size);
-#endif
- }
- channel[i].pitch = (byte) (127 - (M_Random() & 3) + (M_Random() & 3));
- channel[i].handle =
- I_StartSound(sound_id, S_sfx[sound_id].snd_ptr, volume, 128,
- channel[i].pitch, 0);
- channel[i].mo = origin;
- channel[i].sound_id = sound_id;
- channel[i].priority = 1; //super low priority.
- if (S_sfx[sound_id].usefulness == -1)
- {
- S_sfx[sound_id].usefulness = 1;
- }
- else
- {
- S_sfx[sound_id].usefulness++;
- }
-}
-
-boolean S_StopSoundID(int sound_id, int priority)
-{
- int i;
- int lp; //least priority
- int found;
-
- if (S_sfx[sound_id].numchannels == -1)
- {
- return (true);
- }
- lp = -1; //denote the argument sound_id
- found = 0;
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].sound_id == sound_id && channel[i].mo)
- {
- found++; //found one. Now, should we replace it??
- if (priority >= channel[i].priority)
- { // if we're gonna kill one, then this'll be it
- lp = i;
- priority = channel[i].priority;
- }
- }
- }
- if (found < S_sfx[sound_id].numchannels)
- {
- return (true);
- }
- else if (lp == -1)
- {
- return (false); // don't replace any sounds
- }
- if (channel[lp].handle)
- {
- if (I_SoundIsPlaying(channel[lp].handle))
- {
- I_StopSound(channel[lp].handle);
- }
- if (S_sfx[channel[i].sound_id].usefulness > 0)
- {
- S_sfx[channel[i].sound_id].usefulness--;
- }
- channel[lp].mo = NULL;
- }
- return (true);
-}
-
-void S_StopSound(mobj_t * origin)
-{
- int i;
-
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].mo == origin)
- {
- I_StopSound(channel[i].handle);
- if (S_sfx[channel[i].sound_id].usefulness > 0)
- {
- S_sfx[channel[i].sound_id].usefulness--;
- }
- channel[i].handle = 0;
- channel[i].mo = NULL;
- if (AmbChan == i)
- {
- AmbChan = -1;
- }
- }
- }
-}
-
-void S_SoundLink(mobj_t * oldactor, mobj_t * newactor)
-{
- int i;
-
- for (i = 0; i < snd_Channels; i++)
- {
- if (channel[i].mo == oldactor)
- channel[i].mo = newactor;
- }
-}
-
-void S_PauseSound(void)
-{
- I_PauseSong(rs);
-}
-
-void S_ResumeSound(void)
-{
- I_ResumeSong(rs);
-}
-
-static int nextcleanup;
-
-void S_UpdateSounds(mobj_t * listener)
-{
- int i, dist, vol;
- int angle;
- int sep;
- int priority;
- int absx;
- int absy;
-
- listener = players[consoleplayer].mo;
- if (snd_MaxVolume == 0)
- {
- return;
- }
- if (nextcleanup < gametic)
- {
- for (i = 0; i < NUMSFX; i++)
- {
- if (S_sfx[i].usefulness == 0 && S_sfx[i].snd_ptr)
- {
- if (lumpcache[S_sfx[i].lumpnum])
- {
- if (((memblock_t
- *) ((byte *) (lumpcache[S_sfx[i].lumpnum]) -
- sizeof(memblock_t)))->id == 0x1d4a11)
- { // taken directly from the Z_ChangeTag macro
- Z_ChangeTag2(lumpcache[S_sfx[i].lumpnum], PU_CACHE);
-#ifdef __WATCOMC__
- _dpmi_unlockregion(S_sfx[i].snd_ptr,
- lumpinfo[S_sfx[i].lumpnum].size);
-#endif
- }
- }
- S_sfx[i].usefulness = -1;
- S_sfx[i].snd_ptr = NULL;
- }
- }
- nextcleanup = gametic + 35; //CLEANUP DEBUG cleans every second
- }
- for (i = 0; i < snd_Channels; i++)
- {
- if (!channel[i].handle || S_sfx[channel[i].sound_id].usefulness == -1)
- {
- continue;
- }
- if (!I_SoundIsPlaying(channel[i].handle))
- {
- if (S_sfx[channel[i].sound_id].usefulness > 0)
- {
- S_sfx[channel[i].sound_id].usefulness--;
- }
- channel[i].handle = 0;
- channel[i].mo = NULL;
- channel[i].sound_id = 0;
- if (AmbChan == i)
- {
- AmbChan = -1;
- }
- }
- if (channel[i].mo == NULL || channel[i].sound_id == 0
- || channel[i].mo == players[consoleplayer].mo)
- {
- continue;
- }
- else
- {
- absx = abs(channel[i].mo->x - players[consoleplayer].mo->x);
- absy = abs(channel[i].mo->y - players[consoleplayer].mo->y);
- dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1);
- dist >>= FRACBITS;
-// dist = P_AproxDistance(channel[i].mo->x-listener->x, channel[i].mo->y-listener->y)>>FRACBITS;
-
- if (dist >= MAX_SND_DIST)
- {
- S_StopSound(channel[i].mo);
- continue;
- }
- if (dist < 0)
- dist = 0;
-
-// calculate the volume based upon the distance from the sound origin.
-// vol = (*((byte *)W_CacheLumpName("SNDCURVE", PU_CACHE)+dist)*(snd_MaxVolume*8))>>7;
- vol = soundCurve[dist];
-
- angle = R_PointToAngle2(players[consoleplayer].mo->x,
- players[consoleplayer].mo->y,
- channel[i].mo->x, channel[i].mo->y);
- angle = (angle - viewangle) >> 24;
- sep = angle * 2 - 128;
- if (sep < 64)
- sep = -sep;
- if (sep > 192)
- sep = 512 - sep;
- I_UpdateSoundParams(channel[i].handle, vol, sep,
- channel[i].pitch);
- priority = S_sfx[channel[i].sound_id].priority;
- priority *= (10 - (dist >> 8));
- channel[i].priority = priority;
- }
- }
-}
-
-void S_Init(void)
-{
- soundCurve = Z_Malloc(MAX_SND_DIST, PU_STATIC, NULL);
- I_StartupSound();
- if (snd_Channels > 8)
- {
- snd_Channels = 8;
- }
- I_SetChannels(snd_Channels);
- I_SetMusicVolume(snd_MusicVolume);
- S_SetMaxVolume(true);
-}
-
-void S_GetChannelInfo(SoundInfo_t * s)
-{
- int i;
- ChanInfo_t *c;
-
- s->channelCount = snd_Channels;
- s->musicVolume = snd_MusicVolume;
- s->soundVolume = snd_MaxVolume;
- for (i = 0; i < snd_Channels; i++)
- {
- c = &s->chan[i];
- c->id = channel[i].sound_id;
- c->priority = channel[i].priority;
- c->name = S_sfx[c->id].name;
- c->mo = channel[i].mo;
- c->distance = P_AproxDistance(c->mo->x - viewx, c->mo->y - viewy)
- >> FRACBITS;
- }
-}
-
-void S_SetMaxVolume(boolean fullprocess)
-{
- int i;
-
- if (!fullprocess)
- {
- soundCurve[0] =
- (*((byte *) W_CacheLumpName("SNDCURVE", PU_CACHE)) *
- (snd_MaxVolume * 8)) >> 7;
- }
- else
- {
- for (i = 0; i < MAX_SND_DIST; i++)
- {
- soundCurve[i] =
- (*((byte *) W_CacheLumpName("SNDCURVE", PU_CACHE) + i) *
- (snd_MaxVolume * 8)) >> 7;
- }
- }
-}
-
-static boolean musicPaused;
-void S_SetMusicVolume(void)
-{
- I_SetMusicVolume(snd_MusicVolume);
- if (snd_MusicVolume == 0)
- {
- I_PauseSong(rs);
- musicPaused = true;
- }
- else if (musicPaused)
- {
- musicPaused = false;
- I_ResumeSong(rs);
- }
-}
-
-void S_ShutDown(void)
-{
- extern int tsm_ID;
- if (tsm_ID != -1)
- {
- I_StopSong(rs);
- I_UnRegisterSong(rs);
- I_ShutdownSound();
- }
-}
/*
=============================================================================
--- a/src/heretic/i_sound.h
+++ /dev/null
@@ -1,45 +1,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 1993-2008 Raven Software
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-//
-//-----------------------------------------------------------------------------
-#ifndef __SOUND__
-#define __SOUND__
-
-#define SND_TICRATE 140 // tic rate for updating sound
-#define SND_MAXSONGS 40 // max number of songs in game
-#define SND_SAMPLERATE 11025 // sample rate of sound effects
-
-typedef enum
-{
- snd_none,
- snd_PC,
- snd_Adlib,
- snd_SB,
- snd_PAS,
- snd_GUS,
- snd_MPU,
- snd_MPU2,
- snd_MPU3,
- snd_AWE,
- NUM_SCARDS
-} cardenum_t;
-
-#endif
--- a/src/heretic/in_lude.c
+++ b/src/heretic/in_lude.c
@@ -29,7 +29,7 @@
*/
#include "doomdef.h"
-#include "soundst.h"
+#include "s_sound.h"
typedef enum
{
--- a/src/heretic/m_misc.c
+++ b/src/heretic/m_misc.c
@@ -35,7 +35,7 @@
#include <ctype.h>
#include "doomdef.h"
-#include "soundst.h"
+#include "s_sound.h"
int myargc;
char **myargv;
--- a/src/heretic/mn_menu.c
+++ b/src/heretic/mn_menu.c
@@ -27,7 +27,7 @@
#include "doomdef.h"
#include "p_local.h"
#include "r_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/p_ceilng.c
+++ b/src/heretic/p_ceilng.c
@@ -23,7 +23,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
//==================================================================
//==================================================================
--- a/src/heretic/p_doors.c
+++ b/src/heretic/p_doors.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
//==================================================================
//==================================================================
--- a/src/heretic/p_enemy.c
+++ b/src/heretic/p_enemy.c
@@ -26,7 +26,7 @@
#include <stdlib.h>
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/p_floor.c
+++ b/src/heretic/p_floor.c
@@ -22,7 +22,7 @@
//-----------------------------------------------------------------------------
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
//==================================================================
//==================================================================
--- a/src/heretic/p_inter.c
+++ b/src/heretic/p_inter.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
#define BONUSADD 6
--- a/src/heretic/p_map.c
+++ b/src/heretic/p_map.c
@@ -26,7 +26,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
/*
===============================================================================
--- a/src/heretic/p_mobj.c
+++ b/src/heretic/p_mobj.c
@@ -26,7 +26,7 @@
#include "doomdef.h"
#include "p_local.h"
#include "sounds.h"
-#include "soundst.h"
+#include "s_sound.h"
void G_PlayerReborn(int player);
void P_SpawnMapThing(mapthing_t * mthing);
--- a/src/heretic/p_plats.c
+++ b/src/heretic/p_plats.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
plat_t *activeplats[MAXPLATS];
--- a/src/heretic/p_pspr.c
+++ b/src/heretic/p_pspr.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/p_setup.c
+++ b/src/heretic/p_setup.c
@@ -27,7 +27,7 @@
#include <stdlib.h>
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
void P_SpawnMapThing(mapthing_t * mthing);
--- a/src/heretic/p_spec.c
+++ b/src/heretic/p_spec.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/p_switch.c
+++ b/src/heretic/p_switch.c
@@ -23,7 +23,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
//==================================================================
//
--- a/src/heretic/p_telept.c
+++ b/src/heretic/p_telept.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
//----------------------------------------------------------------------------
//
--- a/src/heretic/p_user.c
+++ b/src/heretic/p_user.c
@@ -27,7 +27,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
void P_PlayerNextArtifact(player_t * player);
--- /dev/null
+++ b/src/heretic/s_sound.c
@@ -1,0 +1,576 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 1993-2008 Raven Software
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+//-----------------------------------------------------------------------------
+
+#include <stdlib.h>
+
+#include "doomdef.h"
+#include "sounds.h"
+#include "s_sound.h"
+#include "i_sound.h"
+#include "r_local.h"
+#include "p_local.h"
+
+#include "w_wad.h"
+#include "z_zone.h"
+
+/*
+===============================================================================
+
+ MUSIC & SFX API
+
+===============================================================================
+*/
+
+boolean S_StopSoundID(int sound_id, int priority);
+
+static channel_t channel[MAX_CHANNELS];
+
+static void *rs; // Handle for the registered song
+int mus_song = -1;
+int mus_lumpnum;
+void *mus_sndptr;
+byte *soundCurve;
+
+extern sfxinfo_t S_sfx[];
+extern musicinfo_t S_music[];
+
+extern int snd_DesiredMusicDevice;
+extern int snd_DesiredSfxDevice;
+extern int snd_MaxVolume;
+extern int snd_MusicVolume;
+extern int snd_Channels;
+
+extern int startepisode;
+extern int startmap;
+
+int AmbChan;
+
+void S_Start(void)
+{
+ int i;
+
+ S_StartSong((gameepisode - 1) * 9 + gamemap - 1, true);
+
+ //stop all sounds
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].handle)
+ {
+ S_StopSound(channel[i].mo);
+ }
+ }
+ memset(channel, 0, 8 * sizeof(channel_t));
+}
+
+void S_StartSong(int song, boolean loop)
+{
+ int mus_len;
+
+ if (song == mus_song)
+ { // don't replay an old song
+ return;
+ }
+
+ if (rs != NULL)
+ {
+ I_StopSong();
+ I_UnRegisterSong(rs);
+ }
+
+ if (song < mus_e1m1 || song > NUMMUSIC)
+ {
+ return;
+ }
+ mus_lumpnum = W_GetNumForName(S_music[song].name);
+ mus_sndptr = W_CacheLumpNum(mus_lumpnum, PU_MUSIC);
+ mus_len = W_LumpLength(mus_lumpnum);
+ rs = I_RegisterSong(mus_sndptr, mus_len);
+ I_PlaySong(rs, loop); //'true' denotes endless looping.
+ mus_song = song;
+}
+
+void S_StartSound(mobj_t * origin, int sound_id)
+{
+ int dist, vol;
+ int i;
+ int priority;
+ int sep;
+ int angle;
+ int absx;
+ int absy;
+
+ static int sndcount = 0;
+ int chan;
+
+ if (sound_id == 0 || snd_MaxVolume == 0)
+ return;
+ if (origin == NULL)
+ {
+ origin = players[consoleplayer].mo;
+ }
+
+// calculate the distance before other stuff so that we can throw out
+// sounds that are beyond the hearing range.
+ absx = abs(origin->x - players[consoleplayer].mo->x);
+ absy = abs(origin->y - players[consoleplayer].mo->y);
+ dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1);
+ dist >>= FRACBITS;
+// dist = P_AproxDistance(origin->x-viewx, origin->y-viewy)>>FRACBITS;
+
+ if (dist >= MAX_SND_DIST)
+ {
+// dist = MAX_SND_DIST - 1;
+ return; //sound is beyond the hearing range...
+ }
+ if (dist < 0)
+ {
+ dist = 0;
+ }
+ priority = S_sfx[sound_id].priority;
+ priority *= (10 - (dist / 160));
+ if (!S_StopSoundID(sound_id, priority))
+ {
+ return; // other sounds have greater priority
+ }
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (origin->player)
+ {
+ i = snd_Channels;
+ break; // let the player have more than one sound.
+ }
+ if (origin == channel[i].mo)
+ { // only allow other mobjs one sound
+ S_StopSound(channel[i].mo);
+ break;
+ }
+ }
+ if (i >= snd_Channels)
+ {
+ if (sound_id >= sfx_wind)
+ {
+ if (AmbChan != -1 && S_sfx[sound_id].priority <=
+ S_sfx[channel[AmbChan].sound_id].priority)
+ {
+ return; //ambient channel already in use
+ }
+ else
+ {
+ AmbChan = -1;
+ }
+ }
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].mo == NULL)
+ {
+ break;
+ }
+ }
+ if (i >= snd_Channels)
+ {
+ //look for a lower priority sound to replace.
+ sndcount++;
+ if (sndcount >= snd_Channels)
+ {
+ sndcount = 0;
+ }
+ for (chan = 0; chan < snd_Channels; chan++)
+ {
+ i = (sndcount + chan) % snd_Channels;
+ if (priority >= channel[i].priority)
+ {
+ chan = -1; //denote that sound should be replaced.
+ break;
+ }
+ }
+ if (chan != -1)
+ {
+ return; //no free channels.
+ }
+ else //replace the lower priority sound.
+ {
+ if (channel[i].handle)
+ {
+ if (I_SoundIsPlaying(channel[i].handle))
+ {
+ I_StopSound(channel[i].handle);
+ }
+ if (S_sfx[channel[i].sound_id].usefulness > 0)
+ {
+ S_sfx[channel[i].sound_id].usefulness--;
+ }
+
+ if (AmbChan == i)
+ {
+ AmbChan = -1;
+ }
+ }
+ }
+ }
+ }
+ if (S_sfx[sound_id].lumpnum == 0)
+ {
+ S_sfx[sound_id].lumpnum = I_GetSfxLumpNum(&S_sfx[sound_id]);
+ }
+
+ // calculate the volume based upon the distance from the sound origin.
+// vol = (snd_MaxVolume*16 + dist*(-snd_MaxVolume*16)/MAX_SND_DIST)>>9;
+ vol = soundCurve[dist];
+
+ if (origin == players[consoleplayer].mo)
+ {
+ sep = 128;
+ }
+ else
+ {
+ angle = R_PointToAngle2(players[consoleplayer].mo->x,
+ players[consoleplayer].mo->y,
+ channel[i].mo->x, channel[i].mo->y);
+ angle = (angle - viewangle) >> 24;
+ sep = angle * 2 - 128;
+ if (sep < 64)
+ sep = -sep;
+ if (sep > 192)
+ sep = 512 - sep;
+ }
+
+ // TODO: Play pitch-shifted sounds as in Vanilla Heretic
+
+ channel[i].pitch = (byte) (127 + (M_Random() & 7) - (M_Random() & 7));
+ channel[i].handle = I_StartSound(&S_sfx[sound_id], i, vol, sep);
+ channel[i].mo = origin;
+ channel[i].sound_id = sound_id;
+ channel[i].priority = priority;
+ if (sound_id >= sfx_wind)
+ {
+ AmbChan = i;
+ }
+ if (S_sfx[sound_id].usefulness == -1)
+ {
+ S_sfx[sound_id].usefulness = 1;
+ }
+ else
+ {
+ S_sfx[sound_id].usefulness++;
+ }
+}
+
+void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume)
+{
+ int i;
+
+ if (sound_id == 0 || snd_MaxVolume == 0)
+ return;
+ if (origin == NULL)
+ {
+ origin = players[consoleplayer].mo;
+ }
+
+ if (volume == 0)
+ {
+ return;
+ }
+ volume = (volume * (snd_MaxVolume + 1) * 8) >> 7;
+
+// no priority checking, as ambient sounds would be the LOWEST.
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].mo == NULL)
+ {
+ break;
+ }
+ }
+ if (i >= snd_Channels)
+ {
+ return;
+ }
+ if (S_sfx[sound_id].lumpnum == 0)
+ {
+ S_sfx[sound_id].lumpnum = I_GetSfxLumpNum(&S_sfx[sound_id]);
+ }
+
+ // TODO: Pitch shifting.
+ channel[i].pitch = (byte) (127 - (M_Random() & 3) + (M_Random() & 3));
+ channel[i].handle = I_StartSound(&S_sfx[sound_id], i, volume, 128);
+ channel[i].mo = origin;
+ channel[i].sound_id = sound_id;
+ channel[i].priority = 1; //super low priority.
+ if (S_sfx[sound_id].usefulness == -1)
+ {
+ S_sfx[sound_id].usefulness = 1;
+ }
+ else
+ {
+ S_sfx[sound_id].usefulness++;
+ }
+}
+
+boolean S_StopSoundID(int sound_id, int priority)
+{
+ int i;
+ int lp; //least priority
+ int found;
+
+ if (S_sfx[sound_id].numchannels == -1)
+ {
+ return (true);
+ }
+ lp = -1; //denote the argument sound_id
+ found = 0;
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].sound_id == sound_id && channel[i].mo)
+ {
+ found++; //found one. Now, should we replace it??
+ if (priority >= channel[i].priority)
+ { // if we're gonna kill one, then this'll be it
+ lp = i;
+ priority = channel[i].priority;
+ }
+ }
+ }
+ if (found < S_sfx[sound_id].numchannels)
+ {
+ return (true);
+ }
+ else if (lp == -1)
+ {
+ return (false); // don't replace any sounds
+ }
+ if (channel[lp].handle)
+ {
+ if (I_SoundIsPlaying(channel[lp].handle))
+ {
+ I_StopSound(channel[lp].handle);
+ }
+ if (S_sfx[channel[i].sound_id].usefulness > 0)
+ {
+ S_sfx[channel[i].sound_id].usefulness--;
+ }
+ channel[lp].mo = NULL;
+ }
+ return (true);
+}
+
+void S_StopSound(mobj_t * origin)
+{
+ int i;
+
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].mo == origin)
+ {
+ I_StopSound(channel[i].handle);
+ if (S_sfx[channel[i].sound_id].usefulness > 0)
+ {
+ S_sfx[channel[i].sound_id].usefulness--;
+ }
+ channel[i].handle = 0;
+ channel[i].mo = NULL;
+ if (AmbChan == i)
+ {
+ AmbChan = -1;
+ }
+ }
+ }
+}
+
+void S_SoundLink(mobj_t * oldactor, mobj_t * newactor)
+{
+ int i;
+
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (channel[i].mo == oldactor)
+ channel[i].mo = newactor;
+ }
+}
+
+void S_PauseSound(void)
+{
+ I_PauseSong();
+}
+
+void S_ResumeSound(void)
+{
+ I_ResumeSong();
+}
+
+void S_UpdateSounds(mobj_t * listener)
+{
+ int i, dist, vol;
+ int angle;
+ int sep;
+ int priority;
+ int absx;
+ int absy;
+
+ listener = players[consoleplayer].mo;
+ if (snd_MaxVolume == 0)
+ {
+ return;
+ }
+
+ for (i = 0; i < snd_Channels; i++)
+ {
+ if (!channel[i].handle || S_sfx[channel[i].sound_id].usefulness == -1)
+ {
+ continue;
+ }
+ if (!I_SoundIsPlaying(channel[i].handle))
+ {
+ if (S_sfx[channel[i].sound_id].usefulness > 0)
+ {
+ S_sfx[channel[i].sound_id].usefulness--;
+ }
+ channel[i].handle = 0;
+ channel[i].mo = NULL;
+ channel[i].sound_id = 0;
+ if (AmbChan == i)
+ {
+ AmbChan = -1;
+ }
+ }
+ if (channel[i].mo == NULL || channel[i].sound_id == 0
+ || channel[i].mo == players[consoleplayer].mo)
+ {
+ continue;
+ }
+ else
+ {
+ absx = abs(channel[i].mo->x - players[consoleplayer].mo->x);
+ absy = abs(channel[i].mo->y - players[consoleplayer].mo->y);
+ dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1);
+ dist >>= FRACBITS;
+// dist = P_AproxDistance(channel[i].mo->x-listener->x, channel[i].mo->y-listener->y)>>FRACBITS;
+
+ if (dist >= MAX_SND_DIST)
+ {
+ S_StopSound(channel[i].mo);
+ continue;
+ }
+ if (dist < 0)
+ dist = 0;
+
+// calculate the volume based upon the distance from the sound origin.
+// vol = (*((byte *)W_CacheLumpName("SNDCURVE", PU_CACHE)+dist)*(snd_MaxVolume*8))>>7;
+ vol = soundCurve[dist];
+
+ angle = R_PointToAngle2(players[consoleplayer].mo->x,
+ players[consoleplayer].mo->y,
+ channel[i].mo->x, channel[i].mo->y);
+ angle = (angle - viewangle) >> 24;
+ sep = angle * 2 - 128;
+ if (sep < 64)
+ sep = -sep;
+ if (sep > 192)
+ sep = 512 - sep;
+ // TODO: Pitch shifting.
+ I_UpdateSoundParams(channel[i].handle, vol, sep);
+ priority = S_sfx[channel[i].sound_id].priority;
+ priority *= (10 - (dist >> 8));
+ channel[i].priority = priority;
+ }
+ }
+}
+
+void S_Init(void)
+{
+ soundCurve = Z_Malloc(MAX_SND_DIST, PU_STATIC, NULL);
+ I_InitSound();
+ if (snd_Channels > 8)
+ {
+ snd_Channels = 8;
+ }
+ I_SetMusicVolume(snd_MusicVolume);
+ S_SetMaxVolume(true);
+}
+
+void S_GetChannelInfo(SoundInfo_t * s)
+{
+ int i;
+ ChanInfo_t *c;
+
+ s->channelCount = snd_Channels;
+ s->musicVolume = snd_MusicVolume;
+ s->soundVolume = snd_MaxVolume;
+ for (i = 0; i < snd_Channels; i++)
+ {
+ c = &s->chan[i];
+ c->id = channel[i].sound_id;
+ c->priority = channel[i].priority;
+ c->name = S_sfx[c->id].name;
+ c->mo = channel[i].mo;
+ c->distance = P_AproxDistance(c->mo->x - viewx, c->mo->y - viewy)
+ >> FRACBITS;
+ }
+}
+
+void S_SetMaxVolume(boolean fullprocess)
+{
+ int i;
+
+ if (!fullprocess)
+ {
+ soundCurve[0] =
+ (*((byte *) W_CacheLumpName("SNDCURVE", PU_CACHE)) *
+ (snd_MaxVolume * 8)) >> 7;
+ }
+ else
+ {
+ for (i = 0; i < MAX_SND_DIST; i++)
+ {
+ soundCurve[i] =
+ (*((byte *) W_CacheLumpName("SNDCURVE", PU_CACHE) + i) *
+ (snd_MaxVolume * 8)) >> 7;
+ }
+ }
+}
+
+static boolean musicPaused;
+void S_SetMusicVolume(void)
+{
+ I_SetMusicVolume(snd_MusicVolume);
+ if (snd_MusicVolume == 0)
+ {
+ I_PauseSong();
+ musicPaused = true;
+ }
+ else if (musicPaused)
+ {
+ musicPaused = false;
+ I_ResumeSong();
+ }
+}
+
+void S_ShutDown(void)
+{
+ extern int tsm_ID;
+ if (tsm_ID != -1)
+ {
+ I_StopSong();
+ I_UnRegisterSong(rs);
+ I_ShutdownSound();
+ }
+}
+
--- /dev/null
+++ b/src/heretic/s_sound.h
@@ -1,0 +1,45 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 1993-2008 Raven Software
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+//-----------------------------------------------------------------------------
+
+// soundst.h
+
+#ifndef __SOUNDSTH__
+#define __SOUNDSTH__
+
+extern int snd_MaxVolume;
+extern int snd_MusicVolume;
+
+void S_Start(void);
+void S_StartSound(mobj_t * origin, int sound_id);
+void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume);
+void S_StopSound(mobj_t * origin);
+void S_PauseSound(void);
+void S_ResumeSound(void);
+void S_UpdateSounds(mobj_t * listener);
+void S_StartSong(int song, boolean loop);
+void S_Init(void);
+void S_GetChannelInfo(SoundInfo_t * s);
+void S_SetMaxVolume(boolean fullprocess);
+void S_SetMusicVolume(void);
+
+#endif
--- a/src/heretic/sb_bar.c
+++ b/src/heretic/sb_bar.c
@@ -25,7 +25,7 @@
#include "doomdef.h"
#include "p_local.h"
-#include "soundst.h"
+#include "s_sound.h"
// Macros
--- a/src/heretic/sounds.c
+++ b/src/heretic/sounds.c
@@ -25,216 +25,232 @@
// sounds.c
#include "doomdef.h"
+#include "i_sound.h"
#include "sounds.h"
// Music info
+#define MUSIC(name) \
+ { name, 0, NULL, NULL }
+
musicinfo_t S_music[] = {
- {"MUS_E1M1", 0}, // 1-1
- {"MUS_E1M2", 0},
- {"MUS_E1M3", 0},
- {"MUS_E1M4", 0},
- {"MUS_E1M5", 0},
- {"MUS_E1M6", 0},
- {"MUS_E1M7", 0},
- {"MUS_E1M8", 0},
- {"MUS_E1M9", 0},
+ MUSIC("MUS_E1M1"), // 1-1
+ MUSIC("MUS_E1M2"),
+ MUSIC("MUS_E1M3"),
+ MUSIC("MUS_E1M4"),
+ MUSIC("MUS_E1M5"),
+ MUSIC("MUS_E1M6"),
+ MUSIC("MUS_E1M7"),
+ MUSIC("MUS_E1M8"),
+ MUSIC("MUS_E1M9"),
- {"MUS_E2M1", 0}, // 2-1
- {"MUS_E2M2", 0},
- {"MUS_E2M3", 0},
- {"MUS_E2M4", 0},
- {"MUS_E1M4", 0},
- {"MUS_E2M6", 0},
- {"MUS_E2M7", 0},
- {"MUS_E2M8", 0},
- {"MUS_E2M9", 0},
+ MUSIC("MUS_E2M1"), // 2-1
+ MUSIC("MUS_E2M2"),
+ MUSIC("MUS_E2M3"),
+ MUSIC("MUS_E2M4"),
+ MUSIC("MUS_E1M4"),
+ MUSIC("MUS_E2M6"),
+ MUSIC("MUS_E2M7"),
+ MUSIC("MUS_E2M8"),
+ MUSIC("MUS_E2M9"),
- {"MUS_E1M1", 0}, // 3-1
- {"MUS_E3M2", 0},
- {"MUS_E3M3", 0},
- {"MUS_E1M6", 0},
- {"MUS_E1M3", 0},
- {"MUS_E1M2", 0},
- {"MUS_E1M5", 0},
- {"MUS_E1M9", 0},
- {"MUS_E2M6", 0},
+ MUSIC("MUS_E1M1"), // 3-1
+ MUSIC("MUS_E3M2"),
+ MUSIC("MUS_E3M3"),
+ MUSIC("MUS_E1M6"),
+ MUSIC("MUS_E1M3"),
+ MUSIC("MUS_E1M2"),
+ MUSIC("MUS_E1M5"),
+ MUSIC("MUS_E1M9"),
+ MUSIC("MUS_E2M6"),
- {"MUS_E1M6", 0}, // 4-1
- {"MUS_E1M2", 0},
- {"MUS_E1M3", 0},
- {"MUS_E1M4", 0},
- {"MUS_E1M5", 0},
- {"MUS_E1M1", 0},
- {"MUS_E1M7", 0},
- {"MUS_E1M8", 0},
- {"MUS_E1M9", 0},
+ MUSIC("MUS_E1M6"), // 4-1
+ MUSIC("MUS_E1M2"),
+ MUSIC("MUS_E1M3"),
+ MUSIC("MUS_E1M4"),
+ MUSIC("MUS_E1M5"),
+ MUSIC("MUS_E1M1"),
+ MUSIC("MUS_E1M7"),
+ MUSIC("MUS_E1M8"),
+ MUSIC("MUS_E1M9"),
- {"MUS_E2M1", 0}, // 5-1
- {"MUS_E2M2", 0},
- {"MUS_E2M3", 0},
- {"MUS_E2M4", 0},
- {"MUS_E1M4", 0},
- {"MUS_E2M6", 0},
- {"MUS_E2M7", 0},
- {"MUS_E2M8", 0},
- {"MUS_E2M9", 0},
+ MUSIC("MUS_E2M1"), // 5-1
+ MUSIC("MUS_E2M2"),
+ MUSIC("MUS_E2M3"),
+ MUSIC("MUS_E2M4"),
+ MUSIC("MUS_E1M4"),
+ MUSIC("MUS_E2M6"),
+ MUSIC("MUS_E2M7"),
+ MUSIC("MUS_E2M8"),
+ MUSIC("MUS_E2M9"),
- {"MUS_E3M2", 0}, // 6-1
- {"MUS_E3M3", 0}, // 6-2
- {"MUS_E1M6", 0}, // 6-3
+ MUSIC("MUS_E3M2"), // 6-1
+ MUSIC("MUS_E3M3"), // 6-2
+ MUSIC("MUS_E1M6"), // 6-3
- {"MUS_TITL", 0},
- {"MUS_INTR", 0},
- {"MUS_CPTD", 0}
+ MUSIC("MUS_TITL"),
+ MUSIC("MUS_INTR"),
+ MUSIC("MUS_CPTD")
};
// Sound info
+ /* Macro for original heretic sfxinfo_t
+#define SOUND(name, priority, numchannels) \
+ { name, NULL, priority, -1, NULL, 0, numchannels }
+#define SOUND_LINK(name, link_id, priority, numchannels) \
+ { name, &S_sfx[link_id], priority, -1, NULL, 0, numchannels }
+ */
+
+#define SOUND(name, priority, numchannels) \
+ { name, priority, NULL, -1, -1, -1, 0, numchannels, NULL }
+#define SOUND_LINK(name, link_id, priority, numchannels) \
+ { name, priority, &S_sfx[link_id], 0, 0, -1, 0, numchannels, NULL }
+
sfxinfo_t S_sfx[] = {
- {{0, 0, 0, 0, 0, 0, 0, 0}, NULL, 0, -1, NULL, 0, 0},
- {"gldhit", NULL, 32, -1, NULL, 0, 2},
- {"gntful", NULL, 32, -1, NULL, 0, -1},
- {"gnthit", NULL, 32, -1, NULL, 0, -1},
- {"gntpow", NULL, 32, -1, NULL, 0, -1},
- {"gntact", NULL, 32, -1, NULL, 0, -1},
- {"gntuse", NULL, 32, -1, NULL, 0, -1},
- {"phosht", NULL, 32, -1, NULL, 0, 2},
- {"phohit", NULL, 32, -1, NULL, 0, -1},
- {"-phopow", &S_sfx[sfx_hedat1], 32, -1, NULL, 0, 1},
- {"lobsht", NULL, 20, -1, NULL, 0, 2},
- {"lobhit", NULL, 20, -1, NULL, 0, 2},
- {"lobpow", NULL, 20, -1, NULL, 0, 2},
- {"hrnsht", NULL, 32, -1, NULL, 0, 2},
- {"hrnhit", NULL, 32, -1, NULL, 0, 2},
- {"hrnpow", NULL, 32, -1, NULL, 0, 2},
- {"ramphit", NULL, 32, -1, NULL, 0, 2},
- {"ramrain", NULL, 10, -1, NULL, 0, 2},
- {"bowsht", NULL, 32, -1, NULL, 0, 2},
- {"stfhit", NULL, 32, -1, NULL, 0, 2},
- {"stfpow", NULL, 32, -1, NULL, 0, 2},
- {"stfcrk", NULL, 32, -1, NULL, 0, 2},
- {"impsit", NULL, 32, -1, NULL, 0, 2},
- {"impat1", NULL, 32, -1, NULL, 0, 2},
- {"impat2", NULL, 32, -1, NULL, 0, 2},
- {"impdth", NULL, 80, -1, NULL, 0, 2},
- {"-impact", &S_sfx[sfx_impsit], 20, -1, NULL, 0, 2},
- {"imppai", NULL, 32, -1, NULL, 0, 2},
- {"mumsit", NULL, 32, -1, NULL, 0, 2},
- {"mumat1", NULL, 32, -1, NULL, 0, 2},
- {"mumat2", NULL, 32, -1, NULL, 0, 2},
- {"mumdth", NULL, 80, -1, NULL, 0, 2},
- {"-mumact", &S_sfx[sfx_mumsit], 20, -1, NULL, 0, 2},
- {"mumpai", NULL, 32, -1, NULL, 0, 2},
- {"mumhed", NULL, 32, -1, NULL, 0, 2},
- {"bstsit", NULL, 32, -1, NULL, 0, 2},
- {"bstatk", NULL, 32, -1, NULL, 0, 2},
- {"bstdth", NULL, 80, -1, NULL, 0, 2},
- {"bstact", NULL, 20, -1, NULL, 0, 2},
- {"bstpai", NULL, 32, -1, NULL, 0, 2},
- {"clksit", NULL, 32, -1, NULL, 0, 2},
- {"clkatk", NULL, 32, -1, NULL, 0, 2},
- {"clkdth", NULL, 80, -1, NULL, 0, 2},
- {"clkact", NULL, 20, -1, NULL, 0, 2},
- {"clkpai", NULL, 32, -1, NULL, 0, 2},
- {"snksit", NULL, 32, -1, NULL, 0, 2},
- {"snkatk", NULL, 32, -1, NULL, 0, 2},
- {"snkdth", NULL, 80, -1, NULL, 0, 2},
- {"snkact", NULL, 20, -1, NULL, 0, 2},
- {"snkpai", NULL, 32, -1, NULL, 0, 2},
- {"kgtsit", NULL, 32, -1, NULL, 0, 2},
- {"kgtatk", NULL, 32, -1, NULL, 0, 2},
- {"kgtat2", NULL, 32, -1, NULL, 0, 2},
- {"kgtdth", NULL, 80, -1, NULL, 0, 2},
- {"-kgtact", &S_sfx[sfx_kgtsit], 20, -1, NULL, 0, 2},
- {"kgtpai", NULL, 32, -1, NULL, 0, 2},
- {"wizsit", NULL, 32, -1, NULL, 0, 2},
- {"wizatk", NULL, 32, -1, NULL, 0, 2},
- {"wizdth", NULL, 80, -1, NULL, 0, 2},
- {"wizact", NULL, 20, -1, NULL, 0, 2},
- {"wizpai", NULL, 32, -1, NULL, 0, 2},
- {"minsit", NULL, 32, -1, NULL, 0, 2},
- {"minat1", NULL, 32, -1, NULL, 0, 2},
- {"minat2", NULL, 32, -1, NULL, 0, 2},
- {"minat3", NULL, 32, -1, NULL, 0, 2},
- {"mindth", NULL, 80, -1, NULL, 0, 2},
- {"minact", NULL, 20, -1, NULL, 0, 2},
- {"minpai", NULL, 32, -1, NULL, 0, 2},
- {"hedsit", NULL, 32, -1, NULL, 0, 2},
- {"hedat1", NULL, 32, -1, NULL, 0, 2},
- {"hedat2", NULL, 32, -1, NULL, 0, 2},
- {"hedat3", NULL, 32, -1, NULL, 0, 2},
- {"heddth", NULL, 80, -1, NULL, 0, 2},
- {"hedact", NULL, 20, -1, NULL, 0, 2},
- {"hedpai", NULL, 32, -1, NULL, 0, 2},
- {"sorzap", NULL, 32, -1, NULL, 0, 2},
- {"sorrise", NULL, 32, -1, NULL, 0, 2},
- {"sorsit", NULL, 200, -1, NULL, 0, 2},
- {"soratk", NULL, 32, -1, NULL, 0, 2},
- {"soract", NULL, 200, -1, NULL, 0, 2},
- {"sorpai", NULL, 200, -1, NULL, 0, 2},
- {"sordsph", NULL, 200, -1, NULL, 0, 2},
- {"sordexp", NULL, 200, -1, NULL, 0, 2},
- {"sordbon", NULL, 200, -1, NULL, 0, 2},
- {"-sbtsit", &S_sfx[sfx_bstsit], 32, -1, NULL, 0, 2},
- {"-sbtatk", &S_sfx[sfx_bstatk], 32, -1, NULL, 0, 2},
- {"sbtdth", NULL, 80, -1, NULL, 0, 2},
- {"sbtact", NULL, 20, -1, NULL, 0, 2},
- {"sbtpai", NULL, 32, -1, NULL, 0, 2},
- {"plroof", NULL, 32, -1, NULL, 0, 2},
- {"plrpai", NULL, 32, -1, NULL, 0, 2},
- {"plrdth", NULL, 80, -1, NULL, 0, 2},
- {"gibdth", NULL, 100, -1, NULL, 0, 2},
- {"plrwdth", NULL, 80, -1, NULL, 0, 2},
- {"plrcdth", NULL, 100, -1, NULL, 0, 2},
- {"itemup", NULL, 32, -1, NULL, 0, 2},
- {"wpnup", NULL, 32, -1, NULL, 0, 2},
- {"telept", NULL, 50, -1, NULL, 0, 2},
- {"doropn", NULL, 40, -1, NULL, 0, 2},
- {"dorcls", NULL, 40, -1, NULL, 0, 2},
- {"dormov", NULL, 40, -1, NULL, 0, 2},
- {"artiup", NULL, 32, -1, NULL, 0, 2},
- {"switch", NULL, 40, -1, NULL, 0, 2},
- {"pstart", NULL, 40, -1, NULL, 0, 2},
- {"pstop", NULL, 40, -1, NULL, 0, 2},
- {"stnmov", NULL, 40, -1, NULL, 0, 2},
- {"chicpai", NULL, 32, -1, NULL, 0, 2},
- {"chicatk", NULL, 32, -1, NULL, 0, 2},
- {"chicdth", NULL, 40, -1, NULL, 0, 2},
- {"chicact", NULL, 32, -1, NULL, 0, 2},
- {"chicpk1", NULL, 32, -1, NULL, 0, 2},
- {"chicpk2", NULL, 32, -1, NULL, 0, 2},
- {"chicpk3", NULL, 32, -1, NULL, 0, 2},
- {"keyup", NULL, 50, -1, NULL, 0, 2},
- {"ripslop", NULL, 16, -1, NULL, 0, 2},
- {"newpod", NULL, 16, -1, NULL, 0, -1},
- {"podexp", NULL, 40, -1, NULL, 0, -1},
- {"bounce", NULL, 16, -1, NULL, 0, 2},
- {"-volsht", &S_sfx[sfx_bstatk], 16, -1, NULL, 0, 2},
- {"-volhit", &S_sfx[sfx_lobhit], 16, -1, NULL, 0, 2},
- {"burn", NULL, 10, -1, NULL, 0, 2},
- {"splash", NULL, 10, -1, NULL, 0, 1},
- {"gloop", NULL, 10, -1, NULL, 0, 2},
- {"respawn", NULL, 10, -1, NULL, 0, 1},
- {"blssht", NULL, 32, -1, NULL, 0, 2},
- {"blshit", NULL, 32, -1, NULL, 0, 2},
- {"chat", NULL, 100, -1, NULL, 0, 1},
- {"artiuse", NULL, 32, -1, NULL, 0, 1},
- {"gfrag", NULL, 100, -1, NULL, 0, 1},
- {"waterfl", NULL, 16, -1, NULL, 0, 2},
+ SOUND("", 0, 0),
+ SOUND("gldhit", 32, 2),
+ SOUND("gntful", 32, -1),
+ SOUND("gnthit", 32, -1),
+ SOUND("gntpow", 32, -1),
+ SOUND("gntact", 32, -1),
+ SOUND("gntuse", 32, -1),
+ SOUND("phosht", 32, 2),
+ SOUND("phohit", 32, -1),
+ SOUND_LINK("-phopow", sfx_hedat1, 32, 1),
+ SOUND("lobsht", 20, 2),
+ SOUND("lobhit", 20, 2),
+ SOUND("lobpow", 20, 2),
+ SOUND("hrnsht", 32, 2),
+ SOUND("hrnhit", 32, 2),
+ SOUND("hrnpow", 32, 2),
+ SOUND("ramphit", 32, 2),
+ SOUND("ramrain", 10, 2),
+ SOUND("bowsht", 32, 2),
+ SOUND("stfhit", 32, 2),
+ SOUND("stfpow", 32, 2),
+ SOUND("stfcrk", 32, 2),
+ SOUND("impsit", 32, 2),
+ SOUND("impat1", 32, 2),
+ SOUND("impat2", 32, 2),
+ SOUND("impdth", 80, 2),
+ SOUND_LINK("-impact", sfx_impsit, 20, 2),
+ SOUND("imppai", 32, 2),
+ SOUND("mumsit", 32, 2),
+ SOUND("mumat1", 32, 2),
+ SOUND("mumat2", 32, 2),
+ SOUND("mumdth", 80, 2),
+ SOUND_LINK("-mumact", sfx_mumsit, 20, 2),
+ SOUND("mumpai", 32, 2),
+ SOUND("mumhed", 32, 2),
+ SOUND("bstsit", 32, 2),
+ SOUND("bstatk", 32, 2),
+ SOUND("bstdth", 80, 2),
+ SOUND("bstact", 20, 2),
+ SOUND("bstpai", 32, 2),
+ SOUND("clksit", 32, 2),
+ SOUND("clkatk", 32, 2),
+ SOUND("clkdth", 80, 2),
+ SOUND("clkact", 20, 2),
+ SOUND("clkpai", 32, 2),
+ SOUND("snksit", 32, 2),
+ SOUND("snkatk", 32, 2),
+ SOUND("snkdth", 80, 2),
+ SOUND("snkact", 20, 2),
+ SOUND("snkpai", 32, 2),
+ SOUND("kgtsit", 32, 2),
+ SOUND("kgtatk", 32, 2),
+ SOUND("kgtat2", 32, 2),
+ SOUND("kgtdth", 80, 2),
+ SOUND_LINK("-kgtact", sfx_kgtsit, 20, 2),
+ SOUND("kgtpai", 32, 2),
+ SOUND("wizsit", 32, 2),
+ SOUND("wizatk", 32, 2),
+ SOUND("wizdth", 80, 2),
+ SOUND("wizact", 20, 2),
+ SOUND("wizpai", 32, 2),
+ SOUND("minsit", 32, 2),
+ SOUND("minat1", 32, 2),
+ SOUND("minat2", 32, 2),
+ SOUND("minat3", 32, 2),
+ SOUND("mindth", 80, 2),
+ SOUND("minact", 20, 2),
+ SOUND("minpai", 32, 2),
+ SOUND("hedsit", 32, 2),
+ SOUND("hedat1", 32, 2),
+ SOUND("hedat2", 32, 2),
+ SOUND("hedat3", 32, 2),
+ SOUND("heddth", 80, 2),
+ SOUND("hedact", 20, 2),
+ SOUND("hedpai", 32, 2),
+ SOUND("sorzap", 32, 2),
+ SOUND("sorrise", 32, 2),
+ SOUND("sorsit", 200, 2),
+ SOUND("soratk", 32, 2),
+ SOUND("soract", 200, 2),
+ SOUND("sorpai", 200, 2),
+ SOUND("sordsph", 200, 2),
+ SOUND("sordexp", 200, 2),
+ SOUND("sordbon", 200, 2),
+ SOUND_LINK("-sbtsit", sfx_bstsit, 32, 2),
+ SOUND_LINK("-sbtatk", sfx_bstatk, 32, 2),
+ SOUND("sbtdth", 80, 2),
+ SOUND("sbtact", 20, 2),
+ SOUND("sbtpai", 32, 2),
+ SOUND("plroof", 32, 2),
+ SOUND("plrpai", 32, 2),
+ SOUND("plrdth", 80, 2),
+ SOUND("gibdth", 100, 2),
+ SOUND("plrwdth", 80, 2),
+ SOUND("plrcdth", 100, 2),
+ SOUND("itemup", 32, 2),
+ SOUND("wpnup", 32, 2),
+ SOUND("telept", 50, 2),
+ SOUND("doropn", 40, 2),
+ SOUND("dorcls", 40, 2),
+ SOUND("dormov", 40, 2),
+ SOUND("artiup", 32, 2),
+ SOUND("switch", 40, 2),
+ SOUND("pstart", 40, 2),
+ SOUND("pstop", 40, 2),
+ SOUND("stnmov", 40, 2),
+ SOUND("chicpai", 32, 2),
+ SOUND("chicatk", 32, 2),
+ SOUND("chicdth", 40, 2),
+ SOUND("chicact", 32, 2),
+ SOUND("chicpk1", 32, 2),
+ SOUND("chicpk2", 32, 2),
+ SOUND("chicpk3", 32, 2),
+ SOUND("keyup", 50, 2),
+ SOUND("ripslop", 16, 2),
+ SOUND("newpod", 16, -1),
+ SOUND("podexp", 40, -1),
+ SOUND("bounce", 16, 2),
+ SOUND_LINK("-volsht", sfx_bstatk, 16, 2),
+ SOUND_LINK("-volhit", sfx_lobhit, 16, 2),
+ SOUND("burn", 10, 2),
+ SOUND("splash", 10, 1),
+ SOUND("gloop", 10, 2),
+ SOUND("respawn", 10, 1),
+ SOUND("blssht", 32, 2),
+ SOUND("blshit", 32, 2),
+ SOUND("chat", 100, 1),
+ SOUND("artiuse", 32, 1),
+ SOUND("gfrag", 100, 1),
+ SOUND("waterfl", 16, 2),
// Monophonic sounds
- {"wind", NULL, 16, -1, NULL, 0, 1},
- {"amb1", NULL, 1, -1, NULL, 0, 1},
- {"amb2", NULL, 1, -1, NULL, 0, 1},
- {"amb3", NULL, 1, -1, NULL, 0, 1},
- {"amb4", NULL, 1, -1, NULL, 0, 1},
- {"amb5", NULL, 1, -1, NULL, 0, 1},
- {"amb6", NULL, 1, -1, NULL, 0, 1},
- {"amb7", NULL, 1, -1, NULL, 0, 1},
- {"amb8", NULL, 1, -1, NULL, 0, 1},
- {"amb9", NULL, 1, -1, NULL, 0, 1},
- {"amb10", NULL, 1, -1, NULL, 0, 1},
- {"amb11", NULL, 1, -1, NULL, 0, 0}
+ SOUND("wind", 16, 1),
+ SOUND("amb1", 1, 1),
+ SOUND("amb2", 1, 1),
+ SOUND("amb3", 1, 1),
+ SOUND("amb4", 1, 1),
+ SOUND("amb5", 1, 1),
+ SOUND("amb6", 1, 1),
+ SOUND("amb7", 1, 1),
+ SOUND("amb8", 1, 1),
+ SOUND("amb9", 1, 1),
+ SOUND("amb10", 1, 1),
+ SOUND("amb11", 1, 0)
};
--- a/src/heretic/sounds.h
+++ b/src/heretic/sounds.h
@@ -93,10 +93,10 @@
NUMMUSIC
} musicenum_t;
+#if 0
typedef struct
{
char name[8];
- int p1;
} musicinfo_t;
typedef struct sfxinfo_s
@@ -109,6 +109,8 @@
int lumpnum;
int numchannels; // total number of channels a sound type may occupy
} sfxinfo_t;
+
+#endif
typedef struct
{
--- a/src/heretic/soundst.h
+++ /dev/null
@@ -1,45 +1,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 1993-2008 Raven Software
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-// 02111-1307, USA.
-//
-//-----------------------------------------------------------------------------
-
-// soundst.h
-
-#ifndef __SOUNDSTH__
-#define __SOUNDSTH__
-
-extern int snd_MaxVolume;
-extern int snd_MusicVolume;
-
-void S_Start(void);
-void S_StartSound(mobj_t * origin, int sound_id);
-void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume);
-void S_StopSound(mobj_t * origin);
-void S_PauseSound(void);
-void S_ResumeSound(void);
-void S_UpdateSounds(mobj_t * listener);
-void S_StartSong(int song, boolean loop);
-void S_Init(void);
-void S_GetChannelInfo(SoundInfo_t * s);
-void S_SetMaxVolume(boolean fullprocess);
-void S_SetMusicVolume(void);
-
-#endif
--- a/src/i_sound.h
+++ b/src/i_sound.h
@@ -53,9 +53,6 @@
// volume if a link
int volume;
- // sound data
- void *data;
-
// this is checked every second to see if sound
// can be thrown out (if 0, then decrement, if -1,
// then throw out, if > 0, then it is in use)
@@ -63,6 +60,10 @@
// lump number of sfx
int lumpnum;
+
+ // Maximum number of channels that the sound can be played on
+ // (Heretic)
+ int numchannels;
// data used by the low level code
void *driver_data;