summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/sound/xaudio2_sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/sound/xaudio2_sound.cpp')
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp40
1 files changed, 35 insertions, 5 deletions
diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp
index 9dc3d0461be..7df854c0364 100644
--- a/src/osd/modules/sound/xaudio2_sound.cpp
+++ b/src/osd/modules/sound/xaudio2_sound.cpp
@@ -14,7 +14,6 @@
// standard windows headers
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
-#include <mutex>
#pragma warning( push )
#pragma warning( disable: 4068 )
@@ -125,12 +124,21 @@ public:
obj->DestroyVoice();
}
}
+
+ void operator()(osd_lock* obj) const
+ {
+ if (obj != nullptr)
+ {
+ osd_lock_free(obj);
+ }
+ }
};
// Typedefs for smart pointers used with customer deleters
typedef std::unique_ptr<IXAudio2, xaudio2_custom_deleter> xaudio2_ptr;
typedef std::unique_ptr<IXAudio2MasteringVoice, xaudio2_custom_deleter> mastering_voice_ptr;
typedef std::unique_ptr<IXAudio2SourceVoice, xaudio2_custom_deleter> src_voice_ptr;
+typedef std::unique_ptr<osd_lock, xaudio2_custom_deleter> osd_lock_ptr;
// Typedef for pointer to XAudio2Create
typedef HRESULT(__stdcall* PFN_XAUDIO2CREATE)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR);
@@ -139,6 +147,27 @@ typedef HRESULT(__stdcall* PFN_XAUDIO2CREATE)(IXAudio2**, UINT32, XAUDIO2_PROCES
// Helper classes
//============================================================
+// Helper for locking within a particular scope without having to manually release
+class osd_scoped_lock
+{
+private:
+ osd_lock * m_lock;
+public:
+ osd_scoped_lock(osd_lock* lock)
+ {
+ m_lock = lock;
+ osd_lock_acquire(m_lock);
+ }
+
+ ~osd_scoped_lock()
+ {
+ if (m_lock != nullptr)
+ {
+ osd_lock_release(m_lock);
+ }
+ }
+};
+
// Provides a pool of buffers
class bufferpool
{
@@ -204,7 +233,7 @@ private:
DWORD m_buffer_size;
DWORD m_buffer_count;
DWORD m_writepos;
- std::mutex m_buffer_lock;
+ osd_lock_ptr m_buffer_lock;
HANDLE m_hEventBufferCompleted;
HANDLE m_hEventDataAvailable;
HANDLE m_hEventExiting;
@@ -229,6 +258,7 @@ public:
m_buffer_size(0),
m_buffer_count(0),
m_writepos(0),
+ m_buffer_lock(osd_lock_alloc()),
m_hEventBufferCompleted(NULL),
m_hEventDataAvailable(NULL),
m_hEventExiting(NULL),
@@ -359,7 +389,7 @@ void sound_xaudio2::update_audio_stream(
UINT32 const bytes_this_frame = samples_this_frame * m_sample_bytes;
- std::lock_guard<std::mutex> lock(m_buffer_lock);
+ osd_scoped_lock scope_lock(m_buffer_lock.get());
UINT32 bytes_left = bytes_this_frame;
@@ -416,7 +446,7 @@ void sound_xaudio2::OnBufferEnd(void *pBufferContext)
BYTE* completed_buffer = (BYTE*)pBufferContext;
if (completed_buffer != nullptr)
{
- std::lock_guard<std::mutex> lock(m_buffer_lock);
+ auto scoped_lock = osd_scoped_lock(m_buffer_lock.get());
m_buffer_pool->return_to_pool(completed_buffer);
}
@@ -595,7 +625,7 @@ void sound_xaudio2::submit_needed()
if (state.BuffersQueued >= 1)
return;
- std::lock_guard<std::mutex> lock(m_buffer_lock);
+ osd_scoped_lock lock_scope(m_buffer_lock.get());
// Roll the buffer
roll_buffer();