diff options
| author | ayuanx <ayuanx@gmail.com> | 2009-12-23 15:34:14 +0000 |
|---|---|---|
| committer | ayuanx <ayuanx@gmail.com> | 2009-12-23 15:34:14 +0000 |
| commit | 9eea60ca69afac82abb60fc1b1a0c6962f522ced (patch) | |
| tree | 98d0e1d46c0d337c24218fb6e1b4e8048443c397 /Source/Core/AudioCommon/Src/OpenALStream.cpp | |
| parent | 0d0a7c515fe60e4899f4669fb52a115cfd1f7431 (diff) | |
Sound System Rework: Phase 2
. Performance boost
(Completely non-blocking between Sound thread and CPU thread, in the meantime keeping them thread safe)
. Both 32KHz & 48KHz sound can be handled properly now
(But up-sampling is still not implemented, and I don't think any game requires it.)
. Strategy adjustment
When your PC is *NOT* capable to run the game at 100%:
>> DSound Could yield more fluent sound than OpenAL sometimes, but you will lose the sync between video & audio (since audio is played before video to guarantee fluency)
>> OpenAL Ensures video & audio are always sync'ed, but sound could be intermittent(to let slow video catch up)
. Changed default frame limit to: Auto
(Somehow this can dramatically decrease the chance of wiimote desync in game NSMB)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4724 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/AudioCommon/Src/OpenALStream.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Src/OpenALStream.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/Source/Core/AudioCommon/Src/OpenALStream.cpp b/Source/Core/AudioCommon/Src/OpenALStream.cpp index 1b2363888d..7945f44d86 100644 --- a/Source/Core/AudioCommon/Src/OpenALStream.cpp +++ b/Source/Core/AudioCommon/Src/OpenALStream.cpp @@ -138,12 +138,13 @@ void OpenALStream::SoundLoop() // Generate a Source to playback the Buffers alGenSources(1, &uiSource); - memset(realtimeBuffer, 0, OAL_BUFFER_SIZE); + // Short Silence + memset(realtimeBuffer, 0, OAL_MAX_SAMPLES * 4); for (int i = 0; i < OAL_NUM_BUFFERS; i++) - alBufferData(uiBuffers[i], AL_FORMAT_STEREO16, realtimeBuffer, OAL_BUFFER_SIZE, ulFrequency); - + alBufferData(uiBuffers[i], AL_FORMAT_STEREO16, realtimeBuffer, OAL_MAX_SAMPLES, ulFrequency); alSourceQueueBuffers(uiSource, OAL_NUM_BUFFERS, uiBuffers); alSourcePlay(uiSource); + err = alGetError(); // TODO: Error handling @@ -158,12 +159,12 @@ void OpenALStream::SoundLoop() alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed); iBuffersFilled = 0; } - int numSamples = m_mixer->GetNumSamples(); - numSamples &= ~0x100; - if (iBuffersProcessed && numSamples) + unsigned int numSamples = m_mixer->GetNumSamples(); + + if (iBuffersProcessed && (numSamples >= OAL_THRESHOLD)) { - numSamples = (numSamples > OAL_BUFFER_SIZE / 4) ? OAL_BUFFER_SIZE / 4 : numSamples; + numSamples = (numSamples > OAL_MAX_SAMPLES) ? OAL_MAX_SAMPLES : numSamples; // Remove the Buffer from the Queue. (uiBuffer contains the Buffer ID for the unqueued Buffer) if (iBuffersFilled == 0) alSourceUnqueueBuffers(uiSource, iBuffersProcessed, uiBufferTemp); @@ -176,11 +177,11 @@ void OpenALStream::SoundLoop() if (iBuffersFilled == OAL_NUM_BUFFERS) alSourcePlay(uiSource); } - else + else if (numSamples >= OAL_THRESHOLD) { ALint state = 0; alGetSourcei(uiSource, AL_SOURCE_STATE, &state); - if (state != AL_PLAYING) + if (state == AL_STOPPED) alSourcePlay(uiSource); } soundSyncEvent.Wait(); |
