diff options
author | Fire-Head <Fire-Head@users.noreply.github.com> | 2020-05-07 09:13:59 +0200 |
---|---|---|
committer | Fire-Head <Fire-Head@users.noreply.github.com> | 2020-05-07 09:13:59 +0200 |
commit | 875c77e8b15c5014ee356c8413273c509daa5bda (patch) | |
tree | 2152a9e8c00410abe8556ed6c4cd3348614c1199 /src/audio | |
parent | rem mpg123_pre header (diff) | |
download | re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar.gz re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar.bz2 re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar.lz re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar.xz re3-875c77e8b15c5014ee356c8413273c509daa5bda.tar.zst re3-875c77e8b15c5014ee356c8413273c509daa5bda.zip |
Diffstat (limited to 'src/audio')
-rw-r--r-- | src/audio/sampman_oal.cpp | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index ccddaa73..bbaeae4c 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -88,6 +88,32 @@ struct { ALuint buffer; ALuint timer; + + bool IsEmpty() { return timer == 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); + timer = 0; + } + void Update() + { + if ( !(timer > 0) ) return; + timer -= ALuint(CTimer::GetTimeStepInMilliseconds()); + if ( timer > 0 ) return; + if ( buffer != 0 && alIsBuffer(buffer) ) + { + alDeleteBuffers(1, &buffer); + timer = ( alGetError() == AL_NO_ERROR ) ? 0 : 10000; + } + } }ALBuffers[SAMPLEBANK_MAX]; uint32 nNumMP3s; @@ -222,10 +248,7 @@ release_existing() for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ ) { - if ( ALBuffers[i].buffer != 0 && alIsBuffer(ALBuffers[i].buffer) ) - alDeleteBuffers(1, &ALBuffers[i].buffer); - - ALBuffers[i].timer = 0; + ALBuffers[i].Term(); } if ( ALContext ) @@ -309,8 +332,7 @@ set_new_provider(int index) for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ ) { - ALBuffers[i].buffer = 0; - ALBuffers[i].timer = 0; + ALBuffers[i].Init(); } alGenBuffers(MAX_PEDSFX, pedBuffers); @@ -640,23 +662,7 @@ cSampleManager::UpdateSoundBuffers(void) { for ( int32 i = 0; i < SAMPLEBANK_MAX; i++ ) { - if ( ALBuffers[i].timer > 0 ) - { - ALBuffers[i].timer -= ALuint(CTimer::GetTimeStepInMilliseconds()); - - if ( ALBuffers[i].timer <= 0 ) - { - if ( ALBuffers[i].buffer != 0 && alIsBuffer(ALBuffers[i].buffer) ) - { - alDeleteBuffers(1, &ALBuffers[i].buffer); - - if ( alGetError() == AL_NO_ERROR ) - ALBuffers[i].timer = 0; - else - ALBuffers[i].timer = 10000; - } - } - } + ALBuffers[i].Update(); } } @@ -981,15 +987,14 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank) int32 addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset; - if ( ALBuffers[nSfx].timer == 0 ) + 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].buffer = buf; - ALBuffers[nSfx].timer = 10000; + ALBuffers[nSfx].Set(buf); } + ALBuffers[nSfx].Wait(); buffer = ALBuffers[nSfx].buffer; } |