Implemented correct audio timing.

Fixes issue 5493.
This commit is contained in:
skidau 2013-01-07 15:37:08 +11:00
parent 6df1dacca8
commit c8c78e0aa9
2 changed files with 13 additions and 9 deletions

View File

@ -19,6 +19,8 @@
#include "aldlist.h"
#include "OpenALStream.h"
#include "../../Core/Src/HW/SystemTimers.h"
#include "../../Core/Src/HW/AudioInterface.h"
#if defined HAVE_OPENAL && HAVE_OPENAL
@ -158,9 +160,16 @@ void OpenALStream::SoundLoop()
iBuffersFilled = 0;
}
unsigned int numSamples = m_mixer->GetNumSamples();
// num_samples_to_render in this update - depends on SystemTimers::AUDIO_DMA_PERIOD.
const u32 stereo_16_bit_size = 4;
const u32 dma_length = 32;
const u64 audio_dma_period = SystemTimers::GetTicksPerSecond() / (AudioInterface::GetAIDSampleRate() * stereo_16_bit_size / dma_length);
const u64 ais_samples_per_second = 48000 * stereo_16_bit_size;
const u64 num_samples_to_render = (audio_dma_period * ais_samples_per_second) / SystemTimers::GetTicksPerSecond();
if (iBuffersProcessed && (numSamples >= OAL_THRESHOLD))
unsigned int numSamples = (unsigned int)num_samples_to_render;
if (iBuffersProcessed)
{
numSamples = (numSamples > OAL_MAX_SAMPLES) ? OAL_MAX_SAMPLES : numSamples;
// Remove the Buffer from the Queue. (uiBuffer contains the Buffer ID for the unqueued Buffer)
@ -175,15 +184,11 @@ void OpenALStream::SoundLoop()
if (iBuffersFilled == OAL_NUM_BUFFERS)
alSourcePlay(uiSource);
}
else if (numSamples >= OAL_THRESHOLD)
else
{
ALint state = 0;
alGetSourcei(uiSource, AL_SOURCE_STATE, &state);
if (state == AL_STOPPED)
alSourcePlay(uiSource);
}
soundSyncEvent.Wait();
}
}
}
#endif //HAVE_OPENAL

View File

@ -38,7 +38,6 @@
#define SFX_MAX_SOURCE 1
#define OAL_NUM_BUFFERS 16
#define OAL_MAX_SAMPLES 512 // AyuanX: Don't make it too large, as larger buffer means longer delay
#define OAL_THRESHOLD 128 // Some games are quite sensitive to delay
#endif
class OpenALStream: public SoundStream