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')
-rwxr-xr-x[-rw-r--r--]src/osd/modules/sound/xaudio2_sound.cpp62
1 files changed, 33 insertions, 29 deletions
diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp
index f4da54db2ec..66fdb1ba009 100644..100755
--- a/src/osd/modules/sound/xaudio2_sound.cpp
+++ b/src/osd/modules/sound/xaudio2_sound.cpp
@@ -33,6 +33,8 @@
#include "winutil.h"
+#include "modules/lib/osdlib.h"
+
//============================================================
// Constants
//============================================================
@@ -118,7 +120,7 @@ typedef std::unique_ptr<IXAudio2MasteringVoice, xaudio2_custom_deleter> masterin
typedef std::unique_ptr<IXAudio2SourceVoice, xaudio2_custom_deleter> src_voice_ptr;
// Typedef for pointer to XAudio2Create
-typedef lazy_loaded_function_p3<HRESULT, IXAudio2**, UINT32, XAUDIO2_PROCESSOR> xaudio2_create_ptr;
+typedef HRESULT (*xaudio2_create_ptr)(IXAudio2 **, UINT32, XAUDIO2_PROCESSOR);
//============================================================
// Helper classes
@@ -181,28 +183,27 @@ public:
class sound_xaudio2 : public osd_module, public sound_module, public IXAudio2VoiceCallback
{
private:
- const wchar_t* XAUDIO_DLLS[2] = { L"XAudio2_9.dll", L"XAudio2_8.dll" };
-
- Microsoft::WRL::ComPtr<IXAudio2> m_xAudio2;
- mastering_voice_ptr m_masterVoice;
- src_voice_ptr m_sourceVoice;
- DWORD m_sample_bytes;
- std::unique_ptr<BYTE[]> m_buffer;
- DWORD m_buffer_size;
- DWORD m_buffer_count;
- DWORD m_writepos;
- std::mutex m_buffer_lock;
- HANDLE m_hEventBufferCompleted;
- HANDLE m_hEventDataAvailable;
- HANDLE m_hEventExiting;
- std::thread m_audioThread;
- std::queue<xaudio2_buffer> m_queue;
- std::unique_ptr<bufferpool> m_buffer_pool;
- UINT32 m_overflows;
- UINT32 m_underflows;
- BOOL m_in_underflow;
- xaudio2_create_ptr XAudio2Create;
- BOOL m_initialized;
+ Microsoft::WRL::ComPtr<IXAudio2> m_xAudio2;
+ mastering_voice_ptr m_masterVoice;
+ src_voice_ptr m_sourceVoice;
+ DWORD m_sample_bytes;
+ std::unique_ptr<BYTE[]> m_buffer;
+ DWORD m_buffer_size;
+ DWORD m_buffer_count;
+ DWORD m_writepos;
+ std::mutex m_buffer_lock;
+ HANDLE m_hEventBufferCompleted;
+ HANDLE m_hEventDataAvailable;
+ HANDLE m_hEventExiting;
+ std::thread m_audioThread;
+ std::queue<xaudio2_buffer> m_queue;
+ std::unique_ptr<bufferpool> m_buffer_pool;
+ UINT32 m_overflows;
+ UINT32 m_underflows;
+ BOOL m_in_underflow;
+ osd::dynamic_module::ptr m_xaudio_dll;
+ xaudio2_create_ptr XAudio2Create;
+ BOOL m_initialized;
public:
sound_xaudio2() :
@@ -223,7 +224,6 @@ public:
m_overflows(0),
m_underflows(0),
m_in_underflow(FALSE),
- XAudio2Create("XAudio2Create", XAUDIO_DLLS, ARRAY_LENGTH(XAUDIO_DLLS)),
m_initialized(FALSE)
{
}
@@ -261,8 +261,13 @@ private:
bool sound_xaudio2::probe()
{
- int status = XAudio2Create.initialize();
- return status == 0;
+ m_xaudio_dll = osd::dynamic_module::open({ "XAudio2_9.dll", "XAudio2_8.dll" });
+ if (m_xaudio_dll == nullptr)
+ return false;
+
+ XAudio2Create = m_xaudio_dll->bind<xaudio2_create_ptr>("XAudio2Create");
+
+ return (XAudio2Create ? true : false);
}
//============================================================
@@ -276,10 +281,9 @@ int sound_xaudio2::init(osd_options const &options)
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
// Make sure our XAudio2Create entrypoint is bound
- int status = XAudio2Create.initialize();
- if (status != 0)
+ if (!XAudio2Create)
{
- osd_printf_error("Could not find XAudio2 library\n");
+ osd_printf_error("Could not find XAudio2. Please try to reinstall DirectX runtime package.\n");
return 1;
}