diff options
| author | hyperiris <hyperiris@gmail.com> | 2009-04-04 03:58:16 +0000 |
|---|---|---|
| committer | hyperiris <hyperiris@gmail.com> | 2009-04-04 03:58:16 +0000 |
| commit | 36143f98b782fea7b877affcf48e845f9cd10315 (patch) | |
| tree | bb94eb81b0f915cf7f871cc9f4caa58d9d376220 /Source/Core | |
| parent | 5d72a992bf1e2fae307213a5954302cc90fd97c8 (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.cpp | 57 | ||||
| -rw-r--r-- | Source/Core/AudioCommon/Src/OpenALStream.h | 3 |
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) {}
|
