OpenAL channels now use their own sound buffers
This commit is contained in:
@@ -98,58 +98,12 @@ int32 nPedSlotSfx [MAX_PEDSFX];
|
||||
int32 nPedSlotSfxAddr[MAX_PEDSFX];
|
||||
uint8 nCurrentPedSlot;
|
||||
|
||||
ALuint pedBuffers[MAX_PEDSFX];
|
||||
|
||||
CChannel aChannel[MAXCHANNELS+MAX2DCHANNELS];
|
||||
uint8 nChannelVolume[MAXCHANNELS+MAX2DCHANNELS];
|
||||
|
||||
uint32 nStreamLength[TOTAL_STREAMED_SOUNDS];
|
||||
ALuint ALStreamSources[MAX_STREAMS];
|
||||
ALuint ALStreamBuffers[MAX_STREAMS][NUM_STREAMBUFFERS];
|
||||
struct
|
||||
{
|
||||
ALuint buffer;
|
||||
ALint timer;
|
||||
|
||||
bool IsEmpty() { return buffer == 0; }
|
||||
void Set(ALuint buf) { buffer = buf; }
|
||||
void Wait() { timer = 10000; }
|
||||
void Init()
|
||||
{
|
||||
buffer = 0;
|
||||
timer = 0;
|
||||
}
|
||||
void Term()
|
||||
{
|
||||
if (buffer != 0 && alIsBuffer(buffer)) {
|
||||
alDeleteBuffers(1, &buffer);
|
||||
assert(alGetError() == AL_NO_ERROR);
|
||||
}
|
||||
timer = 0;
|
||||
buffer = 0;
|
||||
}
|
||||
void Update()
|
||||
{
|
||||
if ( !(timer > 0) ) return;
|
||||
timer -= ALint(CTimer::GetTimeStepInMilliseconds());
|
||||
if ( timer > 0 ) return;
|
||||
timer = 0;
|
||||
if ( buffer != 0 )
|
||||
{
|
||||
if (!alIsBuffer(buffer))
|
||||
{
|
||||
buffer = 0;
|
||||
return;
|
||||
}
|
||||
alDeleteBuffers(1, &buffer);
|
||||
ALenum error = alGetError();
|
||||
if (error != AL_NO_ERROR)
|
||||
timer = 10000;
|
||||
else
|
||||
buffer = 0;
|
||||
}
|
||||
}
|
||||
}ALBuffers[SAMPLEBANK_MAX];
|
||||
|
||||
struct tMP3Entry
|
||||
{
|
||||
@@ -295,12 +249,7 @@ release_existing()
|
||||
alDeleteBuffers(NUM_STREAMBUFFERS, ALStreamBuffers[i]);
|
||||
}
|
||||
|
||||
alDeleteBuffers(MAX_PEDSFX, pedBuffers);
|
||||
|
||||
for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ )
|
||||
{
|
||||
ALBuffers[i].Term();
|
||||
}
|
||||
CChannel::DestroyChannels();
|
||||
|
||||
if ( ALContext )
|
||||
{
|
||||
@@ -381,13 +330,6 @@ set_new_provider(int index)
|
||||
stream->ProviderInit();
|
||||
}
|
||||
|
||||
for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ )
|
||||
{
|
||||
ALBuffers[i].Init();
|
||||
}
|
||||
|
||||
alGenBuffers(MAX_PEDSFX, pedBuffers);
|
||||
|
||||
usingEAX = 0;
|
||||
usingEAX3 = 0;
|
||||
_usingEFX = false;
|
||||
@@ -419,10 +361,12 @@ set_new_provider(int index)
|
||||
}
|
||||
|
||||
//SampleManager.SetSpeakerConfig(speaker_type);
|
||||
|
||||
|
||||
CChannel::InitChannels();
|
||||
|
||||
for ( int32 i = 0; i < MAXCHANNELS; i++ )
|
||||
aChannel[i].Init();
|
||||
aChannel[CHANNEL2D].Init(true);
|
||||
aChannel[i].Init(i);
|
||||
aChannel[CHANNEL2D].Init(CHANNEL2D, true);
|
||||
|
||||
if ( IsFXSupported() )
|
||||
{
|
||||
@@ -1166,7 +1110,7 @@ cSampleManager::Terminate(void)
|
||||
_DeleteMP3Entries();
|
||||
|
||||
CStream::Terminate();
|
||||
|
||||
|
||||
if ( nSampleBankMemoryStartAddress[SFX_BANK_0] != 0 )
|
||||
{
|
||||
free((void *)nSampleBankMemoryStartAddress[SFX_BANK_0]);
|
||||
@@ -1182,15 +1126,6 @@ cSampleManager::Terminate(void)
|
||||
_bSampmanInitialised = false;
|
||||
}
|
||||
|
||||
void
|
||||
cSampleManager::UpdateSoundBuffers(void)
|
||||
{
|
||||
for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ )
|
||||
{
|
||||
ALBuffers[i].Update();
|
||||
}
|
||||
}
|
||||
|
||||
bool cSampleManager::CheckForAnAudioFileOnCD(void)
|
||||
{
|
||||
return true;
|
||||
@@ -1399,13 +1334,7 @@ cSampleManager::LoadPedComment(uint32 nComment)
|
||||
|
||||
#endif
|
||||
nPedSlotSfx[nCurrentPedSlot] = nComment;
|
||||
|
||||
alBufferData(pedBuffers[nCurrentPedSlot],
|
||||
AL_FORMAT_MONO16,
|
||||
(void *)(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE*nCurrentPedSlot),
|
||||
m_aSamples[nComment].nSize,
|
||||
m_aSamples[nComment].nFrequency);
|
||||
|
||||
|
||||
if ( ++nCurrentPedSlot >= MAX_PEDSFX )
|
||||
nCurrentPedSlot = 0;
|
||||
|
||||
@@ -1541,25 +1470,14 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
{
|
||||
ASSERT( nChannel < MAXCHANNELS+MAX2DCHANNELS );
|
||||
|
||||
ALuint buffer;
|
||||
uintptr addr;
|
||||
|
||||
if ( nSfx < SAMPLEBANK_MAX )
|
||||
{
|
||||
if ( !IsSampleBankLoaded(nBank) )
|
||||
return false;
|
||||
|
||||
uintptr addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
|
||||
|
||||
if ( ALBuffers[nSfx].IsEmpty() )
|
||||
{
|
||||
ALuint buf;
|
||||
alGenBuffers(1, &buf);
|
||||
alBufferData(buf, AL_FORMAT_MONO16, (void *)addr, m_aSamples[nSfx].nSize, m_aSamples[nSfx].nFrequency);
|
||||
ALBuffers[nSfx].Set(buf);
|
||||
}
|
||||
ALBuffers[nSfx].Wait();
|
||||
|
||||
buffer = ALBuffers[nSfx].buffer;
|
||||
addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1567,14 +1485,7 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
return false;
|
||||
|
||||
int32 slot = _GetPedCommentSlot(nSfx);
|
||||
|
||||
buffer = pedBuffers[slot];
|
||||
}
|
||||
|
||||
if ( buffer == 0 )
|
||||
{
|
||||
TRACE("No buffer to play id %d", nSfx);
|
||||
return false;
|
||||
addr = (nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE * slot);
|
||||
}
|
||||
|
||||
if ( GetChannelUsedFlag(nChannel) )
|
||||
@@ -1586,10 +1497,8 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
|
||||
aChannel[nChannel].Reset();
|
||||
if ( aChannel[nChannel].HasSource() )
|
||||
{
|
||||
aChannel[nChannel].SetSampleID (nSfx);
|
||||
aChannel[nChannel].SetFreq (m_aSamples[nSfx].nFrequency);
|
||||
aChannel[nChannel].SetSampleData ((void*)addr, m_aSamples[nSfx].nSize, m_aSamples[nSfx].nFrequency);
|
||||
aChannel[nChannel].SetLoopPoints (0, -1);
|
||||
aChannel[nChannel].SetBuffer (buffer);
|
||||
aChannel[nChannel].SetPitch (1.0f);
|
||||
return true;
|
||||
}
|
||||
@@ -2040,8 +1949,6 @@ cSampleManager::Service(void)
|
||||
if ( stream )
|
||||
stream->Update();
|
||||
}
|
||||
|
||||
UpdateSoundBuffers();
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
Reference in New Issue
Block a user