summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cgame/cg_public.h2
-rw-r--r--src/cgame/cg_syscalls.asm2
-rw-r--r--src/cgame/cg_syscalls.c5
-rw-r--r--src/client/cl_cgame.c2
-rw-r--r--src/client/snd_dma.c16
-rw-r--r--src/client/snd_local.h2
-rw-r--r--src/client/snd_main.c14
-rw-r--r--src/client/snd_mem.c6
-rw-r--r--src/client/snd_openal.c23
-rw-r--r--src/client/snd_public.h2
10 files changed, 73 insertions, 1 deletions
diff --git a/src/cgame/cg_public.h b/src/cgame/cg_public.h
index 4d9e965a..3f4b13f3 100644
--- a/src/cgame/cg_public.h
+++ b/src/cgame/cg_public.h
@@ -181,6 +181,8 @@ typedef enum
CG_KEY_SETOVERSTRIKEMODE,
CG_KEY_GETOVERSTRIKEMODE,
+ CG_S_SOUNDDURATION,
+
CG_MEMSET = 200,
CG_MEMCPY,
CG_STRNCPY,
diff --git a/src/cgame/cg_syscalls.asm b/src/cgame/cg_syscalls.asm
index 218bd833..a28c5db2 100644
--- a/src/cgame/cg_syscalls.asm
+++ b/src/cgame/cg_syscalls.asm
@@ -104,6 +104,8 @@ equ trap_Parse_SourceFileAndLine -100
equ trap_Key_SetOverstrikeMode -101
equ trap_Key_GetOverstrikeMode -102
+equ trap_S_SoundDuration -103
+
equ memset -201
equ memcpy -202
equ strncpy -203
diff --git a/src/cgame/cg_syscalls.c b/src/cgame/cg_syscalls.c
index 98ba171e..01b7ca85 100644
--- a/src/cgame/cg_syscalls.c
+++ b/src/cgame/cg_syscalls.c
@@ -290,6 +290,11 @@ sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed )
return syscall( CG_S_REGISTERSOUND, sample, compressed );
}
+int trap_S_SoundDuration( sfxHandle_t handle )
+{
+ return syscall( CG_S_SOUNDDURATION, handle );
+}
+
void trap_S_StartBackgroundTrack( const char *intro, const char *loop )
{
syscall( CG_S_STARTBACKGROUNDTRACK, intro, loop );
diff --git a/src/client/cl_cgame.c b/src/client/cl_cgame.c
index 0a40e6dd..2e28d049 100644
--- a/src/client/cl_cgame.c
+++ b/src/client/cl_cgame.c
@@ -542,6 +542,8 @@ intptr_t CL_CgameSystemCalls( intptr_t *args ) {
return 0;
case CG_S_REGISTERSOUND:
return S_RegisterSound( VMA(1), args[2] );
+ case CG_S_SOUNDDURATION:
+ return S_SoundDuration( args[1] );
case CG_S_STARTBACKGROUNDTRACK:
S_StartBackgroundTrack( VMA(1), VMA(2) );
return 0;
diff --git a/src/client/snd_dma.c b/src/client/snd_dma.c
index 93d9a316..749be017 100644
--- a/src/client/snd_dma.c
+++ b/src/client/snd_dma.c
@@ -350,6 +350,21 @@ sfxHandle_t S_Base_RegisterSound( const char *name, qboolean compressed ) {
}
/*
+==================
+S_Base_SoundDuration
+==================
+*/
+static int S_Base_SoundDuration( sfxHandle_t handle ) {
+ if ( handle < 0 || handle >= s_numSfx ) {
+ Com_Printf( S_COLOR_YELLOW "S_Base_SoundDuration: handle %i out of range\n", handle );
+ return 0;
+ }
+ return s_knownSfx[ handle ].duration;
+}
+
+
+
+/*
=====================
S_BeginRegistration
@@ -1489,6 +1504,7 @@ qboolean S_Base_Init( soundInterface_t *si ) {
si->DisableSounds = S_Base_DisableSounds;
si->BeginRegistration = S_Base_BeginRegistration;
si->RegisterSound = S_Base_RegisterSound;
+ si->SoundDuration = S_Base_SoundDuration;
si->ClearSoundBuffer = S_Base_ClearSoundBuffer;
si->SoundInfo = S_Base_SoundInfo;
si->SoundList = S_Base_SoundList;
diff --git a/src/client/snd_local.h b/src/client/snd_local.h
index 45a5779e..4f028a3d 100644
--- a/src/client/snd_local.h
+++ b/src/client/snd_local.h
@@ -59,6 +59,7 @@ typedef struct sfx_s {
int soundLength;
char soundName[MAX_QPATH];
int lastTimeUsed;
+ int duration;
struct sfx_s *next;
} sfx_t;
@@ -138,6 +139,7 @@ typedef struct
void (*DisableSounds)( void );
void (*BeginRegistration)( void );
sfxHandle_t (*RegisterSound)( const char *sample, qboolean compressed );
+ int (*SoundDuration)( sfxHandle_t handle );
void (*ClearSoundBuffer)( void );
void (*SoundInfo)( void );
void (*SoundList)( void );
diff --git a/src/client/snd_main.c b/src/client/snd_main.c
index ebb0e9da..b8dfdf36 100644
--- a/src/client/snd_main.c
+++ b/src/client/snd_main.c
@@ -59,6 +59,7 @@ static qboolean S_ValidSoundInterface( soundInterface_t *si )
if( !si->DisableSounds ) return qfalse;
if( !si->BeginRegistration ) return qfalse;
if( !si->RegisterSound ) return qfalse;
+ if( !si->SoundDuration ) return qfalse;
if( !si->ClearSoundBuffer ) return qfalse;
if( !si->SoundInfo ) return qfalse;
if( !si->SoundList ) return qfalse;
@@ -271,6 +272,19 @@ sfxHandle_t S_RegisterSound( const char *sample, qboolean compressed )
/*
=================
+S_SoundDuration
+=================
+*/
+int S_SoundDuration( sfxHandle_t handle )
+{
+ if( si.SoundDuration )
+ return si.SoundDuration( handle );
+ else
+ return 0;
+}
+
+/*
+=================
S_ClearSoundBuffer
=================
*/
diff --git a/src/client/snd_mem.c b/src/client/snd_mem.c
index decab20d..f10510b7 100644
--- a/src/client/snd_mem.c
+++ b/src/client/snd_mem.c
@@ -201,7 +201,7 @@ qboolean S_LoadSound( sfx_t *sfx )
byte *data;
short *samples;
snd_info_t info;
-// int size;
+ int size_per_sec;
// player specific sounds are never directly loaded
if ( sfx->soundName[0] == '*') {
@@ -213,6 +213,10 @@ qboolean S_LoadSound( sfx_t *sfx )
if(!data)
return qfalse;
+ size_per_sec = info.rate * info.channels * info.width;
+ if( size_per_sec > 0 )
+ sfx->duration = (int)(1000.0f * ((double)info.size / size_per_sec));
+
if ( info.width == 1 ) {
Com_DPrintf(S_COLOR_YELLOW "WARNING: %s is a 8 bit wav file\n", sfx->soundName);
}
diff --git a/src/client/snd_openal.c b/src/client/snd_openal.c
index 0bda7a1a..fee1d22e 100644
--- a/src/client/snd_openal.c
+++ b/src/client/snd_openal.c
@@ -111,6 +111,7 @@ typedef struct alSfx_s
qboolean inMemory; // Sound is stored in memory
qboolean isLocked; // Sound is locked (can not be unloaded)
int lastUsedTime; // Time last used
+ int duration; // Milliseconds
} alSfx_t;
static qboolean alBuffersInitialised = qfalse;
@@ -273,6 +274,7 @@ static void S_AL_BufferLoad(sfxHandle_t sfx)
void *data;
snd_info_t info;
ALuint format;
+ int size_per_sec;
// Nothing?
if(knownSfx[sfx].filename[0] == '\0')
@@ -294,6 +296,10 @@ static void S_AL_BufferLoad(sfxHandle_t sfx)
return;
}
+ size_per_sec = info.rate * info.channels * info.width;
+ if( size_per_sec > 0 )
+ knownSfx[sfx].duration = (int)(1000.0f * ((double)info.size / size_per_sec));
+
format = S_AL_Format(info.width, info.channels);
// Create a buffer
@@ -440,6 +446,22 @@ sfxHandle_t S_AL_RegisterSound( const char *sample, qboolean compressed )
/*
=================
+S_AL_SoundDuration
+=================
+*/
+static
+int S_AL_SoundDuration( sfxHandle_t sfx )
+{
+ if (sfx < 0 || sfx >= numSfx)
+ {
+ Com_Printf(S_COLOR_RED "ERROR: S_AL_SoundDuration: handle %i out of range\n", sfx);
+ return 0;
+ }
+ return knownSfx[sfx].duration;
+}
+
+/*
+=================
S_AL_BufferGet
Return's an sfx's buffer
@@ -1983,6 +2005,7 @@ qboolean S_AL_Init( soundInterface_t *si )
si->DisableSounds = S_AL_DisableSounds;
si->BeginRegistration = S_AL_BeginRegistration;
si->RegisterSound = S_AL_RegisterSound;
+ si->SoundDuration = S_AL_SoundDuration;
si->ClearSoundBuffer = S_AL_ClearSoundBuffer;
si->SoundInfo = S_AL_SoundInfo;
si->SoundList = S_AL_SoundList;
diff --git a/src/client/snd_public.h b/src/client/snd_public.h
index c85f414a..d737412b 100644
--- a/src/client/snd_public.h
+++ b/src/client/snd_public.h
@@ -64,6 +64,8 @@ void S_BeginRegistration( void );
// checks for missing files
sfxHandle_t S_RegisterSound( const char *sample, qboolean compressed );
+int S_SoundDuration( sfxHandle_t handle );
+
void S_DisplayFreeMemory(void);
void S_ClearSoundBuffer( void );