add fake sound support

This commit is contained in:
Glenn Maynard
2002-12-21 02:19:37 +00:00
parent 7a1bc59cb2
commit 2c0b7865d4
2 changed files with 62 additions and 2 deletions
+53
View File
@@ -47,10 +47,24 @@ void RageSoundManager::StopMixing(RageSound *snd)
sounds_to_delete.insert(snd);
owned_sounds.erase(snd);
}
map<RageSound *, FakeSound>::iterator fake =
fake_sounds.find(const_cast<RageSound *>(snd));
if(fake != fake_sounds.end())
fake_sounds.erase(fake);
}
int RageSoundManager::GetPosition(const RageSound *snd) const
{
map<RageSound *, FakeSound>::const_iterator fake =
fake_sounds.find(const_cast<RageSound *>(snd));
if(fake != fake_sounds.end())
{
float time_since = RageTimer::GetTimeSinceStart() - fake->second.begin;
return int(time_since * 44100); // XXX
}
return driver->GetPosition(snd);
}
@@ -67,6 +81,45 @@ void RageSoundManager::Update(float delta)
(*i)->Update(delta);
driver->Update(delta);
/* We keep a list of "fake" sound effects. These are sound effects that
* have been requested to play, but the driver couldn't play them; usually
* because it's run out of sound channels. Pretend we're playing them,
* since this should be uncommon. */
{
char buf[1024*16];
map<RageSound *, FakeSound>::iterator j = fake_sounds.begin(),
next = j;
while(j != fake_sounds.end())
{
next++;
RageSound *s = j->first;
FakeSound &fake = j->second;
int bytes = min(unsigned(delta * 44100*4), sizeof(buf));
int now = int(RageTimer::GetTimeSinceStart() - fake.begin) * 44100;
int got = s->GetPCM(buf, bytes, now);
if(got < bytes)
s->SoundStopped();
j = next;
}
}
}
void RageSoundManager::AddFakeSound(RageSound *snd)
{
map<RageSound *, FakeSound>::const_iterator fake =
fake_sounds.find(const_cast<RageSound *>(snd));
ASSERT(fake == fake_sounds.end());
FakeSound newfake;
newfake.begin = RageTimer::GetTimeSinceStart();
newfake.samples_read = 0;
fake_sounds[snd] = newfake;
}
float RageSoundManager::GetPlayLatency() const
+9 -2
View File
@@ -2,6 +2,7 @@
#define RAGE_SOUND_MANAGER_H
#include <set>
#include <map>
#include "arch/Sound/RageSoundDriver.h"
#include "RageThreads.h"
@@ -20,6 +21,12 @@ class RageSoundManager
/* Set of sounds that are finished and should be deleted. */
set<RageSound *> sounds_to_delete;
struct FakeSound {
float begin;
int samples_read;
};
map<RageSound *, FakeSound> fake_sounds;
RageSoundDriver *driver;
public:
@@ -30,9 +37,9 @@ public:
void Update(float delta);
void StartMixing(RageSound *snd); /* used by RageSound */
void StopMixing(RageSound *snd); /* used by RageSound */
void StopMixing(RageSound *snd); /* used by RageSound */
int GetPosition(const RageSound *snd) const; /* used by RageSound */
void AddFakeSound(RageSound *snd); /* used by drivers */
float GetPlayLatency() const;
void PlayOnce( CString sPath );