mirror of
https://github.com/UberGames/ioef.git
synced 2024-11-24 13:11:30 +00:00
- Fix memory leak in DMA sound after S_Shutdown()
- Make codec load use temp hunk memory instead of zone mem - Fix sound issues with direct sound and game_restart (#4526)
This commit is contained in:
parent
f921cddc2b
commit
a5f31084d4
10 changed files with 34 additions and 23 deletions
|
@ -1776,10 +1776,10 @@ CL_Snd_Restart
|
||||||
Restart the sound subsystem
|
Restart the sound subsystem
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_Snd_Restart(void)
|
void CL_Snd_Shutdown(void)
|
||||||
{
|
{
|
||||||
S_Shutdown();
|
S_Shutdown();
|
||||||
S_Init();
|
cls.soundStarted = qfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1793,7 +1793,8 @@ handles will be invalid
|
||||||
*/
|
*/
|
||||||
void CL_Snd_Restart_f(void)
|
void CL_Snd_Restart_f(void)
|
||||||
{
|
{
|
||||||
CL_Snd_Restart();
|
CL_Snd_Shutdown();
|
||||||
|
// sound will be reinitialized by vid_restart
|
||||||
CL_Vid_Restart_f();
|
CL_Vid_Restart_f();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3350,7 +3351,7 @@ void CL_Shutdown( char *finalmsg ) {
|
||||||
|
|
||||||
CL_Disconnect( qtrue );
|
CL_Disconnect( qtrue );
|
||||||
|
|
||||||
S_Shutdown();
|
CL_Snd_Shutdown();
|
||||||
CL_ShutdownRef();
|
CL_ShutdownRef();
|
||||||
|
|
||||||
CL_ShutdownUI();
|
CL_ShutdownUI();
|
||||||
|
|
|
@ -450,7 +450,7 @@ void *S_OGG_CodecLoad(const char *filename, snd_info_t *info)
|
||||||
|
|
||||||
// allocate a buffer
|
// allocate a buffer
|
||||||
// this buffer must be free-ed by the caller of this function
|
// this buffer must be free-ed by the caller of this function
|
||||||
buffer = Z_Malloc(info->size);
|
buffer = Hunk_AllocateTempMemory(info->size);
|
||||||
if(!buffer)
|
if(!buffer)
|
||||||
{
|
{
|
||||||
S_OGG_CodecCloseStream(stream);
|
S_OGG_CodecCloseStream(stream);
|
||||||
|
@ -464,7 +464,7 @@ void *S_OGG_CodecLoad(const char *filename, snd_info_t *info)
|
||||||
// we don't even have read a single byte
|
// we don't even have read a single byte
|
||||||
if(bytesRead <= 0)
|
if(bytesRead <= 0)
|
||||||
{
|
{
|
||||||
Z_Free(buffer);
|
Hunk_FreeTempMemory(buffer);
|
||||||
S_OGG_CodecCloseStream(stream);
|
S_OGG_CodecCloseStream(stream);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -218,7 +218,7 @@ void *S_WAV_CodecLoad(const char *filename, snd_info_t *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate some memory
|
// Allocate some memory
|
||||||
buffer = Z_Malloc(info->size);
|
buffer = Hunk_AllocateTempMemory(info->size);
|
||||||
if(!buffer)
|
if(!buffer)
|
||||||
{
|
{
|
||||||
FS_FCloseFile(file);
|
FS_FCloseFile(file);
|
||||||
|
|
|
@ -391,9 +391,8 @@ void S_Base_BeginRegistration( void ) {
|
||||||
if (s_numSfx == 0) {
|
if (s_numSfx == 0) {
|
||||||
SND_setup();
|
SND_setup();
|
||||||
|
|
||||||
s_numSfx = 0;
|
Com_Memset(s_knownSfx, '\0', sizeof(s_knownSfx));
|
||||||
Com_Memset( s_knownSfx, 0, sizeof( s_knownSfx ) );
|
Com_Memset(sfxHash, '\0', sizeof(sfx_t *) * LOOP_HASH);
|
||||||
Com_Memset(sfxHash, 0, sizeof(sfx_t *)*LOOP_HASH);
|
|
||||||
|
|
||||||
S_Base_RegisterSound("sound/feedback/hit.wav", qfalse); // changed to a sound in baseq3
|
S_Base_RegisterSound("sound/feedback/hit.wav", qfalse); // changed to a sound in baseq3
|
||||||
}
|
}
|
||||||
|
@ -1467,8 +1466,10 @@ void S_Base_Shutdown( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNDDMA_Shutdown();
|
SNDDMA_Shutdown();
|
||||||
|
SND_shutdown();
|
||||||
|
|
||||||
s_soundStarted = 0;
|
s_soundStarted = 0;
|
||||||
|
s_numSfx = 0;
|
||||||
|
|
||||||
Cmd_RemoveCommand("s_info");
|
Cmd_RemoveCommand("s_info");
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,6 +202,7 @@ qboolean S_LoadSound( sfx_t *sfx );
|
||||||
void SND_free(sndBuffer *v);
|
void SND_free(sndBuffer *v);
|
||||||
sndBuffer* SND_malloc( void );
|
sndBuffer* SND_malloc( void );
|
||||||
void SND_setup( void );
|
void SND_setup( void );
|
||||||
|
void SND_shutdown(void);
|
||||||
|
|
||||||
void S_PaintChannels(int endtime);
|
void S_PaintChannels(int endtime);
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,12 @@ void SND_setup(void) {
|
||||||
Com_Printf("Sound memory manager started\n");
|
Com_Printf("Sound memory manager started\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SND_shutdown(void)
|
||||||
|
{
|
||||||
|
free(sfxScratchBuffer);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
ResampleSfx
|
ResampleSfx
|
||||||
|
@ -255,7 +261,7 @@ qboolean S_LoadSound( sfx_t *sfx )
|
||||||
}
|
}
|
||||||
|
|
||||||
Hunk_FreeTempMemory(samples);
|
Hunk_FreeTempMemory(samples);
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
|
|
||||||
return qtrue;
|
return qtrue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,7 +148,7 @@ static qboolean alBuffersInitialised = qfalse;
|
||||||
// Sound effect storage, data structures
|
// Sound effect storage, data structures
|
||||||
#define MAX_SFX 4096
|
#define MAX_SFX 4096
|
||||||
static alSfx_t knownSfx[MAX_SFX];
|
static alSfx_t knownSfx[MAX_SFX];
|
||||||
static int numSfx = 0;
|
static sfxHandle_t numSfx = 0;
|
||||||
|
|
||||||
static sfxHandle_t default_sfx;
|
static sfxHandle_t default_sfx;
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx, qboolean cache)
|
||||||
if (!cache)
|
if (!cache)
|
||||||
{
|
{
|
||||||
// Don't create AL cache
|
// Don't create AL cache
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx, qboolean cache)
|
||||||
if((error = qalGetError()) != AL_NO_ERROR)
|
if((error = qalGetError()) != AL_NO_ERROR)
|
||||||
{
|
{
|
||||||
S_AL_BufferUseDefault(sfx);
|
S_AL_BufferUseDefault(sfx);
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
Com_Printf( S_COLOR_RED "ERROR: Can't create a sound buffer for %s - %s\n",
|
Com_Printf( S_COLOR_RED "ERROR: Can't create a sound buffer for %s - %s\n",
|
||||||
curSfx->filename, S_AL_ErrorMsg(error));
|
curSfx->filename, S_AL_ErrorMsg(error));
|
||||||
return;
|
return;
|
||||||
|
@ -369,7 +369,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx, qboolean cache)
|
||||||
if( !S_AL_BufferEvict( ) )
|
if( !S_AL_BufferEvict( ) )
|
||||||
{
|
{
|
||||||
S_AL_BufferUseDefault(sfx);
|
S_AL_BufferUseDefault(sfx);
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
Com_Printf( S_COLOR_RED "ERROR: Out of memory loading %s\n", curSfx->filename);
|
Com_Printf( S_COLOR_RED "ERROR: Out of memory loading %s\n", curSfx->filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx, qboolean cache)
|
||||||
if(error != AL_NO_ERROR)
|
if(error != AL_NO_ERROR)
|
||||||
{
|
{
|
||||||
S_AL_BufferUseDefault(sfx);
|
S_AL_BufferUseDefault(sfx);
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
Com_Printf( S_COLOR_RED "ERROR: Can't fill sound buffer for %s - %s\n",
|
Com_Printf( S_COLOR_RED "ERROR: Can't fill sound buffer for %s - %s\n",
|
||||||
curSfx->filename, S_AL_ErrorMsg(error));
|
curSfx->filename, S_AL_ErrorMsg(error));
|
||||||
return;
|
return;
|
||||||
|
@ -392,7 +392,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx, qboolean cache)
|
||||||
curSfx->info = info;
|
curSfx->info = info;
|
||||||
|
|
||||||
// Free the memory
|
// Free the memory
|
||||||
Z_Free(data);
|
Hunk_FreeTempMemory(data);
|
||||||
|
|
||||||
// Woo!
|
// Woo!
|
||||||
curSfx->inMemory = qtrue;
|
curSfx->inMemory = qtrue;
|
||||||
|
@ -460,7 +460,7 @@ void S_AL_BufferShutdown( void )
|
||||||
S_AL_BufferUnload(i);
|
S_AL_BufferUnload(i);
|
||||||
|
|
||||||
// Clear the tables
|
// Clear the tables
|
||||||
memset(knownSfx, 0, sizeof(knownSfx));
|
numSfx = 0;
|
||||||
|
|
||||||
// All undone
|
// All undone
|
||||||
alBuffersInitialised = qfalse;
|
alBuffersInitialised = qfalse;
|
||||||
|
@ -2205,6 +2205,8 @@ S_AL_BeginRegistration
|
||||||
static
|
static
|
||||||
void S_AL_BeginRegistration( void )
|
void S_AL_BeginRegistration( void )
|
||||||
{
|
{
|
||||||
|
if(!numSfx)
|
||||||
|
S_AL_BufferInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -85,7 +85,7 @@ void CL_FlushMemory( void ) {
|
||||||
void CL_StartHunkUsers( qboolean rendererOnly ) {
|
void CL_StartHunkUsers( qboolean rendererOnly ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CL_Snd_Restart(void)
|
void CL_Snd_Shutdown(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2409,8 +2409,8 @@ void Com_GameRestart(int checksumFeed, qboolean clientRestart)
|
||||||
Cvar_Restart(qtrue);
|
Cvar_Restart(qtrue);
|
||||||
Com_ExecuteCfg();
|
Com_ExecuteCfg();
|
||||||
|
|
||||||
// Restart sound subsystem so old handles are flushed
|
// shut down sound system before restart
|
||||||
CL_Snd_Restart();
|
CL_Snd_Shutdown();
|
||||||
|
|
||||||
if(clientRestart)
|
if(clientRestart)
|
||||||
CL_StartHunkUsers(qfalse);
|
CL_StartHunkUsers(qfalse);
|
||||||
|
|
|
@ -996,7 +996,7 @@ void CL_FlushMemory( void );
|
||||||
void CL_StartHunkUsers( qboolean rendererOnly );
|
void CL_StartHunkUsers( qboolean rendererOnly );
|
||||||
// start all the client stuff using the hunk
|
// start all the client stuff using the hunk
|
||||||
|
|
||||||
void CL_Snd_Restart(void);
|
void CL_Snd_Shutdown(void);
|
||||||
// Restart sound subsystem
|
// Restart sound subsystem
|
||||||
|
|
||||||
void Key_KeynameCompletion( void(*callback)(const char *s) );
|
void Key_KeynameCompletion( void(*callback)(const char *s) );
|
||||||
|
|
Loading…
Reference in a new issue