summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/AOSoundStream.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2015-06-10 00:00:12 +0200
committerJules Blok <jules.blok@gmail.com>2015-06-10 00:00:12 +0200
commit7dfced21a2e5aac7195e0e1ad76468e30306766b (patch)
treebd671b639d3d911460b767caabad8fc8a759a6bf /Source/Core/AudioCommon/AOSoundStream.cpp
parentc25be031fc1031d795157d8344b87b7841145197 (diff)
parent7b0a65e295c784f9d573f2ef52d4e2a7b9bb2889 (diff)
Merge branch 'master' into stable
Diffstat (limited to 'Source/Core/AudioCommon/AOSoundStream.cpp')
-rw-r--r--Source/Core/AudioCommon/AOSoundStream.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/AOSoundStream.cpp b/Source/Core/AudioCommon/AOSoundStream.cpp
new file mode 100644
index 0000000000..ee10133ae4
--- /dev/null
+++ b/Source/Core/AudioCommon/AOSoundStream.cpp
@@ -0,0 +1,80 @@
+// Copyright 2008 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <cstring>
+
+#include "AudioCommon/AOSoundStream.h"
+#include "AudioCommon/Mixer.h"
+
+#if defined(HAVE_AO) && HAVE_AO
+
+void AOSound::SoundLoop()
+{
+ Common::SetCurrentThreadName("Audio thread - ao");
+
+ uint_32 numBytesToRender = 256;
+ ao_initialize();
+ default_driver = ao_default_driver_id();
+ format.bits = 16;
+ format.channels = 2;
+ format.rate = m_mixer->GetSampleRate();
+ format.byte_format = AO_FMT_LITTLE;
+
+ device = ao_open_live(default_driver, &format, nullptr /* no options */);
+ if (!device)
+ {
+ PanicAlertT("AudioCommon: Error opening AO device.\n");
+ ao_shutdown();
+ Stop();
+ return;
+ }
+
+ buf_size = format.bits/8 * format.channels * format.rate;
+
+ while (m_run_thread.load())
+ {
+ m_mixer->Mix(realtimeBuffer, numBytesToRender >> 2);
+
+ {
+ std::lock_guard<std::mutex> lk(soundCriticalSection);
+ ao_play(device, (char*)realtimeBuffer, numBytesToRender);
+ }
+
+ soundSyncEvent.Wait();
+ }
+}
+
+bool AOSound::Start()
+{
+ m_run_thread.store(true);
+ memset(realtimeBuffer, 0, sizeof(realtimeBuffer));
+
+ thread = std::thread(&AOSound::SoundLoop, this);
+ return true;
+}
+
+void AOSound::Update()
+{
+ soundSyncEvent.Set();
+}
+
+void AOSound::Stop()
+{
+ m_run_thread.store(false);
+ soundSyncEvent.Set();
+
+ {
+ std::lock_guard<std::mutex> lk(soundCriticalSection);
+ thread.join();
+
+ if (device)
+ ao_close(device);
+
+ ao_shutdown();
+
+ device = nullptr;
+ }
+}
+
+#endif