summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/OpenSLESStream.cpp
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2014-10-18 08:32:14 -0500
committerRyan Houdek <Sonicadvance1@gmail.com>2014-10-18 08:32:14 -0500
commit73512ad38f62e530d73737740ae1d94b52b8b9c4 (patch)
treeeeaa346cdb01ed99d4d9fb5d31d8b5822eb5dfdb /Source/Core/AudioCommon/OpenSLESStream.cpp
parent742f9c6b14348b7279cb6b666a342fb2fcf4792c (diff)
Fix a race condition in our OpenSL ES audio backend.
After calling enqueue the callback would fire before we had assigned g_mixer a value. This would cause a fun crash to happen.
Diffstat (limited to 'Source/Core/AudioCommon/OpenSLESStream.cpp')
-rw-r--r--Source/Core/AudioCommon/OpenSLESStream.cpp12
1 files changed, 4 insertions, 8 deletions
diff --git a/Source/Core/AudioCommon/OpenSLESStream.cpp b/Source/Core/AudioCommon/OpenSLESStream.cpp
index afbaa00cdd..e4e11652e4 100644
--- a/Source/Core/AudioCommon/OpenSLESStream.cpp
+++ b/Source/Core/AudioCommon/OpenSLESStream.cpp
@@ -45,7 +45,6 @@ static void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
// which for this code example would indicate a programming error
_assert_msg_(AUDIO, SL_RESULT_SUCCESS == result, "Couldn't enqueue audio stream.");
-
curBuffer ^= 1; // Switch buffer
// Render to the fresh buffer
g_mixer->Mix(reinterpret_cast<short *>(buffer[curBuffer]), BUFFER_SIZE_IN_SAMPLES);
@@ -101,17 +100,14 @@ bool OpenSLESStream::Start()
result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);
assert(SL_RESULT_SUCCESS == result);
- // Render and enqueue a first buffer. (or should we just play the buffer empty?)
- curBuffer = 0;
+ // Render and enqueue a first buffer.
+ curBuffer ^= 1;
+ g_mixer = m_mixer;
- result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, buffer[curBuffer], sizeof(buffer[curBuffer]));
+ result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, buffer[0], sizeof(buffer[0]));
if (SL_RESULT_SUCCESS != result)
- {
return false;
- }
- curBuffer ^= 1;
- g_mixer = m_mixer;
return true;
}