mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-01-31 05:40:44 +00:00
- Fixed: GetMSLength didn't resolve random and player sounds.
- Moved sound aliasing code out of fmodsound.cpp into S_LoadSound. SVN r1203 (trunk)
This commit is contained in:
parent
9e7bd3f8fa
commit
2df65c70cb
8 changed files with 189 additions and 158 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
September 7, 2008 (Changes by Graf Zahl)
|
||||||
|
- Fixed: GetMSLength didn't resolve random and player sounds.
|
||||||
|
- Moved sound aliasing code out of fmodsound.cpp into S_LoadSound.
|
||||||
|
|
||||||
September 6, 2008 (Changes by Graf Zahl)
|
September 6, 2008 (Changes by Graf Zahl)
|
||||||
- Fixed: The tagged version of TranslucentLine took the information for additive
|
- Fixed: The tagged version of TranslucentLine took the information for additive
|
||||||
translucency from the tagged linedef, not the control linedef.
|
translucency from the tagged linedef, not the control linedef.
|
||||||
|
|
|
@ -208,8 +208,6 @@ static int S_AddSound (const char *logicalname, int lumpnum, FScanner *sc=NULL);
|
||||||
|
|
||||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
extern int sfx_sawup, sfx_sawidl, sfx_sawful, sfx_sawhit;
|
|
||||||
extern int sfx_itemup, sfx_tink;
|
|
||||||
extern int sfx_empty;
|
extern int sfx_empty;
|
||||||
|
|
||||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
|
@ -334,6 +332,56 @@ int S_PickReplacement (int refid)
|
||||||
return refid;
|
return refid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// S_GetSoundMSLength
|
||||||
|
//
|
||||||
|
// Returns duration of sound
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
unsigned int S_GetMSLength(FSoundID sound)
|
||||||
|
{
|
||||||
|
if (sound < 0 || sound >= S_sfx.Size()) return 0;
|
||||||
|
|
||||||
|
sfxinfo_t *sfx = &S_sfx[sound];
|
||||||
|
|
||||||
|
// Resolve player sounds, random sounds, and aliases
|
||||||
|
if (sfx->link != sfxinfo_t::NO_LINK)
|
||||||
|
{
|
||||||
|
if (sfx->bPlayerReserve)
|
||||||
|
{
|
||||||
|
sfx = &S_sfx[S_FindSkinnedSound (NULL, sound)];
|
||||||
|
}
|
||||||
|
else if (sfx->bRandomHeader)
|
||||||
|
{
|
||||||
|
// Hm... What should we do here?
|
||||||
|
// Pick the longest or the shortest sound?
|
||||||
|
// I think the longest one makes more sense.
|
||||||
|
|
||||||
|
int length = 0;
|
||||||
|
const FRandomSoundList *list = &S_rnd[sfx->link];
|
||||||
|
|
||||||
|
for (int i=0; i < list->NumSounds; i++)
|
||||||
|
{
|
||||||
|
// unfortunately we must load all sounds to find the longest one... :(
|
||||||
|
int thislen = S_GetMSLength(list->Sounds[i]);
|
||||||
|
if (thislen > length) length = thislen;
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sfx = &S_sfx[sfx->link];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sfx = S_LoadSound(sfx);
|
||||||
|
if (sfx != NULL) return GSnd->GetMSLength(sfx);
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// S_CacheRandomSound
|
// S_CacheRandomSound
|
||||||
|
@ -777,7 +825,7 @@ static void S_ClearSoundData()
|
||||||
S_StopAllChannels();
|
S_StopAllChannels();
|
||||||
for (i = 0; i < S_sfx.Size(); ++i)
|
for (i = 0; i < S_sfx.Size(); ++i)
|
||||||
{
|
{
|
||||||
GSnd->UnloadSound(&S_sfx[i]);
|
S_UnloadSound(&S_sfx[i]);
|
||||||
}
|
}
|
||||||
S_sfx.Clear();
|
S_sfx.Clear();
|
||||||
|
|
||||||
|
@ -1956,7 +2004,7 @@ void AAmbientSound::Activate (AActor *activator)
|
||||||
Destroy ();
|
Destroy ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
amb->periodmin = Scale(GSnd->GetMSLength(&S_sfx[sndnum]), TICRATE, 1000);
|
amb->periodmin = Scale(S_GetMSLength(sndnum), TICRATE, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
NextCheck = gametic;
|
NextCheck = gametic;
|
||||||
|
|
|
@ -109,7 +109,6 @@ static void CalcSectorSoundOrg(const sector_t *sec, int channum, fixed_t *x, fix
|
||||||
static void CalcPolyobjSoundOrg(const FPolyObj *poly, fixed_t *x, fixed_t *y, fixed_t *z);
|
static void CalcPolyobjSoundOrg(const FPolyObj *poly, fixed_t *x, fixed_t *y, fixed_t *z);
|
||||||
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly,
|
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly,
|
||||||
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation);
|
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation);
|
||||||
static sfxinfo_t *S_LoadSound(sfxinfo_t *sfx);
|
|
||||||
static void S_SetListener(SoundListener &listener, AActor *listenactor);
|
static void S_SetListener(SoundListener &listener, AActor *listenactor);
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
@ -393,7 +392,7 @@ void S_Start ()
|
||||||
// First delete the old sound list
|
// First delete the old sound list
|
||||||
for(unsigned i = 1; i < S_sfx.Size(); i++)
|
for(unsigned i = 1; i < S_sfx.Size(); i++)
|
||||||
{
|
{
|
||||||
GSnd->UnloadSound(&S_sfx[i]);
|
S_UnloadSound(&S_sfx[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the global SNDINFO
|
// Parse the global SNDINFO
|
||||||
|
@ -482,7 +481,7 @@ void S_PrecacheLevel ()
|
||||||
{
|
{
|
||||||
if (!S_sfx[i].bUsed && S_sfx[i].link == sfxinfo_t::NO_LINK)
|
if (!S_sfx[i].bUsed && S_sfx[i].link == sfxinfo_t::NO_LINK)
|
||||||
{
|
{
|
||||||
GSnd->UnloadSound (&S_sfx[i]);
|
S_UnloadSound (&S_sfx[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -513,11 +512,26 @@ void S_CacheSound (sfxinfo_t *sfx)
|
||||||
sfx = &S_sfx[sfx->link];
|
sfx = &S_sfx[sfx->link];
|
||||||
}
|
}
|
||||||
sfx->bUsed = true;
|
sfx->bUsed = true;
|
||||||
GSnd->LoadSound (sfx);
|
S_LoadSound (sfx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// S_UnloadSound
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void S_UnloadSound (sfxinfo_t *sfx)
|
||||||
|
{
|
||||||
|
if (sfx->data != NULL)
|
||||||
|
{
|
||||||
|
GSnd->UnloadSound(sfx);
|
||||||
|
DPrintf("Unloaded sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// S_GetChannel
|
// S_GetChannel
|
||||||
|
@ -1168,13 +1182,38 @@ void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, fl
|
||||||
|
|
||||||
sfxinfo_t *S_LoadSound(sfxinfo_t *sfx)
|
sfxinfo_t *S_LoadSound(sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
if (sfx->data == NULL)
|
while (sfx->data == NULL)
|
||||||
{
|
{
|
||||||
GSnd->LoadSound (sfx);
|
unsigned int i;
|
||||||
if (sfx->link != sfxinfo_t::NO_LINK)
|
|
||||||
|
// If the sound doesn't exist, replace it with the empty sound.
|
||||||
|
if (sfx->lumpnum == -1)
|
||||||
{
|
{
|
||||||
sfx = &S_sfx[sfx->link];
|
sfx->lumpnum = sfx_empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See if there is another sound already initialized with this lump. If so,
|
||||||
|
// then set this one up as a link, and don't load the sound again.
|
||||||
|
for (i = 0; i < S_sfx.Size(); i++)
|
||||||
|
{
|
||||||
|
if (S_sfx[i].data && S_sfx[i].link == sfxinfo_t::NO_LINK && S_sfx[i].lumpnum == sfx->lumpnum)
|
||||||
|
{
|
||||||
|
DPrintf ("Linked %s to %s (%d)\n", sfx->name.GetChars(), S_sfx[i].name.GetChars(), i);
|
||||||
|
sfx->link = i;
|
||||||
|
return &S_sfx[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DPrintf("Loading sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
|
||||||
|
if (!GSnd->LoadSound (sfx))
|
||||||
|
{
|
||||||
|
if (sfx->lumpnum != sfx_empty)
|
||||||
|
{
|
||||||
|
sfx->lumpnum = sfx_empty;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return sfx;
|
return sfx;
|
||||||
}
|
}
|
||||||
|
|
|
@ -351,6 +351,9 @@ int S_AddPlayerSound (const char *playerclass, const int gender, int refid, cons
|
||||||
int S_AddPlayerSound (const char *playerclass, const int gender, int refid, int lumpnum, bool fromskin=false);
|
int S_AddPlayerSound (const char *playerclass, const int gender, int refid, int lumpnum, bool fromskin=false);
|
||||||
int S_AddPlayerSoundExisting (const char *playerclass, const int gender, int refid, int aliasto, bool fromskin=false);
|
int S_AddPlayerSoundExisting (const char *playerclass, const int gender, int refid, int aliasto, bool fromskin=false);
|
||||||
void S_ShrinkPlayerSoundLists ();
|
void S_ShrinkPlayerSoundLists ();
|
||||||
|
void S_UnloadSound (sfxinfo_t *sfx);
|
||||||
|
sfxinfo_t *S_LoadSound(sfxinfo_t *sfx);
|
||||||
|
unsigned int S_GetMSLength(FSoundID sound);
|
||||||
|
|
||||||
// [RH] Prints sound debug info to the screen.
|
// [RH] Prints sound debug info to the screen.
|
||||||
// Modelled after Hexen's noise cheat.
|
// Modelled after Hexen's noise cheat.
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <mmsystem.h>
|
#include <mmsystem.h>
|
||||||
#include "resource.h"
|
|
||||||
extern HWND Window;
|
extern HWND Window;
|
||||||
#define USE_WINDOWS_DWORD
|
#define USE_WINDOWS_DWORD
|
||||||
#else
|
#else
|
||||||
|
@ -50,10 +49,8 @@ extern HWND Window;
|
||||||
#include "fmodsound.h"
|
#include "fmodsound.h"
|
||||||
#include "c_cvars.h"
|
#include "c_cvars.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "gi.h"
|
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "i_music.h"
|
#include "i_music.h"
|
||||||
#include "i_musicinterns.h"
|
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
#include "v_palette.h"
|
#include "v_palette.h"
|
||||||
|
|
||||||
|
@ -91,6 +88,7 @@ static const char *Enum_NameForNum(const FEnumList *list, int num);
|
||||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||||
|
|
||||||
EXTERN_CVAR (String, snd_output)
|
EXTERN_CVAR (String, snd_output)
|
||||||
|
EXTERN_CVAR (Float, snd_sfxvolume)
|
||||||
EXTERN_CVAR (Float, snd_musicvolume)
|
EXTERN_CVAR (Float, snd_musicvolume)
|
||||||
EXTERN_CVAR (Int, snd_buffersize)
|
EXTERN_CVAR (Int, snd_buffersize)
|
||||||
EXTERN_CVAR (Int, snd_samplerate)
|
EXTERN_CVAR (Int, snd_samplerate)
|
||||||
|
@ -1896,110 +1894,41 @@ void FMODSoundRenderer::UpdateSounds()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FMODSoundRenderer::LoadSound(sfxinfo_t *sfx)
|
bool FMODSoundRenderer::LoadSound(sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
if (sfx->data == NULL)
|
if (sfx->data == NULL)
|
||||||
{
|
{
|
||||||
DPrintf("Loading sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
|
void **slot = &sfx->data;
|
||||||
getsfx(sfx);
|
BYTE *sfxdata;
|
||||||
}
|
BYTE *sfxstart;
|
||||||
}
|
int size;
|
||||||
|
FMOD_RESULT result;
|
||||||
|
FMOD_MODE samplemode;
|
||||||
|
FMOD_CREATESOUNDEXINFO exinfo = { sizeof(exinfo), };
|
||||||
|
FMOD::Sound *sample;
|
||||||
|
int rolloff;
|
||||||
|
float mindist, maxdist;
|
||||||
|
|
||||||
//==========================================================================
|
samplemode = FMOD_3D | FMOD_OPENMEMORY | FMOD_SOFTWARE;
|
||||||
//
|
|
||||||
// FMODSoundRenderer :: UnloadSound
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void FMODSoundRenderer::UnloadSound(sfxinfo_t *sfx)
|
if (sfx->MaxDistance == 0)
|
||||||
{
|
|
||||||
if (sfx->data != NULL)
|
|
||||||
{
|
|
||||||
((FMOD::Sound *)sfx->data)->release();
|
|
||||||
sfx->data = NULL;
|
|
||||||
DPrintf("Unloaded sound \"%s\" (%td)\n", sfx->name.GetChars(), sfx - &S_sfx[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// FMODSoundRenderer :: GetMSLength
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
unsigned int FMODSoundRenderer::GetMSLength(sfxinfo_t *sfx)
|
|
||||||
{
|
|
||||||
if (sfx->data == NULL)
|
|
||||||
{
|
|
||||||
LoadSound(sfx);
|
|
||||||
}
|
|
||||||
if (sfx->data != NULL)
|
|
||||||
{
|
|
||||||
unsigned int length;
|
|
||||||
|
|
||||||
if (((FMOD::Sound *)sfx->data)->getLength(&length, FMOD_TIMEUNIT_MS) == FMOD_OK)
|
|
||||||
{
|
{
|
||||||
return length;
|
mindist = S_MinDistance;
|
||||||
|
maxdist = S_MaxDistanceOrRolloffFactor;
|
||||||
|
rolloff = S_RolloffType;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mindist = sfx->MinDistance;
|
||||||
|
maxdist = sfx->MaxDistance;
|
||||||
|
rolloff = sfx->RolloffType;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0; // Don't know.
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
sfxdata = NULL;
|
||||||
//
|
|
||||||
// FMODSoundRenderer :: DoLoad
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void FMODSoundRenderer::DoLoad(void **slot, sfxinfo_t *sfx)
|
|
||||||
{
|
|
||||||
BYTE *sfxdata;
|
|
||||||
BYTE *sfxstart;
|
|
||||||
int size;
|
|
||||||
int errcount;
|
|
||||||
FMOD_RESULT result;
|
|
||||||
FMOD_MODE samplemode;
|
|
||||||
FMOD_CREATESOUNDEXINFO exinfo = { sizeof(exinfo), };
|
|
||||||
FMOD::Sound *sample;
|
|
||||||
int rolloff;
|
|
||||||
float mindist, maxdist;
|
|
||||||
|
|
||||||
samplemode = FMOD_3D | FMOD_OPENMEMORY | FMOD_SOFTWARE;
|
|
||||||
|
|
||||||
if (sfx->MaxDistance == 0)
|
|
||||||
{
|
|
||||||
mindist = S_MinDistance;
|
|
||||||
maxdist = S_MaxDistanceOrRolloffFactor;
|
|
||||||
rolloff = S_RolloffType;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mindist = sfx->MinDistance;
|
|
||||||
maxdist = sfx->MaxDistance;
|
|
||||||
rolloff = sfx->RolloffType;
|
|
||||||
}
|
|
||||||
|
|
||||||
sfxdata = NULL;
|
|
||||||
|
|
||||||
errcount = 0;
|
|
||||||
while (errcount < 2)
|
|
||||||
{
|
|
||||||
sample = NULL;
|
sample = NULL;
|
||||||
if (sfxdata != NULL)
|
|
||||||
{
|
|
||||||
delete[] sfxdata;
|
|
||||||
sfxdata = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errcount)
|
|
||||||
sfx->lumpnum = Wads.GetNumForName("dsempty", ns_sounds);
|
|
||||||
|
|
||||||
size = Wads.LumpLength(sfx->lumpnum);
|
size = Wads.LumpLength(sfx->lumpnum);
|
||||||
if (size == 0)
|
if (size <= 0) return false;
|
||||||
{
|
|
||||||
errcount++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
FWadLump wlump = Wads.OpenLumpNum(sfx->lumpnum);
|
FWadLump wlump = Wads.OpenLumpNum(sfx->lumpnum);
|
||||||
sfxstart = sfxdata = new BYTE[size];
|
sfxstart = sfxdata = new BYTE[size];
|
||||||
|
@ -2046,75 +1975,82 @@ void FMODSoundRenderer::DoLoad(void **slot, sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
exinfo.length = size;
|
exinfo.length = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exinfo.length == 0)
|
if (exinfo.length == 0)
|
||||||
{
|
{
|
||||||
DPrintf("Sample has a length of 0\n");
|
DPrintf("Sample has a length of 0\n");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
result = Sys->createSound((char *)sfxstart, samplemode, &exinfo, &sample);
|
else
|
||||||
if (result != FMOD_OK)
|
|
||||||
{
|
{
|
||||||
DPrintf("Failed to allocate sample: Error %d\n", result);
|
result = Sys->createSound((char *)sfxstart, samplemode, &exinfo, &sample);
|
||||||
errcount++;
|
if (result != FMOD_OK)
|
||||||
continue;
|
{
|
||||||
}
|
DPrintf("Failed to allocate sample: Error %d\n", result);
|
||||||
*slot = sample;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sample != NULL)
|
if (sfxdata != NULL)
|
||||||
{
|
{
|
||||||
if (rolloff == ROLLOFF_Log)
|
delete[] sfxdata;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*slot = sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sfxdata != NULL)
|
||||||
{
|
{
|
||||||
maxdist = 10000.f;
|
delete[] sfxdata;
|
||||||
}
|
}
|
||||||
sample->set3DMinMaxDistance(mindist, maxdist);
|
|
||||||
sample->setUserData(sfx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sfxdata != NULL)
|
if (sample != NULL)
|
||||||
{
|
{
|
||||||
delete[] sfxdata;
|
if (rolloff == ROLLOFF_Log)
|
||||||
|
{
|
||||||
|
maxdist = 10000.f;
|
||||||
|
}
|
||||||
|
sample->set3DMinMaxDistance(mindist, maxdist);
|
||||||
|
sample->setUserData(sfx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return sfx->data != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// FMODSoundRenderer :: getsfx
|
// FMODSoundRenderer :: UnloadSound
|
||||||
//
|
|
||||||
// Get the sound data from the WAD and register it with sound library
|
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FMODSoundRenderer::getsfx(sfxinfo_t *sfx)
|
void FMODSoundRenderer::UnloadSound(sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
if (sfx->data != NULL)
|
||||||
|
|
||||||
// If the sound doesn't exist, replace it with the empty sound.
|
|
||||||
if (sfx->lumpnum == -1)
|
|
||||||
{
|
{
|
||||||
sfx->lumpnum = sfx_empty;
|
((FMOD::Sound *)sfx->data)->release();
|
||||||
}
|
sfx->data = NULL;
|
||||||
|
|
||||||
// See if there is another sound already initialized with this lump. If so,
|
|
||||||
// then set this one up as a link, and don't load the sound again.
|
|
||||||
for (i = 0; i < S_sfx.Size(); i++)
|
|
||||||
{
|
|
||||||
if (S_sfx[i].data && S_sfx[i].link == sfxinfo_t::NO_LINK && S_sfx[i].lumpnum == sfx->lumpnum)
|
|
||||||
{
|
|
||||||
DPrintf ("Linked to %s (%d)\n", S_sfx[i].name.GetChars(), i);
|
|
||||||
sfx->link = i;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DoLoad(&sfx->data, sfx);
|
|
||||||
// If the sound failed to load, make it the empty sound.
|
|
||||||
if (sfx->data == NULL)
|
|
||||||
{
|
|
||||||
sfx->lumpnum = sfx_empty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// FMODSoundRenderer :: GetMSLength
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
unsigned int FMODSoundRenderer::GetMSLength(sfxinfo_t *sfx)
|
||||||
|
{
|
||||||
|
if (sfx->data != NULL)
|
||||||
|
{
|
||||||
|
unsigned int length;
|
||||||
|
|
||||||
|
if (((FMOD::Sound *)sfx->data)->getLength(&length, FMOD_TIMEUNIT_MS) == FMOD_OK)
|
||||||
|
{
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; // Don't know.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// FMODSoundRenderer :: ChannelEndCallback static
|
// FMODSoundRenderer :: ChannelEndCallback static
|
||||||
|
|
|
@ -13,7 +13,7 @@ public:
|
||||||
|
|
||||||
void SetSfxVolume (float volume);
|
void SetSfxVolume (float volume);
|
||||||
void SetMusicVolume (float volume);
|
void SetMusicVolume (float volume);
|
||||||
void LoadSound (sfxinfo_t *sfx);
|
bool LoadSound (sfxinfo_t *sfx);
|
||||||
void UnloadSound (sfxinfo_t *sfx);
|
void UnloadSound (sfxinfo_t *sfx);
|
||||||
unsigned int GetMSLength(sfxinfo_t *sfx);
|
unsigned int GetMSLength(sfxinfo_t *sfx);
|
||||||
float GetOutputRate();
|
float GetOutputRate();
|
||||||
|
|
|
@ -116,8 +116,9 @@ public:
|
||||||
void SetMusicVolume (float volume)
|
void SetMusicVolume (float volume)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void LoadSound (sfxinfo_t *sfx)
|
bool LoadSound (sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
void UnloadSound (sfxinfo_t *sfx)
|
void UnloadSound (sfxinfo_t *sfx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
|
|
||||||
virtual void SetSfxVolume (float volume) = 0;
|
virtual void SetSfxVolume (float volume) = 0;
|
||||||
virtual void SetMusicVolume (float volume) = 0;
|
virtual void SetMusicVolume (float volume) = 0;
|
||||||
virtual void LoadSound (sfxinfo_t *sfx) = 0; // load a sound from disk
|
virtual bool LoadSound (sfxinfo_t *sfx) = 0; // load a sound from disk
|
||||||
virtual void UnloadSound (sfxinfo_t *sfx) = 0; // unloads a sound from memory
|
virtual void UnloadSound (sfxinfo_t *sfx) = 0; // unloads a sound from memory
|
||||||
virtual unsigned int GetMSLength(sfxinfo_t *sfx) = 0; // Gets the length of a sound at its default frequency
|
virtual unsigned int GetMSLength(sfxinfo_t *sfx) = 0; // Gets the length of a sound at its default frequency
|
||||||
virtual float GetOutputRate() = 0;
|
virtual float GetOutputRate() = 0;
|
||||||
|
|
Loading…
Reference in a new issue