diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/doom/deh_sound.c | 2 | ||||
-rw-r--r-- | src/doom/s_sound.c | 2 | ||||
-rw-r--r-- | src/doom/sounds.c | 219 | ||||
-rw-r--r-- | src/i_sdlsound.c | 126 | ||||
-rw-r--r-- | src/i_sound.c | 8 | ||||
-rw-r--r-- | src/i_sound.h | 11 |
6 files changed, 207 insertions, 161 deletions
diff --git a/src/doom/deh_sound.c b/src/doom/deh_sound.c index b28154d9..9d904aa2 100644 --- a/src/doom/deh_sound.c +++ b/src/doom/deh_sound.c @@ -36,7 +36,7 @@ DEH_BEGIN_MAPPING(sound_mapping, sfxinfo_t) DEH_UNSUPPORTED_MAPPING("Offset") - DEH_MAPPING("Zero/One", singularity) + DEH_UNSUPPORTED_MAPPING("Zero/One") DEH_MAPPING("Value", priority) DEH_MAPPING("Zero 1", link) DEH_MAPPING("Zero 2", pitch) diff --git a/src/doom/s_sound.c b/src/doom/s_sound.c index e78f763a..19d76a6b 100644 --- a/src/doom/s_sound.c +++ b/src/doom/s_sound.c @@ -125,6 +125,8 @@ void S_Init(int sfxVolume, int musicVolume) I_InitSound(); I_InitMusic(); + I_PrecacheSounds(S_sfx, NUMSFX); + S_SetSfxVolume(sfxVolume); S_SetMusicVolume(musicVolume); diff --git a/src/doom/sounds.c b/src/doom/sounds.c index 6f315023..37f3e404 100644 --- a/src/doom/sounds.c +++ b/src/doom/sounds.c @@ -116,115 +116,114 @@ musicinfo_t S_music[] = sfxinfo_t S_sfx[] = { // S_sfx[0] needs to be a dummy for odd reasons. - { "none", false, 0, 0, -1, -1, 0, 0, 0 }, - - { "pistol", false, 64, 0, -1, -1, 0, 0, 0 }, - { "shotgn", false, 64, 0, -1, -1, 0, 0, 0 }, - { "sgcock", false, 64, 0, -1, -1, 0, 0, 0 }, - { "dshtgn", false, 64, 0, -1, -1, 0, 0, 0 }, - { "dbopn", false, 64, 0, -1, -1, 0, 0, 0 }, - { "dbcls", false, 64, 0, -1, -1, 0, 0, 0 }, - { "dbload", false, 64, 0, -1, -1, 0, 0, 0 }, - { "plasma", false, 64, 0, -1, -1, 0, 0, 0 }, - { "bfg", false, 64, 0, -1, -1, 0, 0, 0 }, - { "sawup", false, 64, 0, -1, -1, 0, 0, 0 }, - { "sawidl", false, 118, 0, -1, -1, 0, 0, 0 }, - { "sawful", false, 64, 0, -1, -1, 0, 0, 0 }, - { "sawhit", false, 64, 0, -1, -1, 0, 0, 0 }, - { "rlaunc", false, 64, 0, -1, -1, 0, 0, 0 }, - { "rxplod", false, 70, 0, -1, -1, 0, 0, 0 }, - { "firsht", false, 70, 0, -1, -1, 0, 0, 0 }, - { "firxpl", false, 70, 0, -1, -1, 0, 0, 0 }, - { "pstart", false, 100, 0, -1, -1, 0, 0, 0 }, - { "pstop", false, 100, 0, -1, -1, 0, 0, 0 }, - { "doropn", false, 100, 0, -1, -1, 0, 0, 0 }, - { "dorcls", false, 100, 0, -1, -1, 0, 0, 0 }, - { "stnmov", false, 119, 0, -1, -1, 0, 0, 0 }, - { "swtchn", false, 78, 0, -1, -1, 0, 0, 0 }, - { "swtchx", false, 78, 0, -1, -1, 0, 0, 0 }, - { "plpain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "dmpain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "popain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "vipain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "mnpain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "pepain", false, 96, 0, -1, -1, 0, 0, 0 }, - { "slop", false, 78, 0, -1, -1, 0, 0, 0 }, - { "itemup", true, 78, 0, -1, -1, 0, 0, 0 }, - { "wpnup", true, 78, 0, -1, -1, 0, 0, 0 }, - { "oof", false, 96, 0, -1, -1, 0, 0, 0 }, - { "telept", false, 32, 0, -1, -1, 0, 0, 0 }, - { "posit1", true, 98, 0, -1, -1, 0, 0, 0 }, - { "posit2", true, 98, 0, -1, -1, 0, 0, 0 }, - { "posit3", true, 98, 0, -1, -1, 0, 0, 0 }, - { "bgsit1", true, 98, 0, -1, -1, 0, 0, 0 }, - { "bgsit2", true, 98, 0, -1, -1, 0, 0, 0 }, - { "sgtsit", true, 98, 0, -1, -1, 0, 0, 0 }, - { "cacsit", true, 98, 0, -1, -1, 0, 0, 0 }, - { "brssit", true, 94, 0, -1, -1, 0, 0, 0 }, - { "cybsit", true, 92, 0, -1, -1, 0, 0, 0 }, - { "spisit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "bspsit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "kntsit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "vilsit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "mansit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "pesit", true, 90, 0, -1, -1, 0, 0, 0 }, - { "sklatk", false, 70, 0, -1, -1, 0, 0, 0 }, - { "sgtatk", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skepch", false, 70, 0, -1, -1, 0, 0, 0 }, - { "vilatk", false, 70, 0, -1, -1, 0, 0, 0 }, - { "claw", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skeswg", false, 70, 0, -1, -1, 0, 0, 0 }, - { "pldeth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "pdiehi", false, 32, 0, -1, -1, 0, 0, 0 }, - { "podth1", false, 70, 0, -1, -1, 0, 0, 0 }, - { "podth2", false, 70, 0, -1, -1, 0, 0, 0 }, - { "podth3", false, 70, 0, -1, -1, 0, 0, 0 }, - { "bgdth1", false, 70, 0, -1, -1, 0, 0, 0 }, - { "bgdth2", false, 70, 0, -1, -1, 0, 0, 0 }, - { "sgtdth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "cacdth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skldth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "brsdth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "cybdth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "spidth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "bspdth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "vildth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "kntdth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "pedth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "skedth", false, 32, 0, -1, -1, 0, 0, 0 }, - { "posact", true, 120, 0, -1, -1, 0, 0, 0 }, - { "bgact", true, 120, 0, -1, -1, 0, 0, 0 }, - { "dmact", true, 120, 0, -1, -1, 0, 0, 0 }, - { "bspact", true, 100, 0, -1, -1, 0, 0, 0 }, - { "bspwlk", true, 100, 0, -1, -1, 0, 0, 0 }, - { "vilact", true, 100, 0, -1, -1, 0, 0, 0 }, - { "noway", false, 78, 0, -1, -1, 0, 0, 0 }, - { "barexp", false, 60, 0, -1, -1, 0, 0, 0 }, - { "punch", false, 64, 0, -1, -1, 0, 0, 0 }, - { "hoof", false, 70, 0, -1, -1, 0, 0, 0 }, - { "metal", false, 70, 0, -1, -1, 0, 0, 0 }, - { "chgun", false, 64, &S_sfx[sfx_pistol], 150, 0, 0, 0, 0 }, - { "tink", false, 60, 0, -1, -1, 0, 0, 0 }, - { "bdopn", false, 100, 0, -1, -1, 0, 0, 0 }, - { "bdcls", false, 100, 0, -1, -1, 0, 0, 0 }, - { "itmbk", false, 100, 0, -1, -1, 0, 0, 0 }, - { "flame", false, 32, 0, -1, -1, 0, 0, 0 }, - { "flamst", false, 32, 0, -1, -1, 0, 0, 0 }, - { "getpow", false, 60, 0, -1, -1, 0, 0, 0 }, - { "bospit", false, 70, 0, -1, -1, 0, 0, 0 }, - { "boscub", false, 70, 0, -1, -1, 0, 0, 0 }, - { "bossit", false, 70, 0, -1, -1, 0, 0, 0 }, - { "bospn", false, 70, 0, -1, -1, 0, 0, 0 }, - { "bosdth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "manatk", false, 70, 0, -1, -1, 0, 0, 0 }, - { "mandth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "sssit", false, 70, 0, -1, -1, 0, 0, 0 }, - { "ssdth", false, 70, 0, -1, -1, 0, 0, 0 }, - { "keenpn", false, 70, 0, -1, -1, 0, 0, 0 }, - { "keendt", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skeact", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skesit", false, 70, 0, -1, -1, 0, 0, 0 }, - { "skeatk", false, 70, 0, -1, -1, 0, 0, 0 }, - { "radio", false, 60, 0, -1, -1, 0, 0, 0 } + { "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 } }; diff --git a/src/i_sdlsound.c b/src/i_sdlsound.c index 2b30d2b6..2c574222 100644 --- a/src/i_sdlsound.c +++ b/src/i_sdlsound.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // // Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 2005 Simon Howard +// Copyright(C) 2005-8 Simon Howard // Copyright(C) 2008 David Flater // // This program is free software; you can redistribute it and/or @@ -42,7 +42,6 @@ #include "i_sound.h" #include "i_system.h" #include "m_argv.h" -#include "sounds.h" #include "w_wad.h" #include "z_zone.h" @@ -53,7 +52,6 @@ static boolean sound_initialised = false; -static Mix_Chunk sound_chunks[NUMSFX]; static sfxinfo_t *channels_playing[NUM_CHANNELS]; static int mixer_freq; @@ -64,6 +62,27 @@ static uint32_t (*ExpandSoundData)(byte *data, int samplerate, int length, int use_libsamplerate = 0; +// The driver_data field is used to point to a Mix_Chunk structure that +// has data about the expanded version of the sound effect. These are +// allocated on demand. + +static Mix_Chunk *GetSoundChunk(sfxinfo_t *sfxinfo) +{ + Mix_Chunk *chunk; + + // No chunk for this structure yet? Allocate it. + + if (sfxinfo->driver_data == NULL) + { + chunk = Z_Malloc(sizeof(Mix_Chunk), PU_STATIC, NULL); + chunk->abuf = NULL; + chunk->allocated = 0; + sfxinfo->driver_data = chunk; + } + + return sfxinfo->driver_data; +} + // When a sound stops, check if it is still playing. If it is not, // we can mark the sound data as CACHE to be freed back for other // means. @@ -72,7 +91,7 @@ static void ReleaseSoundOnChannel(int channel) { int i; sfxinfo_t *sfxinfo = channels_playing[channel]; - int id; + Mix_Chunk *chunk; if (sfxinfo == NULL) { @@ -90,9 +109,9 @@ static void ReleaseSoundOnChannel(int channel) } // Not used on any channel, and can be safely released - // TODO - id = sfxinfo - S_sfx; - Z_ChangeTag(sound_chunks[id].abuf, PU_CACHE); + + chunk = GetSoundChunk(sfxinfo); + Z_ChangeTag(chunk->abuf, PU_CACHE); } #ifdef HAVE_LIBSAMPLERATE @@ -356,12 +375,12 @@ static uint32_t ExpandSoundData_SDL(byte *data, static boolean CacheSFX(sfxinfo_t *sfxinfo) { + Mix_Chunk *chunk; int lumpnum; unsigned int lumplen; int samplerate; int clipped; unsigned int length; - int sound_id; byte *data; // need to load the sound @@ -394,23 +413,20 @@ static boolean CacheSFX(sfxinfo_t *sfxinfo) } // Sample rate conversion - // DWF 2008-02-10: sound_chunks[sound].alen and abuf are determined + // DWF 2008-02-10: chunk->alen and abuf are determined // by ExpandSoundData. - sound_id = sfxinfo - S_sfx; - sound_chunks[sound_id].allocated = 1; - sound_chunks[sound_id].volume = MIX_MAX_VOLUME; + chunk = GetSoundChunk(sfxinfo); + chunk->allocated = 1; + chunk->volume = MIX_MAX_VOLUME; - clipped = ExpandSoundData(data + 8, - samplerate, - length, - &sound_chunks[sound_id]); + clipped = ExpandSoundData(data + 8, samplerate, length, chunk); if (clipped) { - fprintf(stderr, "Sound %d: clipped %u samples (%0.2f %%)\n", - sound_id, clipped, - 400.0 * clipped / sound_chunks[sound_id].alen); + fprintf(stderr, "Sound '%s': clipped %u samples (%0.2f %%)\n", + sfxinfo->name, clipped, + 400.0 * clipped / chunk->alen); } // don't need the original lump any more @@ -424,14 +440,22 @@ static boolean CacheSFX(sfxinfo_t *sfxinfo) // Preload all the sound effects - stops nasty ingame freezes -static void I_PrecacheSounds(void) +static void I_SDL_PrecacheSounds(sfxinfo_t *sounds, int num_sounds) { + Mix_Chunk *chunk; char namebuf[9]; int i; - printf("I_PrecacheSounds: Precaching all sound effects.."); + // Don't need to precache the sounds unless we are using libsamplerate. + + if (use_libsamplerate == 0) + { + return; + } + + printf("I_SDL_PrecacheSounds: Precaching all sound effects.."); - for (i=sfx_pistol; i<NUMSFX; ++i) + for (i=0; i<num_sounds; ++i) { if ((i % 6) == 0) { @@ -439,17 +463,18 @@ static void I_PrecacheSounds(void) fflush(stdout); } - sprintf(namebuf, "ds%s", DEH_String(S_sfx[i].name)); + sprintf(namebuf, "ds%s", DEH_String(sounds[i].name)); - S_sfx[i].lumpnum = W_CheckNumForName(namebuf); + sounds[i].lumpnum = W_CheckNumForName(namebuf); - if (S_sfx[i].lumpnum != -1) + if (sounds[i].lumpnum != -1) { - CacheSFX(&S_sfx[i]); + CacheSFX(&sounds[i]); + chunk = GetSoundChunk(&sounds[i]); - if (sound_chunks[i].abuf != NULL) + if (chunk->abuf != NULL) { - Z_ChangeTag(sound_chunks[i].abuf, PU_CACHE); + Z_ChangeTag(chunk->abuf, PU_CACHE); } } } @@ -457,27 +482,40 @@ static void I_PrecacheSounds(void) printf("\n"); } +#else + +static void I_SDL_PrecacheSounds(sfxinfo_t *sounds, int num_sounds) +{ + // no-op +} + #endif -static Mix_Chunk *GetSFXChunk(sfxinfo_t *sfxinfo) +// Load a SFX chunk into memory and ensure that it is locked. + +static boolean LockSound(sfxinfo_t *sfxinfo) { - int sound_id; + Mix_Chunk *chunk; - sound_id = sfxinfo - S_sfx; + chunk = GetSoundChunk(sfxinfo); - if (sound_chunks[sound_id].abuf == NULL) + if (chunk->abuf == NULL) { + // Not yet loaded, or has been freed. Load the sound data. + if (!CacheSFX(sfxinfo)) - return NULL; + { + return false; + } } else { // don't free the sound while it is playing! - Z_ChangeTag(sound_chunks[sound_id].abuf, PU_STATIC); + Z_ChangeTag(chunk->abuf, PU_STATIC); } - return &sound_chunks[sound_id]; + return true; } @@ -540,13 +578,13 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep) // Get the sound data - chunk = GetSFXChunk(sfxinfo); - - if (chunk == NULL) + if (!LockSound(sfxinfo)) { - return -1; + return -1; } + chunk = GetSoundChunk(sfxinfo); + // play sound Mix_PlayChannelTimed(channel, chunk, 0, -1); @@ -628,14 +666,9 @@ static boolean I_SDL_InitSound(void) // No sounds yet - for (i=0; i<NUMSFX; ++i) - { - sound_chunks[i].abuf = NULL; - } - for (i=0; i<NUM_CHANNELS; ++i) { - channels_playing[i] = sfx_None; + channels_playing[i] = NULL; } if (SDL_Init(SDL_INIT_AUDIO) < 0) @@ -664,8 +697,6 @@ static boolean I_SDL_InitSound(void) } ExpandSoundData = ExpandSoundData_SRC; - - I_PrecacheSounds(); } #else if (use_libsamplerate != 0) @@ -707,5 +738,6 @@ sound_module_t sound_sdl_module = I_SDL_StartSound, I_SDL_StopSound, I_SDL_SoundIsPlaying, + I_SDL_PrecacheSounds, }; diff --git a/src/i_sound.c b/src/i_sound.c index 3401d014..e6910ea7 100644 --- a/src/i_sound.c +++ b/src/i_sound.c @@ -289,6 +289,14 @@ boolean I_SoundIsPlaying(int channel) } } +void I_PrecacheSounds(sfxinfo_t *sounds, int num_sounds) +{ + if (sound_module != NULL && sound_module->CacheSounds != NULL) + { + sound_module->CacheSounds(sounds, num_sounds); + } +} + void I_InitMusic(void) { } diff --git a/src/i_sound.h b/src/i_sound.h index 7278d37e..2740c1d9 100644 --- a/src/i_sound.h +++ b/src/i_sound.h @@ -41,9 +41,6 @@ struct sfxinfo_struct // up to 6-character name char *name; - // Sfx singularity (only one at a time) - int singularity; - // Sfx priority int priority; @@ -66,6 +63,9 @@ struct sfxinfo_struct // lump number of sfx int lumpnum; + + // data used by the low level code + void *driver_data; }; // @@ -144,6 +144,10 @@ typedef struct boolean (*SoundIsPlaying)(int channel); + // Called on startup to precache sound effects (if necessary) + + void (*CacheSounds)(sfxinfo_t *sounds, int num_sounds); + } sound_module_t; void I_InitSound(void); @@ -154,6 +158,7 @@ void I_UpdateSoundParams(int channel, int vol, int sep); int I_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep); void I_StopSound(int channel); boolean I_SoundIsPlaying(int channel); +void I_PrecacheSounds(sfxinfo_t *sounds, int num_sounds); // Interface for music modules |