make gamedir change a two phase operation so things can be done both before and after the cache is flushed. (still having problems with cached sounds, though)

This commit is contained in:
Bill Currie 2007-03-24 10:13:10 +00:00 committed by Jeff Teunissen
parent 54139a1742
commit 02c41feabc
12 changed files with 45 additions and 50 deletions

View file

@ -163,10 +163,6 @@ void Draw_FadeScreen (void);
\ingroup video_renderer_draw \ingroup video_renderer_draw
*/ */
//@{ //@{
/** Clear out the cached qpic textures.
*/
void Draw_ClearCache (void);
/** Load a qpic from the filesystem. /** Load a qpic from the filesystem.
\param path path of the file within the quake filesystem \param path path of the file within the quake filesystem
\param alpha transparency level of the pic. \param alpha transparency level of the pic.

View file

@ -71,7 +71,10 @@ typedef struct gamedir_s {
} dir; } dir;
} gamedir_t; } gamedir_t;
typedef void gamedir_callback_t (void); /** Function type of callback called on gamedir change.
\param phase 0 = before Cache_Flush(), 1 = after Cache_Flush()
*/
typedef void gamedir_callback_t (int phase);
extern searchpath_t *qfs_searchpaths; extern searchpath_t *qfs_searchpaths;
extern gamedir_t *qfs_gamedir; extern gamedir_t *qfs_gamedir;

View file

@ -407,9 +407,10 @@ Mus_VolChange (cvar_t *bgmvolume)
} }
static void static void
Mus_gamedir (void) Mus_gamedir (int phase)
{ {
Mus_OggChange (mus_ogglist); if (phase);
Mus_OggChange (mus_ogglist);
} }
static void static void

View file

@ -249,10 +249,12 @@ s_playvol_f (void)
} }
static void static void
s_channels_gamedir (void) s_channels_gamedir (int phase)
{ {
ambient_sfx[AMBIENT_WATER] = SND_PrecacheSound ("ambience/water1.wav"); if (phase) {
ambient_sfx[AMBIENT_SKY] = SND_PrecacheSound ("ambience/wind2.wav"); ambient_sfx[AMBIENT_WATER] = SND_PrecacheSound ("ambience/water1.wav");
ambient_sfx[AMBIENT_SKY] = SND_PrecacheSound ("ambience/wind2.wav");
}
} }
void void
@ -361,39 +363,35 @@ s_updateAmbientSounds (void)
// stop all ambient channels. // stop all ambient channels.
for (ambient_channel = 0; ambient_channel < NUM_AMBIENTS; for (ambient_channel = 0; ambient_channel < NUM_AMBIENTS;
ambient_channel++) { ambient_channel++) {
if (ambient_channels[ambient_channel]) if (ambient_channels[ambient_channel]) {
SND_ChannelStop (ambient_channels[ambient_channel]); chan->master_vol = 0;
ambient_channels[ambient_channel] = 0; chan->leftvol = chan->rightvol = chan->master_vol;
}
} }
return; return;
} }
for (ambient_channel = 0; ambient_channel < NUM_AMBIENTS; for (ambient_channel = 0; ambient_channel < NUM_AMBIENTS;
ambient_channel++) { ambient_channel++) {
chan = ambient_channels[ambient_channel];
if (chan && chan->done) {
SND_ChannelStop (chan);
chan = ambient_channels[ambient_channel] = 0;
}
sfx = ambient_sfx[ambient_channel]; sfx = ambient_sfx[ambient_channel];
if (!sfx) { if (!sfx)
if (chan)
SND_ChannelStop (chan);
chan = ambient_channels[ambient_channel] = 0;
continue; continue;
}
if (!chan) chan = ambient_channels[ambient_channel];
if (!chan) {
chan = ambient_channels[ambient_channel] = SND_AllocChannel (); chan = ambient_channels[ambient_channel] = SND_AllocChannel ();
if (!chan) if (!chan)
continue; continue;
}
if (!chan->sfx) { if (!chan->sfx) {
sfx = sfx->open (sfx); sfx = sfx->open (sfx);
if (!sfx)
continue;
sfx->retain (sfx); sfx->retain (sfx);
} else { } else {
sfx = chan->sfx; sfx = chan->sfx;
sfx->retain (sfx); //FIXME why is this necessary? //sfx->retain (sfx); //FIXME why is this necessary?
} }
// sfx will be written to chan->sfx later to ensure mixer doesn't use // sfx will be written to chan->sfx later to ensure mixer doesn't use
// channel prematurely. // channel prematurely.

View file

@ -210,7 +210,7 @@ SND_PrecacheSound (const char *name)
} }
static void static void
s_gamedir (void) s_gamedir (int phase)
{ {
snd_num_sfx = 0; snd_num_sfx = 0;
} }

View file

@ -284,7 +284,8 @@ NET_GetPacket (void)
#endif // _WIN32 #endif // _WIN32
if (err == EWOULDBLOCK) if (err == EWOULDBLOCK)
return false; return false;
Con_Printf ("NET_GetPacket: %d: %s\n", err, strerror (err)); Con_Printf ("NET_GetPacket: %d: %d: %s\n", net_socket, err,
strerror (err));
return false; return false;
} }
@ -335,7 +336,8 @@ NET_SendPacket (int length, void *data, netadr_t to)
if (err == EWOULDBLOCK) if (err == EWOULDBLOCK)
return; return;
Con_Printf ("NET_SendPacket: %s\n", strerror (errno)); Con_Printf ("NET_SendPacket: %d: %d: %s\n", net_socket, err,
strerror (errno));
} }
} }

View file

@ -1187,11 +1187,12 @@ QFS_Gamedir (const char *dir)
// Make sure everyone else knows we've changed gamedirs // Make sure everyone else knows we've changed gamedirs
for (i = 0; i < num_gamedir_callbacks; i++) { for (i = 0; i < num_gamedir_callbacks; i++) {
gamedir_callbacks[i] (); gamedir_callbacks[i] (0);
} }
// Flush cache last, so other things get a chance to deal with it
Cache_Flush (); Cache_Flush ();
for (i = 0; i < num_gamedir_callbacks; i++) {
gamedir_callbacks[i] (1);
}
} }
/* /*

View file

@ -186,12 +186,14 @@ Draw_PicFromWad (const char *name)
return p; return p;
} }
void static void
Draw_ClearCache (void) Draw_ClearCache (int phase)
{ {
cachepic_t *pic; cachepic_t *pic;
int i; int i;
if (phase)
return;
for (pic = cachepics, i = 0; i < numcachepics; pic++, i++) for (pic = cachepics, i = 0; i < numcachepics; pic++, i++)
pic->dirty = true; pic->dirty = true;
} }

View file

@ -82,12 +82,6 @@ Draw_PicFromWad (const char *name)
} }
void
Draw_ClearCache (void)
{
}
VISIBLE qpic_t * VISIBLE qpic_t *
Draw_CachePic (const char *path, qboolean alpha) Draw_CachePic (const char *path, qboolean alpha)
{ {

View file

@ -82,12 +82,6 @@ Draw_PicFromWad (const char *name)
} }
void
Draw_ClearCache (void)
{
}
VISIBLE qpic_t * VISIBLE qpic_t *
Draw_CachePic (const char *path, qboolean alpha) Draw_CachePic (const char *path, qboolean alpha)
{ {

View file

@ -1693,10 +1693,12 @@ CL_Init_Memory (void)
} }
static void static void
CL_Autoexec (void) CL_Autoexec (int phase)
{ {
int cmd_warncmd_val = cmd_warncmd->int_val; int cmd_warncmd_val = cmd_warncmd->int_val;
if (!phase)
return;
Cbuf_AddText (cl_cbuf, "cmd_warncmd 0\n"); Cbuf_AddText (cl_cbuf, "cmd_warncmd 0\n");
Cbuf_AddText (cl_cbuf, "exec config.cfg\n"); Cbuf_AddText (cl_cbuf, "exec config.cfg\n");
Cbuf_AddText (cl_cbuf, "exec frontend.cfg\n"); Cbuf_AddText (cl_cbuf, "exec frontend.cfg\n");

View file

@ -93,8 +93,10 @@ model_t *cl_mod_bolt3;
model_t *cl_spr_explod; model_t *cl_spr_explod;
static void static void
CL_TEnts_Precache (void) CL_TEnts_Precache (int phase)
{ {
if (!phase)
return;
cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav"); cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav");
cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav"); cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav");
cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav"); cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav");
@ -116,7 +118,7 @@ void
CL_TEnts_Init (void) CL_TEnts_Init (void)
{ {
QFS_GamedirCallback (CL_TEnts_Precache); QFS_GamedirCallback (CL_TEnts_Precache);
CL_TEnts_Precache (); CL_TEnts_Precache (1);
} }
void void