diff options
author | Simon Howard | 2008-10-02 18:46:11 +0000 |
---|---|---|
committer | Simon Howard | 2008-10-02 18:46:11 +0000 |
commit | 51efdd70e49a1378cc828113a3ee3997f85cdc14 (patch) | |
tree | cb360022a6f6564d9243e3e72de76a71740f3701 /src | |
parent | 525e8d80dfd67d4562b7a4d40e685a26b860eada (diff) | |
download | chocolate-doom-51efdd70e49a1378cc828113a3ee3997f85cdc14.tar.gz chocolate-doom-51efdd70e49a1378cc828113a3ee3997f85cdc14.tar.bz2 chocolate-doom-51efdd70e49a1378cc828113a3ee3997f85cdc14.zip |
Split out high-level sound code from hexen/i_ibm.c and refactor to use
common interface.
Subversion-branch: /branches/raven-branch
Subversion-revision: 1324
Diffstat (limited to 'src')
39 files changed, 1203 insertions, 1584 deletions
diff --git a/src/doom/deh_sound.c b/src/doom/deh_sound.c index 90b7725b..251cdccb 100644 --- a/src/doom/deh_sound.c +++ b/src/doom/deh_sound.c @@ -98,7 +98,6 @@ static void DEH_SoundParseLine(deh_context_t *context, char *line, void *tag) // Set the field value DEH_SetMapping(context, &sound_mapping, sfx, variable_name, ivalue); - } deh_section_t deh_section_sound = diff --git a/src/doom/sounds.c b/src/doom/sounds.c index 55bda724..adfb2189 100644 --- a/src/doom/sounds.c +++ b/src/doom/sounds.c @@ -117,9 +117,9 @@ musicinfo_t S_music[] = // #define SOUND(name, priority) \ - { name, priority, NULL, -1, -1, 0, 0, -1, NULL } + { NULL, 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 } + { NULL, name, priority, &S_sfx[link_id], pitch, volume, 0, 0, -1, NULL } sfxinfo_t S_sfx[] = { diff --git a/src/heretic/sounds.c b/src/heretic/sounds.c index 38c39210..ba4cee0b 100644 --- a/src/heretic/sounds.c +++ b/src/heretic/sounds.c @@ -103,9 +103,9 @@ musicinfo_t S_music[] = { */ #define SOUND(name, priority, numchannels) \ - { name, priority, NULL, -1, -1, -1, 0, numchannels, NULL } + { NULL, 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 } + { NULL, name, priority, &S_sfx[link_id], 0, 0, -1, 0, numchannels, NULL } sfxinfo_t S_sfx[] = { SOUND("", 0, 0), diff --git a/src/hexen/Makefile.am b/src/hexen/Makefile.am index b9c43884..c47e9746 100644 --- a/src/hexen/Makefile.am +++ b/src/hexen/Makefile.am @@ -49,11 +49,11 @@ r_main.c \ r_plane.c \ r_segs.c \ r_things.c \ +s_sound.c s_sound.h \ sb_bar.c \ sc_man.c \ sn_sonix.c \ sounds.c sounds.h \ - soundst.h \ st_start.c st_start.h \ sv_save.c \ textdefs.h \ @@ -61,6 +61,6 @@ sv_save.c \ EXTRA_DIST= \ i_ibm.c \ -i_sound.c i_sound.h +i_sound.c libhexen_a_SOURCES=$(SOURCE_FILES) diff --git a/src/hexen/a_action.c b/src/hexen/a_action.c index cb3ba817..fcecb5fd 100644 --- a/src/hexen/a_action.c +++ b/src/hexen/a_action.c @@ -26,7 +26,7 @@ #include "h2def.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/ct_chat.c b/src/hexen/ct_chat.c index 09df13cf..983f3715 100644 --- a/src/hexen/ct_chat.c +++ b/src/hexen/ct_chat.c @@ -25,9 +25,9 @@ #include <string.h> #include <ctype.h> #include "h2def.h" +#include "s_sound.h" #include "doomkeys.h" #include "p_local.h" -#include "soundst.h" #include "v_video.h" #define NUMKEYS 256 diff --git a/src/hexen/d_net.c b/src/hexen/d_net.c index ff6e7d5e..226e8b07 100644 --- a/src/hexen/d_net.c +++ b/src/hexen/d_net.c @@ -23,6 +23,7 @@ #include "h2def.h" +#include "s_sound.h" #include "doomkeys.h" #include "i_video.h" #include "i_system.h" diff --git a/src/hexen/f_finale.c b/src/hexen/f_finale.c index 3cb1b53b..39b390eb 100644 --- a/src/hexen/f_finale.c +++ b/src/hexen/f_finale.c @@ -27,8 +27,8 @@ #include "h2def.h" #include "i_system.h" #include "i_video.h" -#include "soundst.h" #include "p_local.h" +#include "s_sound.h" #include <ctype.h> #include "v_video.h" diff --git a/src/hexen/g_game.c b/src/hexen/g_game.c index 62eb249b..6d7ba416 100644 --- a/src/hexen/g_game.c +++ b/src/hexen/g_game.c @@ -24,13 +24,13 @@ #include <string.h> #include "h2def.h" +#include "s_sound.h" #include "doomkeys.h" #include "i_video.h" #include "i_system.h" #include "i_timer.h" #include "m_misc.h" #include "p_local.h" -#include "soundst.h" #include "v_video.h" #define AM_STARTKEY 9 diff --git a/src/hexen/h2_main.c b/src/hexen/h2_main.c index 394a52bc..fa1545e4 100644 --- a/src/hexen/h2_main.c +++ b/src/hexen/h2_main.c @@ -33,10 +33,10 @@ #include <stdlib.h> #include <time.h> #include "h2def.h" +#include "s_sound.h" #include "i_system.h" #include "m_argv.h" #include "p_local.h" -#include "soundst.h" #include "v_video.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/i_ibm.c b/src/hexen/i_ibm.c index a4f2ce9b..50af0e98 100644 --- a/src/hexen/i_ibm.c +++ b/src/hexen/i_ibm.c @@ -34,17 +34,12 @@ #include "p_local.h" // for P_AproxDistance #include "sounds.h" #include "i_sound.h" -#include "soundst.h" #include "st_start.h" #include "dmx.h" #include "dpmiapi.h" // Macros -#define DEFAULT_ARCHIVEPATH "o:\\sound\\archive\\" -#define PRIORITY_MAX_ADJUST 10 -#define DIST_ADJUST (MAX_SND_DIST/PRIORITY_MAX_ADJUST) - #define DPMI_INT 0x31 #define SEQ_ADDR 0x3C4 @@ -103,969 +98,6 @@ int i_Vector; externdata_t *i_ExternData; boolean useexterndriver; -boolean i_CDMusic; -int i_CDTrack; -int i_CDCurrentTrack; -int i_CDMusicLength; -int oldTic; - -/* -=============================================================================== - - 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[]; - -static channel_t Channel[MAX_CHANNELS]; -static int RegisteredSong; //the current registered song. -static int NextCleanup; -static boolean MusicPaused; -static int Mus_Song = -1; -static int Mus_LumpNum; -static void *Mus_SndPtr; -static byte *SoundCurve; - -static boolean UseSndScript; -static char ArchivePath[128]; - -extern int snd_MusicDevice; -extern int snd_SfxDevice; -extern int snd_MaxVolume; -extern int snd_MusicVolume; -extern int snd_Channels; - -extern int startepisode; -extern int startmap; - -// int AmbChan; - -//========================================================================== -// -// S_Start -// -//========================================================================== - -void S_Start(void) -{ - S_StopAllSound(); - S_StartSong(gamemap, true); -} - -//========================================================================== -// -// S_StartSong -// -//========================================================================== - -void S_StartSong(int song, boolean loop) -{ - char *songLump; - int track; - - if (i_CDMusic) - { // Play a CD track, instead - if (i_CDTrack) - { // Default to the player-chosen track - track = i_CDTrack; - } - else - { - track = P_GetMapCDTrack(gamemap); - } - if (track == i_CDCurrentTrack && i_CDMusicLength > 0) - { - return; - } - if (!I_CDMusPlay(track)) - { - if (loop) - { - i_CDMusicLength = 35 * I_CDMusTrackLength(track); - oldTic = gametic; - } - else - { - i_CDMusicLength = -1; - } - i_CDCurrentTrack = track; - } - } - else - { - if (song == Mus_Song) - { // don't replay an old song - return; - } - if (RegisteredSong) - { - I_StopSong(RegisteredSong); - I_UnRegisterSong(RegisteredSong); - if (UseSndScript) - { - Z_Free(Mus_SndPtr); - } - else - { - Z_ChangeTag(lumpcache[Mus_LumpNum], PU_CACHE); - } -#ifdef __WATCOMC__ - _dpmi_unlockregion(Mus_SndPtr, lumpinfo[Mus_LumpNum].size); -#endif - RegisteredSong = 0; - } - songLump = P_GetMapSongLump(song); - if (!songLump) - { - return; - } - if (UseSndScript) - { - char name[128]; - sprintf(name, "%s%s.lmp", ArchivePath, songLump); - M_ReadFile(name, (byte **) & Mus_SndPtr); - } - else - { - Mus_LumpNum = W_GetNumForName(songLump); - Mus_SndPtr = W_CacheLumpNum(Mus_LumpNum, PU_MUSIC); - } -#ifdef __WATCOMC__ - _dpmi_lockregion(Mus_SndPtr, lumpinfo[Mus_LumpNum].size); -#endif - RegisteredSong = I_RegisterSong(Mus_SndPtr); - I_PlaySong(RegisteredSong, loop); // 'true' denotes endless looping. - Mus_Song = song; - } -} - -//========================================================================== -// -// S_StartSongName -// -//========================================================================== - -void S_StartSongName(char *songLump, boolean loop) -{ - int cdTrack; - - if (!songLump) - { - return; - } - if (i_CDMusic) - { - cdTrack = 0; - - if (!strcmp(songLump, "hexen")) - { - cdTrack = P_GetCDTitleTrack(); - } - else if (!strcmp(songLump, "hub")) - { - cdTrack = P_GetCDIntermissionTrack(); - } - else if (!strcmp(songLump, "hall")) - { - cdTrack = P_GetCDEnd1Track(); - } - else if (!strcmp(songLump, "orb")) - { - cdTrack = P_GetCDEnd2Track(); - } - else if (!strcmp(songLump, "chess") && !i_CDTrack) - { - cdTrack = P_GetCDEnd3Track(); - } -/* Uncomment this, if Kevin writes a specific song for startup - else if(!strcmp(songLump, "start")) - { - cdTrack = P_GetCDStartTrack(); - } -*/ - if (!cdTrack || (cdTrack == i_CDCurrentTrack && i_CDMusicLength > 0)) - { - return; - } - if (!I_CDMusPlay(cdTrack)) - { - if (loop) - { - i_CDMusicLength = 35 * I_CDMusTrackLength(cdTrack); - oldTic = gametic; - } - else - { - i_CDMusicLength = -1; - } - i_CDCurrentTrack = cdTrack; - i_CDTrack = false; - } - } - else - { - if (RegisteredSong) - { - I_StopSong(RegisteredSong); - I_UnRegisterSong(RegisteredSong); - if (UseSndScript) - { - Z_Free(Mus_SndPtr); - } - else - { - Z_ChangeTag(lumpcache[Mus_LumpNum], PU_CACHE); - } -#ifdef __WATCOMC__ - _dpmi_unlockregion(Mus_SndPtr, lumpinfo[Mus_LumpNum].size); -#endif - RegisteredSong = 0; - } - if (UseSndScript) - { - char name[128]; - sprintf(name, "%s%s.lmp", ArchivePath, songLump); - M_ReadFile(name, (byte **) & Mus_SndPtr); - } - else - { - Mus_LumpNum = W_GetNumForName(songLump); - Mus_SndPtr = W_CacheLumpNum(Mus_LumpNum, PU_MUSIC); - } -#ifdef __WATCOMC__ - _dpmi_lockregion(Mus_SndPtr, lumpinfo[Mus_LumpNum].size); -#endif - RegisteredSong = I_RegisterSong(Mus_SndPtr); - I_PlaySong(RegisteredSong, loop); // 'true' denotes endless looping. - Mus_Song = -1; - } -} - -//========================================================================== -// -// S_GetSoundID -// -//========================================================================== - -int S_GetSoundID(char *name) -{ - int i; - - for (i = 0; i < NUMSFX; i++) - { - if (!strcmp(S_sfx[i].tagName, name)) - { - return i; - } - } - return 0; -} - -//========================================================================== -// -// S_StartSound -// -//========================================================================== - -void S_StartSound(mobj_t * origin, int sound_id) -{ - S_StartSoundAtVolume(origin, sound_id, 127); -} - -//========================================================================== -// -// S_StartSoundAtVolume -// -//========================================================================== - -void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume) -{ - 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[displayplayer].mo; - } - if (volume == 0) - { - return; - } - - // calculate the distance before other stuff so that we can throw out - // sounds that are beyond the hearing range. - absx = abs(origin->x - players[displayplayer].mo->x); - absy = abs(origin->y - players[displayplayer].mo->y); - dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1); - dist >>= FRACBITS; - if (dist >= MAX_SND_DIST) - { - return; // sound is beyond the hearing range... - } - if (dist < 0) - { - dist = 0; - } - priority = S_sfx[sound_id].priority; - priority *= (PRIORITY_MAX_ADJUST - (dist / DIST_ADJUST)); - 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) - { - 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 (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) - { - if (UseSndScript) - { - char name[128]; - sprintf(name, "%s%s.lmp", ArchivePath, S_sfx[sound_id].lumpname); - M_ReadFile(name, (byte **) & S_sfx[sound_id].snd_ptr); - } - else - { - 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 - } - - vol = (SoundCurve[dist] * (snd_MaxVolume * 8) * volume) >> 14; - if (origin == players[displayplayer].mo) - { - sep = 128; -// vol = (volume*(snd_MaxVolume+1)*8)>>7; - } - else - { - angle = R_PointToAngle2(players[displayplayer].mo->x, - players[displayplayer].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; -// vol = SoundCurve[dist]; - } - - if (S_sfx[sound_id].changePitch) - { - Channel[i].pitch = (byte) (127 + (M_Random() & 7) - (M_Random() & 7)); - } - else - { - Channel[i].pitch = 127; - } - 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; - Channel[i].volume = volume; - if (S_sfx[sound_id].usefulness < 0) - { - S_sfx[sound_id].usefulness = 1; - } - else - { - S_sfx[sound_id].usefulness++; - } -} - -//========================================================================== -// -// S_StopSoundID -// -//========================================================================== - -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[lp].sound_id].usefulness > 0) - { - S_sfx[Channel[lp].sound_id].usefulness--; - } - Channel[lp].mo = NULL; - } - return (true); -} - -//========================================================================== -// -// S_StopSound -// -//========================================================================== - -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; - } - } -} - -//========================================================================== -// -// S_StopAllSound -// -//========================================================================== - -void S_StopAllSound(void) -{ - int i; - - //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)); -} - -//========================================================================== -// -// S_SoundLink -// -//========================================================================== - -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; - } -} - -//========================================================================== -// -// S_PauseSound -// -//========================================================================== - -void S_PauseSound(void) -{ - if (i_CDMusic) - { - I_CDMusStop(); - } - else - { - I_PauseSong(RegisteredSong); - } -} - -//========================================================================== -// -// S_ResumeSound -// -//========================================================================== - -void S_ResumeSound(void) -{ - if (i_CDMusic) - { - I_CDMusResume(); - } - else - { - I_ResumeSong(RegisteredSong); - } -} - -//========================================================================== -// -// S_UpdateSounds -// -//========================================================================== - -void S_UpdateSounds(mobj_t * listener) -{ - int i, dist, vol; - int angle; - int sep; - int priority; - int absx; - int absy; - - if (i_CDMusic) - { - I_UpdateCDMusic(); - } - if (snd_MaxVolume == 0) - { - return; - } - - // Update any Sequences - SN_UpdateActiveSequences(); - - if (NextCleanup < gametic) - { - if (UseSndScript) - { - for (i = 0; i < NUMSFX; i++) - { - if (S_sfx[i].usefulness == 0 && S_sfx[i].snd_ptr) - { - S_sfx[i].usefulness = -1; - } - } - } - else - { - 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 * 30; // every 30 seconds - } - 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 (Channel[i].mo == NULL || Channel[i].sound_id == 0 - || Channel[i].mo == listener) - { - continue; - } - else - { - absx = abs(Channel[i].mo->x - listener->x); - absy = abs(Channel[i].mo->y - listener->y); - dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1); - dist >>= FRACBITS; - - if (dist >= MAX_SND_DIST) - { - S_StopSound(Channel[i].mo); - continue; - } - if (dist < 0) - { - dist = 0; - } - //vol = SoundCurve[dist]; - vol = - (SoundCurve[dist] * (snd_MaxVolume * 8) * - Channel[i].volume) >> 14; - if (Channel[i].mo == listener) - { - sep = 128; - } - else - { - angle = R_PointToAngle2(listener->x, listener->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 *= PRIORITY_MAX_ADJUST - (dist / DIST_ADJUST); - Channel[i].priority = priority; - } - } -} - -//========================================================================== -// -// S_Init -// -//========================================================================== - -void S_Init(void) -{ - SoundCurve = W_CacheLumpName("SNDCURVE", PU_STATIC); -// 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); - - // Attempt to setup CD music - if (snd_MusicDevice == snd_CDMUSIC) - { - ST_Message(" Attempting to initialize CD Music: "); - if (!cdrom) - { - i_CDMusic = (I_CDMusInit() != -1); - } - else - { // The user is trying to use the cdrom for both game and music - i_CDMusic = false; - } - if (i_CDMusic) - { - ST_Message("initialized.\n"); - } - else - { - ST_Message("failed.\n"); - } - } -} - -//========================================================================== -// -// S_GetChannelInfo -// -//========================================================================== - -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].lumpname; - c->mo = Channel[i].mo; - c->distance = P_AproxDistance(c->mo->x - viewx, c->mo->y - viewy) - >> FRACBITS; - } -} - -//========================================================================== -// -// S_GetSoundPlayingInfo -// -//========================================================================== - -boolean S_GetSoundPlayingInfo(mobj_t * mobj, int sound_id) -{ - int i; - - for (i = 0; i < snd_Channels; i++) - { - if (Channel[i].sound_id == sound_id && Channel[i].mo == mobj) - { - if (I_SoundIsPlaying(Channel[i].handle)) - { - return true; - } - } - } - return false; -} - -//========================================================================== -// -// S_SetMusicVolume -// -//========================================================================== - -void S_SetMusicVolume(void) -{ - if (i_CDMusic) - { - I_CDMusSetVolume(snd_MusicVolume * 16); // 0-255 - } - else - { - I_SetMusicVolume(snd_MusicVolume); - } - if (snd_MusicVolume == 0) - { - if (!i_CDMusic) - { - I_PauseSong(RegisteredSong); - } - MusicPaused = true; - } - else if (MusicPaused) - { - if (!i_CDMusic) - { - I_ResumeSong(RegisteredSong); - } - MusicPaused = false; - } -} - -//========================================================================== -// -// S_ShutDown -// -//========================================================================== - -void S_ShutDown(void) -{ - extern int tsm_ID; - if (tsm_ID != -1) - { - I_StopSong(RegisteredSong); - I_UnRegisterSong(RegisteredSong); - I_ShutdownSound(); - } - if (i_CDMusic) - { - I_CDMusStop(); - } -} - -//========================================================================== -// -// S_InitScript -// -//========================================================================== - -void S_InitScript(void) -{ - int p; - int i; - - strcpy(ArchivePath, DEFAULT_ARCHIVEPATH); - if (!(p = M_CheckParm("-devsnd"))) - { - UseSndScript = false; - SC_OpenLump("sndinfo"); - } - else - { - UseSndScript = true; - SC_OpenFile(myargv[p + 1]); - } - while (SC_GetString()) - { - if (*sc_String == '$') - { - if (!stricmp(sc_String, "$ARCHIVEPATH")) - { - SC_MustGetString(); - strcpy(ArchivePath, sc_String); - } - else if (!stricmp(sc_String, "$MAP")) - { - SC_MustGetNumber(); - SC_MustGetString(); - if (sc_Number) - { - P_PutMapSongLump(sc_Number, sc_String); - } - } - continue; - } - else - { - for (i = 0; i < NUMSFX; i++) - { - if (!strcmp(S_sfx[i].tagName, sc_String)) - { - SC_MustGetString(); - if (*sc_String != '?') - { - strcpy(S_sfx[i].lumpname, sc_String); - } - else - { - strcpy(S_sfx[i].lumpname, "default"); - } - break; - } - } - if (i == NUMSFX) - { - SC_MustGetString(); - } - } - } - SC_Close(); - - for (i = 0; i < NUMSFX; i++) - { - if (!strcmp(S_sfx[i].lumpname, "")) - { - strcpy(S_sfx[i].lumpname, "default"); - } - } -} - //========================================================================== // // I_UpdateCDMusic diff --git a/src/hexen/i_sound.h b/src/hexen/i_sound.h deleted file mode 100644 index 8878ccf6..00000000 --- a/src/hexen/i_sound.h +++ /dev/null @@ -1,90 +0,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, - snd_CDMUSIC, - NUM_SCARDS -} cardenum_t; - -void I_PauseSong(int handle); -void I_ResumeSong(int handle); -void I_SetMusicVolume(int volume); -void I_SetSfxVolume(int volume); -int I_RegisterSong(void *data); -void I_UnRegisterSong(int handle); -int I_QrySongPlaying(int handle); -void I_StopSong(int handle); -void I_PlaySong(int handle, int looping); -int I_GetSfxLumpNum(sfxinfo_t * sound); -int I_StartSound(int id, void *data, int vol, int sep, int pitch, - int priority); -void I_StopSound(int handle); -int I_SoundIsPlaying(int handle); -void I_UpdateSoundParams(int handle, int vol, int sep, int pitch); -void I_sndArbitrateCards(void); -void I_StartupSound(void); -void I_ShutdownSound(void); -void I_SetChannels(int channels); - -#endif - -#ifndef __ICDMUS__ -#define __ICDMUS__ - -#define CDERR_NOTINSTALLED 10 // MSCDEX not installed -#define CDERR_NOAUDIOSUPPORT 11 // CD-ROM Doesn't support audio -#define CDERR_NOAUDIOTRACKS 12 // Current CD has no audio tracks -#define CDERR_BADDRIVE 20 // Bad drive number -#define CDERR_BADTRACK 21 // Bad track number -#define CDERR_IOCTLBUFFMEM 22 // Not enough low memory for IOCTL -#define CDERR_DEVREQBASE 100 // DevReq errors - -extern int cd_Error; - -int I_CDMusInit(void); -int I_CDMusPlay(int track); -int I_CDMusStop(void); -int I_CDMusResume(void); -int I_CDMusSetVolume(int volume); -int I_CDMusFirstTrack(void); -int I_CDMusLastTrack(void); -int I_CDMusTrackLength(int track); - -#endif diff --git a/src/hexen/in_lude.c b/src/hexen/in_lude.c index c8f87e78..160d8827 100644 --- a/src/hexen/in_lude.c +++ b/src/hexen/in_lude.c @@ -23,6 +23,7 @@ #include "h2def.h" +#include "s_sound.h" #include "i_system.h" #include "i_video.h" #include <ctype.h> diff --git a/src/hexen/m_misc.c b/src/hexen/m_misc.c index 35569b78..e8a6c91b 100644 --- a/src/hexen/m_misc.c +++ b/src/hexen/m_misc.c @@ -38,7 +38,7 @@ #include "i_system.h" #include "m_argv.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/mn_menu.c b/src/hexen/mn_menu.c index 334a9a85..46c083a6 100644 --- a/src/hexen/mn_menu.c +++ b/src/hexen/mn_menu.c @@ -31,7 +31,7 @@ #include "i_video.h" #include "p_local.h" #include "r_local.h" -#include "soundst.h" +#include "s_sound.h" #include "v_video.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_acs.c b/src/hexen/p_acs.c index ae52cb2d..0cd85219 100644 --- a/src/hexen/p_acs.c +++ b/src/hexen/p_acs.c @@ -25,6 +25,7 @@ // HEADER FILES ------------------------------------------------------------ #include "h2def.h" +#include "s_sound.h" #include "i_system.h" #include "p_local.h" diff --git a/src/hexen/p_anim.c b/src/hexen/p_anim.c index 298a0fc8..ca7685bf 100644 --- a/src/hexen/p_anim.c +++ b/src/hexen/p_anim.c @@ -27,6 +27,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_ceilng.c b/src/hexen/p_ceilng.c index 01b0d00f..dd8cc6ac 100644 --- a/src/hexen/p_ceilng.c +++ b/src/hexen/p_ceilng.c @@ -24,7 +24,6 @@ #include "h2def.h" #include "p_local.h" -#include "soundst.h" //================================================================== //================================================================== diff --git a/src/hexen/p_doors.c b/src/hexen/p_doors.c index 445be8b3..ccdb7327 100644 --- a/src/hexen/p_doors.c +++ b/src/hexen/p_doors.c @@ -24,7 +24,6 @@ #include "h2def.h" #include "p_local.h" -#include "soundst.h" //================================================================== //================================================================== diff --git a/src/hexen/p_enemy.c b/src/hexen/p_enemy.c index 58954aae..b7009510 100644 --- a/src/hexen/p_enemy.c +++ b/src/hexen/p_enemy.c @@ -26,7 +26,7 @@ #include "i_system.h" #include "i_swap.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // Macros // Types diff --git a/src/hexen/p_floor.c b/src/hexen/p_floor.c index 1ea3cba9..171ee713 100644 --- a/src/hexen/p_floor.c +++ b/src/hexen/p_floor.c @@ -25,7 +25,6 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" extern fixed_t FloatBobOffsets[64]; diff --git a/src/hexen/p_inter.c b/src/hexen/p_inter.c index 879cd422..bdc0f576 100644 --- a/src/hexen/p_inter.c +++ b/src/hexen/p_inter.c @@ -25,7 +25,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" #define BONUSADD 6 diff --git a/src/hexen/p_map.c b/src/hexen/p_map.c index 410355a2..827670aa 100644 --- a/src/hexen/p_map.c +++ b/src/hexen/p_map.c @@ -26,7 +26,7 @@ #include "i_system.h" #include "m_bbox.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" static void CheckForPushSpecial(line_t * line, int side, mobj_t * mobj); diff --git a/src/hexen/p_mobj.c b/src/hexen/p_mobj.c index 51eddce1..a99b6a65 100644 --- a/src/hexen/p_mobj.c +++ b/src/hexen/p_mobj.c @@ -27,8 +27,8 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" +#include "s_sound.h" #include "sounds.h" -#include "soundst.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_plats.c b/src/hexen/p_plats.c index af950315..97795ead 100644 --- a/src/hexen/p_plats.c +++ b/src/hexen/p_plats.c @@ -25,7 +25,6 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" plat_t *activeplats[MAXPLATS]; diff --git a/src/hexen/p_pspr.c b/src/hexen/p_pspr.c index bc524388..dad7f131 100644 --- a/src/hexen/p_pspr.c +++ b/src/hexen/p_pspr.c @@ -26,7 +26,7 @@ #include "h2def.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_setup.c b/src/hexen/p_setup.c index 45c85625..34f39485 100644 --- a/src/hexen/p_setup.c +++ b/src/hexen/p_setup.c @@ -31,8 +31,8 @@ #include "m_argv.h" #include "m_bbox.h" #include "i_swap.h" +#include "s_sound.h" #include "p_local.h" -#include "soundst.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_spec.c b/src/hexen/p_spec.c index 40ad8126..07ae1771 100644 --- a/src/hexen/p_spec.c +++ b/src/hexen/p_spec.c @@ -27,7 +27,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_switch.c b/src/hexen/p_switch.c index cad47d55..4018e940 100644 --- a/src/hexen/p_switch.c +++ b/src/hexen/p_switch.c @@ -25,7 +25,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" //================================================================== // diff --git a/src/hexen/p_telept.c b/src/hexen/p_telept.c index 506dba1e..5b7a0e45 100644 --- a/src/hexen/p_telept.c +++ b/src/hexen/p_telept.c @@ -27,7 +27,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_things.c b/src/hexen/p_things.c index bd4146f8..1ba747cb 100644 --- a/src/hexen/p_things.c +++ b/src/hexen/p_things.c @@ -26,7 +26,7 @@ #include "h2def.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ diff --git a/src/hexen/p_user.c b/src/hexen/p_user.c index 2d360e47..d8db08b3 100644 --- a/src/hexen/p_user.c +++ b/src/hexen/p_user.c @@ -25,7 +25,7 @@ #include "h2def.h" #include "i_system.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" void P_PlayerNextArtifact(player_t * player); diff --git a/src/hexen/s_sound.c b/src/hexen/s_sound.c new file mode 100644 index 00000000..f8601e1a --- /dev/null +++ b/src/hexen/s_sound.c @@ -0,0 +1,909 @@ +// 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 "h2def.h" +#include "i_cdmus.h" +#include "i_sound.h" +#include "i_system.h" +#include "m_argv.h" +#include "m_misc.h" +#include "r_local.h" +#include "p_local.h" // for P_AproxDistance +#include "sounds.h" +#include "s_sound.h" + +#define PRIORITY_MAX_ADJUST 10 +#define DIST_ADJUST (MAX_SND_DIST/PRIORITY_MAX_ADJUST) + +#define DEFAULT_ARCHIVEPATH "o:\\sound\\archive\\" + +boolean i_CDMusic; +int i_CDTrack; +int i_CDCurrentTrack; +int i_CDMusicLength; +int oldTic; + +/* +=============================================================================== + + 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[]; + +static channel_t Channel[MAX_CHANNELS]; +static void *RegisteredSong; //the current registered song. +static boolean MusicPaused; +static int Mus_Song = -1; +static byte *Mus_SndPtr; +static byte *SoundCurve; + +static char ArchivePath[128]; + +extern int snd_MusicDevice; +extern int snd_SfxDevice; +extern int snd_MaxVolume; +extern int snd_MusicVolume; +extern int snd_Channels; + +extern int startepisode; +extern int startmap; + +// int AmbChan; + +//========================================================================== +// +// S_Start +// +//========================================================================== + +void S_Start(void) +{ + S_StopAllSound(); + S_StartSong(gamemap, true); +} + +//========================================================================== +// +// S_StartSong +// +//========================================================================== + +void S_StartSong(int song, boolean loop) +{ + char *songLump; + int lumpnum; + int length; + int track; + + if (i_CDMusic) + { // Play a CD track, instead + if (i_CDTrack) + { // Default to the player-chosen track + track = i_CDTrack; + } + else + { + track = P_GetMapCDTrack(gamemap); + } + if (track == i_CDCurrentTrack && i_CDMusicLength > 0) + { + return; + } + if (!I_CDMusPlay(track)) + { + if (loop) + { + i_CDMusicLength = 35 * I_CDMusTrackLength(track); + oldTic = gametic; + } + else + { + i_CDMusicLength = -1; + } + i_CDCurrentTrack = track; + } + } + else + { + if (song == Mus_Song) + { // don't replay an old song + return; + } + if (RegisteredSong) + { + I_StopSong(); + I_UnRegisterSong(RegisteredSong); + RegisteredSong = 0; + } + songLump = P_GetMapSongLump(song); + if (!songLump) + { + return; + } + + lumpnum = W_GetNumForName(songLump); + Mus_SndPtr = W_CacheLumpNum(lumpnum, PU_STATIC); + length = W_LumpLength(lumpnum); + + RegisteredSong = I_RegisterSong(Mus_SndPtr, length); + I_PlaySong(RegisteredSong, loop); + Mus_Song = song; + + W_ReleaseLumpNum(lumpnum); + } +} + +//========================================================================== +// +// S_StartSongName +// +//========================================================================== + +void S_StartSongName(char *songLump, boolean loop) +{ + int lumpnum; + int cdTrack; + int length; + + if (!songLump) + { + return; + } + if (i_CDMusic) + { + cdTrack = 0; + + if (!strcmp(songLump, "hexen")) + { + cdTrack = P_GetCDTitleTrack(); + } + else if (!strcmp(songLump, "hub")) + { + cdTrack = P_GetCDIntermissionTrack(); + } + else if (!strcmp(songLump, "hall")) + { + cdTrack = P_GetCDEnd1Track(); + } + else if (!strcmp(songLump, "orb")) + { + cdTrack = P_GetCDEnd2Track(); + } + else if (!strcmp(songLump, "chess") && !i_CDTrack) + { + cdTrack = P_GetCDEnd3Track(); + } +/* Uncomment this, if Kevin writes a specific song for startup + else if(!strcmp(songLump, "start")) + { + cdTrack = P_GetCDStartTrack(); + } +*/ + if (!cdTrack || (cdTrack == i_CDCurrentTrack && i_CDMusicLength > 0)) + { + return; + } + if (!I_CDMusPlay(cdTrack)) + { + if (loop) + { + i_CDMusicLength = 35 * I_CDMusTrackLength(cdTrack); + oldTic = gametic; + } + else + { + i_CDMusicLength = -1; + } + i_CDCurrentTrack = cdTrack; + i_CDTrack = false; + } + } + else + { + if (RegisteredSong) + { + I_StopSong(); + I_UnRegisterSong(RegisteredSong); + RegisteredSong = NULL; + } + + lumpnum = W_GetNumForName(songLump); + Mus_SndPtr = W_CacheLumpNum(lumpnum, PU_MUSIC); + length = W_LumpLength(lumpnum); + + RegisteredSong = I_RegisterSong(Mus_SndPtr, length); + I_PlaySong(RegisteredSong, loop); + W_ReleaseLumpNum(lumpnum); + Mus_Song = -1; + } +} + +//========================================================================== +// +// S_GetSoundID +// +//========================================================================== + +int S_GetSoundID(char *name) +{ + int i; + + for (i = 0; i < NUMSFX; i++) + { + if (!strcmp(S_sfx[i].tagname, name)) + { + return i; + } + } + return 0; +} + +//========================================================================== +// +// S_StartSound +// +//========================================================================== + +void S_StartSound(mobj_t * origin, int sound_id) +{ + S_StartSoundAtVolume(origin, sound_id, 127); +} + +//========================================================================== +// +// S_StartSoundAtVolume +// +//========================================================================== + +void S_StartSoundAtVolume(mobj_t * origin, int sound_id, int volume) +{ + 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[displayplayer].mo; + } + if (volume == 0) + { + return; + } + + // calculate the distance before other stuff so that we can throw out + // sounds that are beyond the hearing range. + absx = abs(origin->x - players[displayplayer].mo->x); + absy = abs(origin->y - players[displayplayer].mo->y); + dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1); + dist >>= FRACBITS; + if (dist >= MAX_SND_DIST) + { + return; // sound is beyond the hearing range... + } + if (dist < 0) + { + dist = 0; + } + priority = S_sfx[sound_id].priority; + priority *= (PRIORITY_MAX_ADJUST - (dist / DIST_ADJUST)); + #if 0 + // TODO + if (!S_StopSoundID(sound_id, priority)) + { + return; // other sounds have greater priority + } + #endif + 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) + { + 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--; + } + } + } + } + } + + vol = (SoundCurve[dist] * (snd_MaxVolume * 8) * volume) >> 14; + if (origin == players[displayplayer].mo) + { + sep = 128; +// vol = (volume*(snd_MaxVolume+1)*8)>>7; + } + else + { + angle = R_PointToAngle2(players[displayplayer].mo->x, + players[displayplayer].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; +// vol = SoundCurve[dist]; + } + +#if 0 +// TODO + if (S_sfx[sound_id].changePitch) + { + Channel[i].pitch = (byte) (127 + (M_Random() & 7) - (M_Random() & 7)); + } + else + { + Channel[i].pitch = 127; + } +#endif + Channel[i].handle = I_StartSound(&S_sfx[sound_id], + i, + vol, + sep /* , Channel[i].pitch] */); + Channel[i].mo = origin; + Channel[i].sound_id = sound_id; + Channel[i].priority = priority; + Channel[i].volume = volume; + if (S_sfx[sound_id].usefulness < 0) + { + S_sfx[sound_id].usefulness = 1; + } + else + { + S_sfx[sound_id].usefulness++; + } +} + +//========================================================================== +// +// S_StopSoundID +// +//========================================================================== + +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[lp].sound_id].usefulness > 0) + { + S_sfx[Channel[lp].sound_id].usefulness--; + } + Channel[lp].mo = NULL; + } + return (true); +} + +//========================================================================== +// +// S_StopSound +// +//========================================================================== + +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; + } + } +} + +//========================================================================== +// +// S_StopAllSound +// +//========================================================================== + +void S_StopAllSound(void) +{ + int i; + + //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)); +} + +//========================================================================== +// +// S_SoundLink +// +//========================================================================== + +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; + } +} + +//========================================================================== +// +// S_PauseSound +// +//========================================================================== + +void S_PauseSound(void) +{ + if (i_CDMusic) + { + I_CDMusStop(); + } + else + { + I_PauseSong(); + } +} + +//========================================================================== +// +// S_ResumeSound +// +//========================================================================== + +void S_ResumeSound(void) +{ + if (i_CDMusic) + { + I_CDMusResume(); + } + else + { + I_ResumeSong(); + } +} + +//========================================================================== +// +// S_UpdateSounds +// +//========================================================================== + +void S_UpdateSounds(mobj_t * listener) +{ + int i, dist, vol; + int angle; + int sep; + int priority; + int absx; + int absy; + +#ifdef CDMUSIC + if (i_CDMusic) + { + I_UpdateCDMusic(); + } +#endif + if (snd_MaxVolume == 0) + { + return; + } + + // Update any Sequences + SN_UpdateActiveSequences(); + + 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 (Channel[i].mo == NULL || Channel[i].sound_id == 0 + || Channel[i].mo == listener) + { + continue; + } + else + { + absx = abs(Channel[i].mo->x - listener->x); + absy = abs(Channel[i].mo->y - listener->y); + dist = absx + absy - (absx > absy ? absy >> 1 : absx >> 1); + dist >>= FRACBITS; + + if (dist >= MAX_SND_DIST) + { + S_StopSound(Channel[i].mo); + continue; + } + if (dist < 0) + { + dist = 0; + } + //vol = SoundCurve[dist]; + vol = + (SoundCurve[dist] * (snd_MaxVolume * 8) * + Channel[i].volume) >> 14; + if (Channel[i].mo == listener) + { + sep = 128; + } + else + { + angle = R_PointToAngle2(listener->x, listener->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(i, vol, sep /*, Channel[i].pitch */); + priority = S_sfx[Channel[i].sound_id].priority; + priority *= PRIORITY_MAX_ADJUST - (dist / DIST_ADJUST); + Channel[i].priority = priority; + } + } +} + +//========================================================================== +// +// S_Init +// +//========================================================================== + +void S_Init(void) +{ + SoundCurve = W_CacheLumpName("SNDCURVE", PU_STATIC); +// SoundCurve = Z_Malloc(MAX_SND_DIST, PU_STATIC, NULL); + + I_InitSound(false); + + if (snd_Channels > 8) + { + snd_Channels = 8; + } + I_SetMusicVolume(snd_MusicVolume); + +#ifdef CDMUSIC +//TODO + // Attempt to setup CD music + if (snd_MusicDevice == snd_CDMUSIC) + { + ST_Message(" Attempting to initialize CD Music: "); + if (!cdrom) + { + i_CDMusic = (I_CDMusInit() != -1); + } + else + { // The user is trying to use the cdrom for both game and music + i_CDMusic = false; + } + if (i_CDMusic) + { + ST_Message("initialized.\n"); + } + else + { + ST_Message("failed.\n"); + } + } +#endif +} + +//========================================================================== +// +// S_GetChannelInfo +// +//========================================================================== + +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; + } +} + +//========================================================================== +// +// S_GetSoundPlayingInfo +// +//========================================================================== + +boolean S_GetSoundPlayingInfo(mobj_t * mobj, int sound_id) +{ + int i; + + for (i = 0; i < snd_Channels; i++) + { + if (Channel[i].sound_id == sound_id && Channel[i].mo == mobj) + { + if (I_SoundIsPlaying(Channel[i].handle)) + { + return true; + } + } + } + return false; +} + +//========================================================================== +// +// S_SetMusicVolume +// +//========================================================================== + +void S_SetMusicVolume(void) +{ + if (i_CDMusic) + { + I_CDMusSetVolume(snd_MusicVolume * 16); // 0-255 + } + else + { + I_SetMusicVolume(snd_MusicVolume); + } + if (snd_MusicVolume == 0) + { + if (!i_CDMusic) + { + I_PauseSong(); + } + MusicPaused = true; + } + else if (MusicPaused) + { + if (!i_CDMusic) + { + I_ResumeSong(); + } + MusicPaused = false; + } +} + +//========================================================================== +// +// S_ShutDown +// +//========================================================================== + +void S_ShutDown(void) +{ + extern int tsm_ID; + if (tsm_ID != -1) + { + I_StopSong(); + I_UnRegisterSong(RegisteredSong); + I_ShutdownSound(); + } + if (i_CDMusic) + { + I_CDMusStop(); + } +} + +//========================================================================== +// +// S_InitScript +// +//========================================================================== + +void S_InitScript(void) +{ + int p; + int i; + + strcpy(ArchivePath, DEFAULT_ARCHIVEPATH); + + SC_OpenLump("sndinfo"); + + while (SC_GetString()) + { + if (*sc_String == '$') + { + if (!strcasecmp(sc_String, "$ARCHIVEPATH")) + { + SC_MustGetString(); + strcpy(ArchivePath, sc_String); + } + else if (!strcasecmp(sc_String, "$MAP")) + { + SC_MustGetNumber(); + SC_MustGetString(); + if (sc_Number) + { + P_PutMapSongLump(sc_Number, sc_String); + } + } + continue; + } + else + { + for (i = 0; i < NUMSFX; i++) + { + if (!strcmp(S_sfx[i].tagname, sc_String)) + { + SC_MustGetString(); + if (*sc_String != '?') + { + strcpy(S_sfx[i].name, sc_String); + } + else + { + strcpy(S_sfx[i].name, "default"); + } + break; + } + } + if (i == NUMSFX) + { + SC_MustGetString(); + } + } + } + SC_Close(); + + for (i = 0; i < NUMSFX; i++) + { + if (!strcmp(S_sfx[i].name, "")) + { + strcpy(S_sfx[i].name, "default"); + } + } +} + diff --git a/src/hexen/soundst.h b/src/hexen/s_sound.h index 4db0edfd..98ef48ea 100644 --- a/src/hexen/soundst.h +++ b/src/hexen/s_sound.h @@ -22,15 +22,18 @@ //----------------------------------------------------------------------------- -#ifndef __SOUNDSTH__ -#define __SOUNDSTH__ +#ifndef __S_SOUND__ +#define __S_SOUND__ +/* typedef struct { char name[8]; int p1; } musicinfo_t; +*/ +/* typedef struct sfxinfo_s { char tagName[32]; @@ -43,6 +46,7 @@ typedef struct sfxinfo_s int numchannels; // total number of channels a sound type may occupy boolean changePitch; } sfxinfo_t; +*/ typedef struct { diff --git a/src/hexen/sb_bar.c b/src/hexen/sb_bar.c index b4efa84f..34f4e4fe 100644 --- a/src/hexen/sb_bar.c +++ b/src/hexen/sb_bar.c @@ -28,7 +28,7 @@ #include "i_video.h" #include "m_bbox.h" #include "p_local.h" -#include "soundst.h" +#include "s_sound.h" #include "v_video.h" #ifdef __WATCOMC__ diff --git a/src/hexen/sn_sonix.c b/src/hexen/sn_sonix.c index b1d02fe5..412791a3 100644 --- a/src/hexen/sn_sonix.c +++ b/src/hexen/sn_sonix.c @@ -27,7 +27,8 @@ #include <string.h> #include "h2def.h" #include "i_system.h" -#include "soundst.h" +#include "i_sound.h" +#include "s_sound.h" // MACROS ------------------------------------------------------------------ @@ -165,7 +166,7 @@ static int GetSoundOffset(char *name) for (i = 0; i < NUMSFX; i++) { - if (!strcasecmp(name, S_sfx[i].tagName)) + if (!strcasecmp(name, S_sfx[i].tagname)) { return i; } diff --git a/src/hexen/sounds.c b/src/hexen/sounds.c index ac3a62f2..ce00b76e 100644 --- a/src/hexen/sounds.c +++ b/src/hexen/sounds.c @@ -66,496 +66,255 @@ musicinfo_t S_music[] = // Sound info +#define SOUND(name, priority, numchannels, pitchshift) \ + { name, "", priority, NULL, pitchshift, 0, -1, 0, numchannels, NULL } + sfxinfo_t S_sfx[] = { // tagname, lumpname, priority, usefulness, snd_ptr, lumpnum, numchannels, // pitchshift - {"", "", 0, -1, NULL, 0, 0, 0} - , - {"PlayerFighterNormalDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterCrazyDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterExtreme1Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterExtreme2Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterExtreme3Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterBurnDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericNormalDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericCrazyDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericExtreme1Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericExtreme2Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericExtreme3Death", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericBurnDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerMageNormalDeath", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerMageCrazyDeath", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerMageExtreme1Death", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerMageExtreme2Death", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerMageExtreme3Death", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerMageBurnDeath", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerFighterPain", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericPain", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerMagePain", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerFighterGrunt", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericGrunt", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerMageGrunt", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerLand", "", 32, -1, NULL, 0, 2, 1} - , - {"PlayerPoisonCough", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterFallingScream", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerClericFallingScream", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerMageFallingScream", "", 256, -1, NULL, 0, 2, 0} - , - {"PlayerFallingSplat", "", 256, -1, NULL, 0, 2, 1} - , - {"PlayerFighterFailedUse", "", 256, -1, NULL, 0, 1, 1} - , - {"PlayerClericFailedUse", "", 256, -1, NULL, 0, 1, 1} - , - {"PlayerMageFailedUse", "", 256, -1, NULL, 0, 1, 0} - , - {"PlatformStart", "", 36, -1, NULL, 0, 2, 1} - , - {"PlatformStartMetal", "", 36, -1, NULL, 0, 2, 1} - , - {"PlatformStop", "", 40, -1, NULL, 0, 2, 1} - , - {"StoneMove", "", 32, -1, NULL, 0, 2, 1} - , - {"MetalMove", "", 32, -1, NULL, 0, 2, 1} - , - {"DoorOpen", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorLocked", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorOpenMetal", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorCloseMetal", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorCloseLight", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorCloseHeavy", "", 36, -1, NULL, 0, 2, 1} - , - {"DoorCreak", "", 36, -1, NULL, 0, 2, 1} - , - {"PickupWeapon", "", 36, -1, NULL, 0, 2, 0} - , - {"PickupArtifact", "", 36, -1, NULL, 0, 2, 1} - , - {"PickupKey", "", 36, -1, NULL, 0, 2, 1} - , - {"PickupItem", "", 36, -1, NULL, 0, 2, 1} - , - {"PickupPiece", "", 36, -1, NULL, 0, 2, 0} - , - {"WeaponBuild", "", 36, -1, NULL, 0, 2, 0} - , - {"UseArtifact", "", 36, -1, NULL, 0, 2, 1} - , - {"BlastRadius", "", 36, -1, NULL, 0, 2, 1} - , - {"Teleport", "", 256, -1, NULL, 0, 2, 1} - , - {"ThunderCrash", "", 30, -1, NULL, 0, 2, 1} - , - {"FighterPunchMiss", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterPunchHitThing", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterPunchHitWall", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterGrunt", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterAxeHitThing", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterHammerMiss", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterHammerHitThing", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterHammerHitWall", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterHammerContinuous", "", 32, -1, NULL, 0, 2, 1} - , - {"FighterHammerExplode", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterSwordFire", "", 80, -1, NULL, 0, 2, 1} - , - {"FighterSwordExplode", "", 80, -1, NULL, 0, 2, 1} - , - {"ClericCStaffFire", "", 80, -1, NULL, 0, 2, 1} - , - {"ClericCStaffExplode", "", 40, -1, NULL, 0, 2, 1} - , - {"ClericCStaffHitThing", "", 80, -1, NULL, 0, 2, 1} - , - {"ClericFlameFire", "", 80, -1, NULL, 0, 2, 1} - , - {"ClericFlameExplode", "", 80, -1, NULL, 0, 2, 1} - , - {"ClericFlameCircle", "", 80, -1, NULL, 0, 2, 1} - , - {"MageWandFire", "", 80, -1, NULL, 0, 2, 1} - , - {"MageLightningFire", "", 80, -1, NULL, 0, 2, 1} - , - {"MageLightningZap", "", 32, -1, NULL, 0, 2, 1} - , - {"MageLightningContinuous", "", 32, -1, NULL, 0, 2, 1} - , - {"MageLightningReady", "", 30, -1, NULL, 0, 2, 1} - , - {"MageShardsFire", "", 80, -1, NULL, 0, 2, 1} - , - {"MageShardsExplode", "", 36, -1, NULL, 0, 2, 1} - , - {"MageStaffFire", "", 80, -1, NULL, 0, 2, 1} - , - {"MageStaffExplode", "", 40, -1, NULL, 0, 2, 1} - , - {"Switch1", "", 32, -1, NULL, 0, 2, 1} - , - {"Switch2", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentSight", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentActive", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentPain", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentMeleeHit", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"SerpentBirth", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentFXContinuous", "", 32, -1, NULL, 0, 2, 1} - , - {"SerpentFXHit", "", 32, -1, NULL, 0, 2, 1} - , - {"PotteryExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"Drip", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurSight", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurActive", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurPain", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"CentaurLeaderAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"CentaurMissileExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"Wind", "", 1, -1, NULL, 0, 2, 1} - , - {"BishopSight", "", 32, -1, NULL, 0, 2, 1} - , - {"BishopActive", "", 32, -1, NULL, 0, 2, 1} - , - {"BishopPain", "", 32, -1, NULL, 0, 2, 1} - , - {"BishopAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"BishopDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"BishopMissileExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"BishopBlur", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonSight", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonActive", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonPain", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonMissileFire", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonMissileExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"DemonDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"WraithSight", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithActive", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithPain", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithMissileFire", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithMissileExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"WraithDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"PigActive1", "", 32, -1, NULL, 0, 2, 1} - , - {"PigActive2", "", 32, -1, NULL, 0, 2, 1} - , - {"PigPain", "", 32, -1, NULL, 0, 2, 1} - , - {"PigAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"PigDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"MaulatorSight", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorActive", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorPain", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorHamSwing", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorHamHit", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorMissileHit", "", 32, -1, NULL, 0, 2, 1} - , - {"MaulatorDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"FreezeDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"FreezeShatter", "", 40, -1, NULL, 0, 2, 1} - , - {"EttinSight", "", 32, -1, NULL, 0, 2, 1} - , - {"EttinActive", "", 32, -1, NULL, 0, 2, 1} - , - {"EttinPain", "", 32, -1, NULL, 0, 2, 1} - , - {"EttinAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"EttinDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"FireDemonSpawn", "", 32, -1, NULL, 0, 2, 1} - , - {"FireDemonActive", "", 32, -1, NULL, 0, 2, 1} - , - {"FireDemonPain", "", 32, -1, NULL, 0, 2, 1} - , - {"FireDemonAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"FireDemonMissileHit", "", 32, -1, NULL, 0, 2, 1} - , - {"FireDemonDeath", "", 40, -1, NULL, 0, 2, 1} - , - {"IceGuySight", "", 32, -1, NULL, 0, 2, 1} - , - {"IceGuyActive", "", 32, -1, NULL, 0, 2, 1} - , - {"IceGuyAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"IceGuyMissileExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"SorcererSight", "", 256, -1, NULL, 0, 2, 1} - , - {"SorcererActive", "", 256, -1, NULL, 0, 2, 1} - , - {"SorcererPain", "", 256, -1, NULL, 0, 2, 1} - , - {"SorcererSpellCast", "", 256, -1, NULL, 0, 2, 1} - , - {"SorcererBallWoosh", "", 256, -1, NULL, 0, 4, 1} - , - {"SorcererDeathScream", "", 256, -1, NULL, 0, 2, 1} - , - {"SorcererBishopSpawn", "", 80, -1, NULL, 0, 2, 1} - , - {"SorcererBallPop", "", 80, -1, NULL, 0, 2, 1} - , - {"SorcererBallBounce", "", 80, -1, NULL, 0, 3, 1} - , - {"SorcererBallExplode", "", 80, -1, NULL, 0, 3, 1} - , - {"SorcererBigBallExplode", "", 80, -1, NULL, 0, 3, 1} - , - {"SorcererHeadScream", "", 256, -1, NULL, 0, 2, 1} - , - {"DragonSight", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonActive", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonWingflap", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonAttack", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonPain", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonDeath", "", 64, -1, NULL, 0, 2, 1} - , - {"DragonFireballExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"KoraxSight", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxActive", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxPain", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxAttack", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxCommand", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxDeath", "", 256, -1, NULL, 0, 2, 1} - , - {"KoraxStep", "", 128, -1, NULL, 0, 2, 1} - , - {"ThrustSpikeRaise", "", 32, -1, NULL, 0, 2, 1} - , - {"ThrustSpikeLower", "", 32, -1, NULL, 0, 2, 1} - , - {"GlassShatter", "", 32, -1, NULL, 0, 2, 1} - , - {"FlechetteBounce", "", 32, -1, NULL, 0, 2, 1} - , - {"FlechetteExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"LavaMove", "", 36, -1, NULL, 0, 2, 1} - , - {"WaterMove", "", 36, -1, NULL, 0, 2, 1} - , - {"IceStartMove", "", 36, -1, NULL, 0, 2, 1} - , - {"EarthStartMove", "", 36, -1, NULL, 0, 2, 1} - , - {"WaterSplash", "", 32, -1, NULL, 0, 2, 1} - , - {"LavaSizzle", "", 32, -1, NULL, 0, 2, 1} - , - {"SludgeGloop", "", 32, -1, NULL, 0, 2, 1} - , - {"HolySymbolFire", "", 64, -1, NULL, 0, 2, 1} - , - {"SpiritActive", "", 32, -1, NULL, 0, 2, 1} - , - {"SpiritAttack", "", 32, -1, NULL, 0, 2, 1} - , - {"SpiritDie", "", 32, -1, NULL, 0, 2, 1} - , - {"ValveTurn", "", 36, -1, NULL, 0, 2, 1} - , - {"RopePull", "", 36, -1, NULL, 0, 2, 1} - , - {"FlyBuzz", "", 20, -1, NULL, 0, 2, 1} - , - {"Ignite", "", 32, -1, NULL, 0, 2, 1} - , - {"PuzzleSuccess", "", 256, -1, NULL, 0, 2, 1} - , - {"PuzzleFailFighter", "", 256, -1, NULL, 0, 2, 1} - , - {"PuzzleFailCleric", "", 256, -1, NULL, 0, 2, 1} - , - {"PuzzleFailMage", "", 256, -1, NULL, 0, 2, 1} - , - {"Earthquake", "", 32, -1, NULL, 0, 2, 1} - , - {"BellRing", "", 32, -1, NULL, 0, 2, 0} - , - {"TreeBreak", "", 32, -1, NULL, 0, 2, 1} - , - {"TreeExplode", "", 32, -1, NULL, 0, 2, 1} - , - {"SuitofArmorBreak", "", 32, -1, NULL, 0, 2, 1} - , - {"PoisonShroomPain", "", 20, -1, NULL, 0, 2, 1} - , - {"PoisonShroomDeath", "", 32, -1, NULL, 0, 2, 1} - , - {"Ambient1", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient2", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient3", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient4", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient5", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient6", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient7", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient8", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient9", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient10", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient11", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient12", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient13", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient14", "", 1, -1, NULL, 0, 1, 1} - , - {"Ambient15", "", 1, -1, NULL, 0, 1, 1} - , - {"StartupTick", "", 32, -1, NULL, 0, 2, 1} - , - {"SwitchOtherLevel", "", 32, -1, NULL, 0, 2, 1} - , - {"Respawn", "", 32, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceGreetings", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceReady", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceBlood", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceGame", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceBoard", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceWorship", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceMaybe", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceStrong", "", 512, -1, NULL, 0, 2, 1} - , - {"KoraxVoiceFace", "", 512, -1, NULL, 0, 2, 1} - , - {"BatScream", "", 32, -1, NULL, 0, 2, 1} - , - {"Chat", "", 512, -1, NULL, 0, 2, 1} - , - {"MenuMove", "", 32, -1, NULL, 0, 2, 1} - , - {"ClockTick", "", 32, -1, NULL, 0, 2, 1} - , - {"Fireball", "", 32, -1, NULL, 0, 2, 1} - , - {"PuppyBeat", "", 30, -1, NULL, 0, 2, 1} - , - {"MysticIncant", "", 32, -1, NULL, 0, 4, 1} + SOUND("", 0, 0, 0), + SOUND("PlayerFighterNormalDeath", 256, 2, 1), + SOUND("PlayerFighterCrazyDeath", 256, 2, 1), + SOUND("PlayerFighterExtreme1Death", 256, 2, 1), + SOUND("PlayerFighterExtreme2Death", 256, 2, 1), + SOUND("PlayerFighterExtreme3Death", 256, 2, 1), + SOUND("PlayerFighterBurnDeath", 256, 2, 1), + SOUND("PlayerClericNormalDeath", 256, 2, 1), + SOUND("PlayerClericCrazyDeath", 256, 2, 1), + SOUND("PlayerClericExtreme1Death", 256, 2, 1), + SOUND("PlayerClericExtreme2Death", 256, 2, 1), + SOUND("PlayerClericExtreme3Death", 256, 2, 1), + SOUND("PlayerClericBurnDeath", 256, 2, 1), + SOUND("PlayerMageNormalDeath", 256, 2, 0), + SOUND("PlayerMageCrazyDeath", 256, 2, 0), + SOUND("PlayerMageExtreme1Death", 256, 2, 0), + SOUND("PlayerMageExtreme2Death", 256, 2, 0), + SOUND("PlayerMageExtreme3Death", 256, 2, 0), + SOUND("PlayerMageBurnDeath", 256, 2, 0), + SOUND("PlayerFighterPain", 256, 2, 1), + SOUND("PlayerClericPain", 256, 2, 1), + SOUND("PlayerMagePain", 256, 2, 0), + SOUND("PlayerFighterGrunt", 256, 2, 1), + SOUND("PlayerClericGrunt", 256, 2, 1), + SOUND("PlayerMageGrunt", 256, 2, 0), + SOUND("PlayerLand", 32, 2, 1), + SOUND("PlayerPoisonCough", 256, 2, 1), + SOUND("PlayerFighterFallingScream", 256, 2, 1), + SOUND("PlayerClericFallingScream", 256, 2, 1), + SOUND("PlayerMageFallingScream", 256, 2, 0), + SOUND("PlayerFallingSplat", 256, 2, 1), + SOUND("PlayerFighterFailedUse", 256, 1, 1), + SOUND("PlayerClericFailedUse", 256, 1, 1), + SOUND("PlayerMageFailedUse", 256, 1, 0), + SOUND("PlatformStart", 36, 2, 1), + SOUND("PlatformStartMetal", 36, 2, 1), + SOUND("PlatformStop", 40, 2, 1), + SOUND("StoneMove", 32, 2, 1), + SOUND("MetalMove", 32, 2, 1), + SOUND("DoorOpen", 36, 2, 1), + SOUND("DoorLocked", 36, 2, 1), + SOUND("DoorOpenMetal", 36, 2, 1), + SOUND("DoorCloseMetal", 36, 2, 1), + SOUND("DoorCloseLight", 36, 2, 1), + SOUND("DoorCloseHeavy", 36, 2, 1), + SOUND("DoorCreak", 36, 2, 1), + SOUND("PickupWeapon", 36, 2, 0), + SOUND("PickupArtifact", 36, 2, 1), + SOUND("PickupKey", 36, 2, 1), + SOUND("PickupItem", 36, 2, 1), + SOUND("PickupPiece", 36, 2, 0), + SOUND("WeaponBuild", 36, 2, 0), + SOUND("UseArtifact", 36, 2, 1), + SOUND("BlastRadius", 36, 2, 1), + SOUND("Teleport", 256, 2, 1), + SOUND("ThunderCrash", 30, 2, 1), + SOUND("FighterPunchMiss", 80, 2, 1), + SOUND("FighterPunchHitThing", 80, 2, 1), + SOUND("FighterPunchHitWall", 80, 2, 1), + SOUND("FighterGrunt", 80, 2, 1), + SOUND("FighterAxeHitThing", 80, 2, 1), + SOUND("FighterHammerMiss", 80, 2, 1), + SOUND("FighterHammerHitThing", 80, 2, 1), + SOUND("FighterHammerHitWall", 80, 2, 1), + SOUND("FighterHammerContinuous", 32, 2, 1), + SOUND("FighterHammerExplode", 80, 2, 1), + SOUND("FighterSwordFire", 80, 2, 1), + SOUND("FighterSwordExplode", 80, 2, 1), + SOUND("ClericCStaffFire", 80, 2, 1), + SOUND("ClericCStaffExplode", 40, 2, 1), + SOUND("ClericCStaffHitThing", 80, 2, 1), + SOUND("ClericFlameFire", 80, 2, 1), + SOUND("ClericFlameExplode", 80, 2, 1), + SOUND("ClericFlameCircle", 80, 2, 1), + SOUND("MageWandFire", 80, 2, 1), + SOUND("MageLightningFire", 80, 2, 1), + SOUND("MageLightningZap", 32, 2, 1), + SOUND("MageLightningContinuous", 32, 2, 1), + SOUND("MageLightningReady", 30, 2, 1), + SOUND("MageShardsFire", 80, 2, 1), + SOUND("MageShardsExplode", 36, 2, 1), + SOUND("MageStaffFire", 80, 2, 1), + SOUND("MageStaffExplode", 40, 2, 1), + SOUND("Switch1", 32, 2, 1), + SOUND("Switch2", 32, 2, 1), + SOUND("SerpentSight", 32, 2, 1), + SOUND("SerpentActive", 32, 2, 1), + SOUND("SerpentPain", 32, 2, 1), + SOUND("SerpentAttack", 32, 2, 1), + SOUND("SerpentMeleeHit", 32, 2, 1), + SOUND("SerpentDeath", 40, 2, 1), + SOUND("SerpentBirth", 32, 2, 1), + SOUND("SerpentFXContinuous", 32, 2, 1), + SOUND("SerpentFXHit", 32, 2, 1), + SOUND("PotteryExplode", 32, 2, 1), + SOUND("Drip", 32, 2, 1), + SOUND("CentaurSight", 32, 2, 1), + SOUND("CentaurActive", 32, 2, 1), + SOUND("CentaurPain", 32, 2, 1), + SOUND("CentaurAttack", 32, 2, 1), + SOUND("CentaurDeath", 40, 2, 1), + SOUND("CentaurLeaderAttack", 32, 2, 1), + SOUND("CentaurMissileExplode", 32, 2, 1), + SOUND("Wind", 1, 2, 1), + SOUND("BishopSight", 32, 2, 1), + SOUND("BishopActive", 32, 2, 1), + SOUND("BishopPain", 32, 2, 1), + SOUND("BishopAttack", 32, 2, 1), + SOUND("BishopDeath", 40, 2, 1), + SOUND("BishopMissileExplode", 32, 2, 1), + SOUND("BishopBlur", 32, 2, 1), + SOUND("DemonSight", 32, 2, 1), + SOUND("DemonActive", 32, 2, 1), + SOUND("DemonPain", 32, 2, 1), + SOUND("DemonAttack", 32, 2, 1), + SOUND("DemonMissileFire", 32, 2, 1), + SOUND("DemonMissileExplode", 32, 2, 1), + SOUND("DemonDeath", 40, 2, 1), + SOUND("WraithSight", 32, 2, 1), + SOUND("WraithActive", 32, 2, 1), + SOUND("WraithPain", 32, 2, 1), + SOUND("WraithAttack", 32, 2, 1), + SOUND("WraithMissileFire", 32, 2, 1), + SOUND("WraithMissileExplode", 32, 2, 1), + SOUND("WraithDeath", 40, 2, 1), + SOUND("PigActive1", 32, 2, 1), + SOUND("PigActive2", 32, 2, 1), + SOUND("PigPain", 32, 2, 1), + SOUND("PigAttack", 32, 2, 1), + SOUND("PigDeath", 40, 2, 1), + SOUND("MaulatorSight", 32, 2, 1), + SOUND("MaulatorActive", 32, 2, 1), + SOUND("MaulatorPain", 32, 2, 1), + SOUND("MaulatorHamSwing", 32, 2, 1), + SOUND("MaulatorHamHit", 32, 2, 1), + SOUND("MaulatorMissileHit", 32, 2, 1), + SOUND("MaulatorDeath", 40, 2, 1), + SOUND("FreezeDeath", 40, 2, 1), + SOUND("FreezeShatter", 40, 2, 1), + SOUND("EttinSight", 32, 2, 1), + SOUND("EttinActive", 32, 2, 1), + SOUND("EttinPain", 32, 2, 1), + SOUND("EttinAttack", 32, 2, 1), + SOUND("EttinDeath", 40, 2, 1), + SOUND("FireDemonSpawn", 32, 2, 1), + SOUND("FireDemonActive", 32, 2, 1), + SOUND("FireDemonPain", 32, 2, 1), + SOUND("FireDemonAttack", 32, 2, 1), + SOUND("FireDemonMissileHit", 32, 2, 1), + SOUND("FireDemonDeath", 40, 2, 1), + SOUND("IceGuySight", 32, 2, 1), + SOUND("IceGuyActive", 32, 2, 1), + SOUND("IceGuyAttack", 32, 2, 1), + SOUND("IceGuyMissileExplode", 32, 2, 1), + SOUND("SorcererSight", 256, 2, 1), + SOUND("SorcererActive", 256, 2, 1), + SOUND("SorcererPain", 256, 2, 1), + SOUND("SorcererSpellCast", 256, 2, 1), + SOUND("SorcererBallWoosh", 256, 4, 1), + SOUND("SorcererDeathScream", 256, 2, 1), + SOUND("SorcererBishopSpawn", 80, 2, 1), + SOUND("SorcererBallPop", 80, 2, 1), + SOUND("SorcererBallBounce", 80, 3, 1), + SOUND("SorcererBallExplode", 80, 3, 1), + SOUND("SorcererBigBallExplode", 80, 3, 1), + SOUND("SorcererHeadScream", 256, 2, 1), + SOUND("DragonSight", 64, 2, 1), + SOUND("DragonActive", 64, 2, 1), + SOUND("DragonWingflap", 64, 2, 1), + SOUND("DragonAttack", 64, 2, 1), + SOUND("DragonPain", 64, 2, 1), + SOUND("DragonDeath", 64, 2, 1), + SOUND("DragonFireballExplode", 32, 2, 1), + SOUND("KoraxSight", 256, 2, 1), + SOUND("KoraxActive", 256, 2, 1), + SOUND("KoraxPain", 256, 2, 1), + SOUND("KoraxAttack", 256, 2, 1), + SOUND("KoraxCommand", 256, 2, 1), + SOUND("KoraxDeath", 256, 2, 1), + SOUND("KoraxStep", 128, 2, 1), + SOUND("ThrustSpikeRaise", 32, 2, 1), + SOUND("ThrustSpikeLower", 32, 2, 1), + SOUND("GlassShatter", 32, 2, 1), + SOUND("FlechetteBounce", 32, 2, 1), + SOUND("FlechetteExplode", 32, 2, 1), + SOUND("LavaMove", 36, 2, 1), + SOUND("WaterMove", 36, 2, 1), + SOUND("IceStartMove", 36, 2, 1), + SOUND("EarthStartMove", 36, 2, 1), + SOUND("WaterSplash", 32, 2, 1), + SOUND("LavaSizzle", 32, 2, 1), + SOUND("SludgeGloop", 32, 2, 1), + SOUND("HolySymbolFire", 64, 2, 1), + SOUND("SpiritActive", 32, 2, 1), + SOUND("SpiritAttack", 32, 2, 1), + SOUND("SpiritDie", 32, 2, 1), + SOUND("ValveTurn", 36, 2, 1), + SOUND("RopePull", 36, 2, 1), + SOUND("FlyBuzz", 20, 2, 1), + SOUND("Ignite", 32, 2, 1), + SOUND("PuzzleSuccess", 256, 2, 1), + SOUND("PuzzleFailFighter", 256, 2, 1), + SOUND("PuzzleFailCleric", 256, 2, 1), + SOUND("PuzzleFailMage", 256, 2, 1), + SOUND("Earthquake", 32, 2, 1), + SOUND("BellRing", 32, 2, 0), + SOUND("TreeBreak", 32, 2, 1), + SOUND("TreeExplode", 32, 2, 1), + SOUND("SuitofArmorBreak", 32, 2, 1), + SOUND("PoisonShroomPain", 20, 2, 1), + SOUND("PoisonShroomDeath", 32, 2, 1), + SOUND("Ambient1", 1, 1, 1), + SOUND("Ambient2", 1, 1, 1), + SOUND("Ambient3", 1, 1, 1), + SOUND("Ambient4", 1, 1, 1), + SOUND("Ambient5", 1, 1, 1), + SOUND("Ambient6", 1, 1, 1), + SOUND("Ambient7", 1, 1, 1), + SOUND("Ambient8", 1, 1, 1), + SOUND("Ambient9", 1, 1, 1), + SOUND("Ambient10", 1, 1, 1), + SOUND("Ambient11", 1, 1, 1), + SOUND("Ambient12", 1, 1, 1), + SOUND("Ambient13", 1, 1, 1), + SOUND("Ambient14", 1, 1, 1), + SOUND("Ambient15", 1, 1, 1), + SOUND("StartupTick", 32, 2, 1), + SOUND("SwitchOtherLevel", 32, 2, 1), + SOUND("Respawn", 32, 2, 1), + SOUND("KoraxVoiceGreetings", 512, 2, 1), + SOUND("KoraxVoiceReady", 512, 2, 1), + SOUND("KoraxVoiceBlood", 512, 2, 1), + SOUND("KoraxVoiceGame", 512, 2, 1), + SOUND("KoraxVoiceBoard", 512, 2, 1), + SOUND("KoraxVoiceWorship", 512, 2, 1), + SOUND("KoraxVoiceMaybe", 512, 2, 1), + SOUND("KoraxVoiceStrong", 512, 2, 1), + SOUND("KoraxVoiceFace", 512, 2, 1), + SOUND("BatScream", 32, 2, 1), + SOUND("Chat", 512, 2, 1), + SOUND("MenuMove", 32, 2, 1), + SOUND("ClockTick", 32, 2, 1), + SOUND("Fireball", 32, 2, 1), + SOUND("PuppyBeat", 30, 2, 1), + SOUND("MysticIncant", 32, 4, 1), }; diff --git a/src/hexen/sounds.h b/src/hexen/sounds.h index ea6fa3dd..a5b4388e 100644 --- a/src/hexen/sounds.h +++ b/src/hexen/sounds.h @@ -25,7 +25,7 @@ #ifndef __SOUNDSH__ #define __SOUNDSH__ -#include "soundst.h" +#include "i_sound.h" #define MAX_SND_DIST 2025 #define MAX_CHANNELS 16 diff --git a/src/i_sound.h b/src/i_sound.h index a8562ae1..184a12d4 100644 --- a/src/i_sound.h +++ b/src/i_sound.h @@ -38,8 +38,13 @@ typedef struct sfxinfo_struct sfxinfo_t; struct sfxinfo_struct { - // up to 6-character name - char *name; + // tag name, used for hexen. + char *tagname; + + // lump name. If we are running with use_sfx_prefix=true, a + // 'DS' (or 'DP' for PC speaker sounds) is prepended to this. + + char name[9]; // Sfx priority int priority; |