ref: 3a708aa7fb7577ad8fed6ee39705567dcdc4e97e
parent: 609dca9fdf9a03500c0f4023da7bcc4389f36c52
author: Simon Howard <fraggle@gmail.com>
date: Sun Sep 14 17:36:46 EDT 2008
Remove i_sdlsound.c dependency on doom/ Subversion-branch: /branches/raven-branch Subversion-revision: 1229
--- 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)--- a/src/doom/s_sound.c
+++ b/src/doom/s_sound.c
@@ -125,6 +125,8 @@
I_InitSound();
I_InitMusic();
+ I_PrecacheSounds(S_sfx, NUMSFX);
+
S_SetSfxVolume(sfxVolume);
S_SetMusicVolume(musicVolume);
--- a/src/doom/sounds.c
+++ b/src/doom/sounds.c
@@ -116,115 +116,114 @@
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 } };
--- 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 @@
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 @@
{int i;
sfxinfo_t *sfxinfo = channels_playing[channel];
- int id;
+ Mix_Chunk *chunk;
if (sfxinfo == NULL)
{@@ -90,9 +109,9 @@
}
// 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 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 @@
}
// 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,15 +440,23 @@
// 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.
- for (i=sfx_pistol; i<NUMSFX; ++i)
+ if (use_libsamplerate == 0)
{+ return;
+ }
+
+ printf("I_SDL_PrecacheSounds: Precaching all sound effects..");+
+ for (i=0; i<num_sounds; ++i)
+ {if ((i % 6) == 0)
{ printf(".");@@ -439,17 +463,18 @@
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 @@
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 @@
// 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 @@
// 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 @@
}
ExpandSoundData = ExpandSoundData_SRC;
-
- I_PrecacheSounds();
}
#else
if (use_libsamplerate != 0)
@@ -707,5 +738,6 @@
I_SDL_StartSound,
I_SDL_StopSound,
I_SDL_SoundIsPlaying,
+ I_SDL_PrecacheSounds,
};
--- a/src/i_sound.c
+++ b/src/i_sound.c
@@ -289,6 +289,14 @@
}
}
+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)
{}
--- a/src/i_sound.h
+++ b/src/i_sound.h
@@ -41,9 +41,6 @@
// up to 6-character name
char *name;
- // Sfx singularity (only one at a time)
- int singularity;
-
// Sfx priority
int priority;
@@ -66,6 +63,9 @@
// lump number of sfx
int lumpnum;
+
+ // data used by the low level code
+ void *driver_data;
};
//
@@ -144,6 +144,10 @@
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 @@
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
--
⑨