summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorhyperiris <hyperiris@gmail.com>2009-04-04 03:58:16 +0000
committerhyperiris <hyperiris@gmail.com>2009-04-04 03:58:16 +0000
commit36143f98b782fea7b877affcf48e845f9cd10315 (patch)
treebb94eb81b0f915cf7f871cc9f4caa58d9d376220 /Source/Core
parent5d72a992bf1e2fae307213a5954302cc90fd97c8 (diff)
OpenAL: YES! The first version of working OpenAL Backend!
I've only test in Ikaruga and Metroid Prime, at least they have sound. Performance is ugly, :<, still need more work on it. To enable oal in Dolphin, uncomment Source/Core/Common/Src/Common.h: //#define HAVE_OPENAL 1 git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2865 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/AudioCommon/Src/OpenALStream.cpp57
-rw-r--r--Source/Core/AudioCommon/Src/OpenALStream.h3
2 files changed, 55 insertions, 5 deletions
diff --git a/Source/Core/AudioCommon/Src/OpenALStream.cpp b/Source/Core/AudioCommon/Src/OpenALStream.cpp
index 39cf4d25ea..b0499f4ae0 100644
--- a/Source/Core/AudioCommon/Src/OpenALStream.cpp
+++ b/Source/Core/AudioCommon/Src/OpenALStream.cpp
@@ -21,6 +21,7 @@
#if defined HAVE_OPENAL && HAVE_OPENAL
#define AUDIO_NUMBUFFERS (4)
+//#define AUDIO_SERVICE_UPDATE_PERIOD (20)
bool OpenALStream::Start()
{
@@ -96,16 +97,62 @@ THREAD_RETURN OpenALStream::ThreadFunc(void* args)
void OpenALStream::SoundLoop()
{
- while (!threadData) {
- soundCriticalSection.Enter();
+ ALuint uiBuffers[AUDIO_NUMBUFFERS] = {0};
+ ALuint uiSource = 0;
+ ALenum err;
+ u32 ulFrequency = m_mixer->GetSampleRate();
+ // Generate some AL Buffers for streaming
+ alGenBuffers(AUDIO_NUMBUFFERS, (ALuint *)uiBuffers);
+ // Generate a Source to playback the Buffers
+ alGenSources(1, &uiSource);
+
+ memset(realtimeBuffer, 0, OAL_BUFFER_SIZE * sizeof(short));
+//*
+ for (int iLoop = 0; iLoop < AUDIO_NUMBUFFERS; iLoop++)
+ {
+ // pay load fake data
+ alBufferData(uiBuffers[iLoop], AL_FORMAT_STEREO16, realtimeBuffer, 1024, ulFrequency);
+ alSourceQueueBuffers(uiSource, 1, &uiBuffers[iLoop]);
+ }
+//*/
+ alSourcePlay(uiSource);
+ err = alGetError();
+
+ while (!threadData)
+ {
+ ALint iBuffersProcessed = 0;
+ alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed);
+
+ if (iBuffersProcessed)
+ {
+ // Remove the Buffer from the Queue. (uiBuffer contains the Buffer ID for the unqueued Buffer)
+ ALuint uiTempBuffer = 0;
+ alSourceUnqueueBuffers(uiSource, 1, &uiTempBuffer);
- // Add sound playing here
- // m_mixer->Mix(realtimeBuffer, numBytesToRender >> 2);
- soundCriticalSection.Leave();
+ soundCriticalSection.Enter();
+ int numBytesToRender = 32768; //ya, this is a hack, we need real data count
+ m_mixer->Mix(realtimeBuffer, numBytesToRender >> 2);
+ soundCriticalSection.Leave();
+ unsigned long ulBytesWritten = 0;
+ //if (ulBytesWritten)
+ {
+ //alBufferData(uiTempBuffer, ulFormat, pDecodeBuffer, ulBytesWritten, ulFrequency);
+ alBufferData(uiTempBuffer, AL_FORMAT_STEREO16, realtimeBuffer, numBytesToRender, ulFrequency);
+ alSourceQueueBuffers(uiSource, 1, &uiTempBuffer);
+ }
+ }
if (!threadData)
soundSyncEvent.Wait();
}
+ alSourceStop(uiSource);
+ alSourcei(uiSource, AL_BUFFER, 0);
+
+ // Clean up buffers and sources
+ alDeleteSources(1, &uiSource);
+ alDeleteBuffers(AUDIO_NUMBUFFERS, (const ALuint *)uiBuffers);
+
}
#endif //HAVE_OPENAL
+
diff --git a/Source/Core/AudioCommon/Src/OpenALStream.h b/Source/Core/AudioCommon/Src/OpenALStream.h
index f773ec53b9..f5e6659124 100644
--- a/Source/Core/AudioCommon/Src/OpenALStream.h
+++ b/Source/Core/AudioCommon/Src/OpenALStream.h
@@ -33,6 +33,7 @@
#endif // WIN32
// public use
#define SFX_MAX_SOURCE 1
+#define OAL_BUFFER_SIZE 1024*1024
#endif
@@ -56,6 +57,8 @@ private:
Common::Thread *thread;
Common::CriticalSection soundCriticalSection;
Common::Event soundSyncEvent;
+
+ short realtimeBuffer[OAL_BUFFER_SIZE];
#else
public:
OpenALStream(CMixer *mixer, void *hWnd = NULL): SoundStream(mixer) {}