summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/AOSoundStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/AudioCommon/AOSoundStream.cpp')
-rw-r--r--Source/Core/AudioCommon/AOSoundStream.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/AOSoundStream.cpp b/Source/Core/AudioCommon/AOSoundStream.cpp
new file mode 100644
index 0000000000..5a657a5fd8
--- /dev/null
+++ b/Source/Core/AudioCommon/AOSoundStream.cpp
@@ -0,0 +1,84 @@
+// Copyright 2013 Dolphin Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include <functional>
+#include <string.h>
+
+#include "AOSoundStream.h"
+#include "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, NULL /* 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 (!threadData)
+ {
+ m_mixer->Mix(realtimeBuffer, numBytesToRender >> 2);
+
+ {
+ std::lock_guard<std::mutex> lk(soundCriticalSection);
+ ao_play(device, (char*)realtimeBuffer, numBytesToRender);
+ }
+
+ soundSyncEvent.Wait();
+ }
+}
+
+bool AOSound::Start()
+{
+ memset(realtimeBuffer, 0, sizeof(realtimeBuffer));
+
+ thread = std::thread(std::mem_fun(&AOSound::SoundLoop), this);
+ return true;
+}
+
+void AOSound::Update()
+{
+ soundSyncEvent.Set();
+}
+
+void AOSound::Stop()
+{
+ threadData = 1;
+ soundSyncEvent.Set();
+
+ {
+ std::lock_guard<std::mutex> lk(soundCriticalSection);
+ thread.join();
+
+ if (device)
+ ao_close(device);
+
+ ao_shutdown();
+
+ device = NULL;
+ }
+}
+
+AOSound::~AOSound()
+{
+}
+
+#endif