From 8e22875426474df76c29d8ee7eb6078c7c8453f3 Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 14 Nov 2009 02:08:16 +0000 Subject: [PATCH] reduced memory usage of sound in Nexuiz by about 70MB by using shorter ogg/modplug buffers git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9487 d7cf8633-e32d-0410-b094-e92efae38249 --- snd_main.h | 9 +++++++++ snd_mem.c | 2 ++ snd_modplug.c | 11 ++--------- snd_ogg.c | 14 +++----------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/snd_main.h b/snd_main.h index 771205ae..62c50342 100644 --- a/snd_main.h +++ b/snd_main.h @@ -136,6 +136,15 @@ extern mempool_t *snd_mempool; extern qboolean simsound; +#define STREAM_BUFFER_DURATION 0.3f // in seconds +#define STREAM_BUFFER_FILL 0.2f // in seconds +#define STREAM_BUFFER_SIZE(format_ptr) ((int)ceil (STREAM_BUFFER_DURATION * (format_ptr)->speed) * (format_ptr)->width * (format_ptr)->channels) + +// We work with 1 sec sequences, so this buffer must be able to contain +// 1 sec of sound of the highest quality (48 KHz, 16 bit samples, stereo) +extern unsigned char resampling_buffer [48000 * 2 * 2]; + + // ==================================================================== // Architecture-independent functions // ==================================================================== diff --git a/snd_mem.c b/snd_mem.c index d294b248..75f9e829 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -26,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "snd_wav.h" #include "snd_modplug.h" +unsigned char resampling_buffer [48000 * 2 * 2]; + /* ==================== diff --git a/snd_modplug.c b/snd_modplug.c index 54a07909..748d9e45 100644 --- a/snd_modplug.c +++ b/snd_modplug.c @@ -192,13 +192,6 @@ void ModPlug_CloseLibrary (void) ================================================================= */ -#define STREAM_BUFFER_DURATION 1.5f // 1.5 sec -#define STREAM_BUFFER_SIZE(format_ptr) ((int)(ceil (STREAM_BUFFER_DURATION * ((format_ptr)->speed * (format_ptr)->width * (format_ptr)->channels)))) -// We work with 1 sec sequences, so this buffer must be able to contain -// 1 sec of sound of the highest quality (48 KHz, 16 bit samples, stereo) -static unsigned char resampling_buffer [48000 * 2 * 2]; - - // Per-sfx data structure typedef struct { @@ -339,13 +332,13 @@ static const snd_buffer_t* ModPlug_FetchSound (void *sfxfetcher, void **chfetche // We add exactly 1 sec of sound to the buffer: // 1- to ensure we won't lose any sample during the resampling process // 2- to force one call to ModPlug_FetchSound per second to regulate the workload - if (sb->format.speed + sb->nbframes > sb->maxframes) + if ((int)(sb->format.speed * STREAM_BUFFER_FILL) + sb->nbframes > sb->maxframes) { Con_Printf ("ModPlug_FetchSound: stream buffer overflow (%u sample frames / %u)\n", sb->format.speed + sb->nbframes, sb->maxframes); return NULL; } - newlength = per_sfx->format.speed * factor; // -> 1 sec of sound before resampling + newlength = (int)(per_sfx->format.speed*STREAM_BUFFER_FILL) * factor; // -> 1 sec of sound before resampling if(newlength > (int)sizeof(resampling_buffer)) newlength = sizeof(resampling_buffer); diff --git a/snd_ogg.c b/snd_ogg.c index 17ddc1b8..5b7bbcba 100644 --- a/snd_ogg.c +++ b/snd_ogg.c @@ -379,14 +379,6 @@ void OGG_CloseLibrary (void) ================================================================= */ -#define STREAM_BUFFER_DURATION 1.5f // 1.5 sec -#define STREAM_BUFFER_SIZE(format_ptr) ((int)(ceil (STREAM_BUFFER_DURATION * ((format_ptr)->speed * (format_ptr)->width * (format_ptr)->channels)))) - -// We work with 1 sec sequences, so this buffer must be able to contain -// 1 sec of sound of the highest quality (48 KHz, 16 bit samples, stereo) -static unsigned char resampling_buffer [48000 * 2 * 2]; - - // Per-sfx data structure typedef struct { @@ -526,13 +518,13 @@ static const snd_buffer_t* OGG_FetchSound (void *sfxfetcher, void **chfetcherpoi // We add exactly 1 sec of sound to the buffer: // 1- to ensure we won't lose any sample during the resampling process // 2- to force one call to OGG_FetchSound per second to regulate the workload - if (sb->format.speed + sb->nbframes > sb->maxframes) + if ((int)(sb->format.speed * STREAM_BUFFER_FILL) + sb->nbframes > sb->maxframes) { Con_Printf ("OGG_FetchSound: stream buffer overflow (%u sample frames / %u)\n", sb->format.speed + sb->nbframes, sb->maxframes); return NULL; } - newlength = per_sfx->format.speed * factor; // -> 1 sec of sound before resampling + newlength = (int)(per_sfx->format.speed*STREAM_BUFFER_FILL) * factor; // -> 1 sec of sound before resampling if(newlength > (int)sizeof(resampling_buffer)) newlength = sizeof(resampling_buffer); @@ -711,7 +703,7 @@ qboolean OGG_LoadVorbisFile (const char *filename, sfx_t *sfx) len = qov_pcm_total (&vf, -1) * vi->channels * 2; // 16 bits => "* 2" // Decide if we go for a stream or a simple PCM cache - buff_len = (int)ceil (STREAM_BUFFER_DURATION * (snd_renderbuffer->format.speed * 2 * vi->channels)); + buff_len = (int)ceil (STREAM_BUFFER_DURATION * snd_renderbuffer->format.speed) * 2 * vi->channels; if (snd_streaming.integer && len > (ogg_int64_t)filesize + 3 * buff_len) { ogg_stream_persfx_t* per_sfx; -- 2.39.2