diff options
Diffstat (limited to 'src/osd/modules/sound/xaudio2_sound.cpp')
-rw-r--r-- | src/osd/modules/sound/xaudio2_sound.cpp | 40 |
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(); |