From c3b196541de486507f97d917058a67ea52c368dd Mon Sep 17 00:00:00 2001 From: ayuanx Date: Sun, 20 Dec 2009 13:54:14 +0000 Subject: [PATCH] Added volume control for OpenAL, also improved its performance a bit, but don't expect too much. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4712 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/AudioCommon/Src/OpenALStream.cpp | 21 ++++++++++++-------- Source/Core/AudioCommon/Src/OpenALStream.h | 12 ++++++++--- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Source/Core/AudioCommon/Src/OpenALStream.cpp b/Source/Core/AudioCommon/Src/OpenALStream.cpp index 009369757c..1b2363888d 100644 --- a/Source/Core/AudioCommon/Src/OpenALStream.cpp +++ b/Source/Core/AudioCommon/Src/OpenALStream.cpp @@ -20,6 +20,9 @@ #if defined HAVE_OPENAL && HAVE_OPENAL +// +// AyuanX: Spec says OpenAL1.1 is thread safe already +// bool OpenALStream::Start() { ALDeviceList *pDeviceList = NULL; @@ -68,8 +71,6 @@ void OpenALStream::Stop() // kick the thread if it's waiting soundSyncEvent.Set(); -// AyuanX: Spec says OpenAL1.1 is thread safe already -// soundCriticalSection.Enter(); delete thread; thread = NULL; @@ -78,6 +79,7 @@ void OpenALStream::Stop() // Clean up buffers and sources alDeleteSources(1, &uiSource); + uiSource = 0; alDeleteBuffers(OAL_NUM_BUFFERS, uiBuffers); ALCcontext *pContext = alcGetCurrentContext(); @@ -86,11 +88,18 @@ void OpenALStream::Stop() alcMakeContextCurrent(NULL); alcDestroyContext(pContext); alcCloseDevice(pDevice); -// soundCriticalSection.Leave(); soundSyncEvent.Shutdown(); } +void OpenALStream::SetVolume(int volume) +{ + fVolume = (float)volume / 100.0f; + + if (uiSource) + alSourcef(uiSource, AL_GAIN, fVolume); +} + void OpenALStream::Update() { soundSyncEvent.Set(); @@ -100,7 +109,6 @@ void OpenALStream::Clear(bool mute) { m_muted = mute; -// soundCriticalSection.Enter(); if(m_muted) { alSourceStop(uiSource); @@ -109,7 +117,6 @@ void OpenALStream::Clear(bool mute) { alSourcePlay(uiSource); } -// soundCriticalSection.Leave(); } THREAD_RETURN OpenALStream::ThreadFunc(void* args) @@ -146,14 +153,13 @@ void OpenALStream::SoundLoop() while (!threadData) { -// soundCriticalSection.Enter(); if (iBuffersProcessed == iBuffersFilled) { alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed); iBuffersFilled = 0; } int numSamples = m_mixer->GetNumSamples(); - numSamples &= ~0x400; + numSamples &= ~0x100; if (iBuffersProcessed && numSamples) { @@ -177,7 +183,6 @@ void OpenALStream::SoundLoop() if (state != AL_PLAYING) alSourcePlay(uiSource); } -// soundCriticalSection.Leave(); soundSyncEvent.Wait(); } } diff --git a/Source/Core/AudioCommon/Src/OpenALStream.h b/Source/Core/AudioCommon/Src/OpenALStream.h index 097ac30127..fbeaadba60 100644 --- a/Source/Core/AudioCommon/Src/OpenALStream.h +++ b/Source/Core/AudioCommon/Src/OpenALStream.h @@ -35,19 +35,24 @@ #endif // WIN32 // public use #define SFX_MAX_SOURCE 1 -#define OAL_NUM_BUFFERS 2 -#define OAL_BUFFER_SIZE (1024 * 8) +#define OAL_NUM_BUFFERS 8 +#define OAL_BUFFER_SIZE (512 * 4) #endif class OpenALStream: public SoundStream { #if defined HAVE_OPENAL && HAVE_OPENAL public: - OpenALStream(CMixer *mixer, void *hWnd = NULL): SoundStream(mixer) {}; + OpenALStream(CMixer *mixer, void *hWnd = NULL) + : SoundStream(mixer) + , uiSource(0) + {}; + virtual ~OpenALStream() {}; virtual bool Start(); virtual void SoundLoop(); + virtual void SetVolume(int volume); virtual void Stop(); virtual void Clear(bool mute); static bool isValid() { return true; } @@ -64,6 +69,7 @@ private: short realtimeBuffer[OAL_BUFFER_SIZE/sizeof(short)]; ALuint uiBuffers[OAL_NUM_BUFFERS]; ALuint uiSource; + ALfloat fVolume; #else public: OpenALStream(CMixer *mixer, void *hWnd = NULL): SoundStream(mixer) {}