XAudio2 code cleanup, plus switch header to wine version.

This commit is contained in:
Brad Hughes 2016-03-05 09:47:10 -05:00
parent 22f8848c25
commit d52ed107a5
6 changed files with 7717 additions and 1273 deletions

File diff suppressed because it is too large Load Diff

6586
3rdparty/wine/Include/xaudio2.h vendored Normal file

File diff suppressed because it is too large Load Diff

1098
3rdparty/wine/Include/xaudio2.idl vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,6 @@
# USE_DISPATCH_GL = 0
# MODERN_WIN_API = 0
# USE_XAUDIO2 = 0
# DIRECTINPUT = 7
# USE_SDL = 1
# SDL_INI_PATH = .;$HOME/.mame/;ini;
@ -577,10 +576,6 @@ ifdef MODERN_WIN_API
PARAMS += --MODERN_WIN_API='$(MODERN_WIN_API)'
endif
ifdef USE_XAUDIO2
PARAMS += --USE_XAUDIO2='$(USE_XAUDIO2)'
endif
ifdef DIRECTINPUT
PARAMS += --DIRECTINPUT='$(DIRECTINPUT)'
endif

View File

@ -89,6 +89,7 @@ function osdmodulesbuild()
if _OPTIONS["targetos"]=="windows" then
includedirs {
MAME_DIR .. "3rdparty/winpcap/Include",
MAME_DIR .. "3rdparty/wine/Include",
}
end
@ -431,29 +432,6 @@ newoption {
},
}
newoption {
trigger = "USE_XAUDIO2",
description = "Use XAudio2 API for audio",
allowed = {
{ "0", "Disable XAudio2" },
{ "1", "Enable XAudio2" },
},
}
if _OPTIONS["USE_XAUDIO2"]=="1" then
_OPTIONS["MODERN_WIN_API"] = "1",
defines {
"USE_XAUDIO2=1",
},
includedirs {
MAME_DIR .. "3rdparty/win81sdk/Include/um",
}
else
defines {
"USE_XAUDIO2=0",
}
end
newoption {
trigger = "USE_QTDEBUG",
description = "Use QT debugger",

View File

@ -9,26 +9,17 @@
#include "sound_module.h"
#include "modules/osdmodule.h"
#if (defined(OSD_WINDOWS) && USE_XAUDIO2)
#if defined(OSD_WINDOWS) && (_WIN32_WINNT >= 0x0602)
// standard windows headers
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mutex>
#pragma warning( push )
#pragma warning( disable: 4068 )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wattributes"
// XAudio2 include
#include <xaudio2.h>
#pragma GCC diagnostic pop
#pragma warning( pop )
#include <mmsystem.h>
// stdlib includes
#include <mutex>
#include <thread>
#include <queue>
@ -37,7 +28,6 @@
// MAME headers
#include "emu.h"
#include "osdepend.h"
#include "emuopts.h"
//============================================================
// Constants
@ -229,11 +219,11 @@ public:
m_buffer_size(0),
m_buffer_count(0),
m_writepos(0),
m_hEventBufferCompleted(NULL),
m_hEventDataAvailable(NULL),
m_hEventExiting(NULL),
m_hEventBufferCompleted(nullptr),
m_hEventDataAvailable(nullptr),
m_hEventExiting(nullptr),
m_buffer_pool(nullptr),
m_xaudio2_module(NULL),
m_xaudio2_module(nullptr),
m_pfnxaudio2create(nullptr),
m_overflows(0),
m_underflows(0),
@ -241,27 +231,27 @@ public:
{
}
virtual int init(osd_options const &options) override;
virtual void exit() override;
int init(osd_options const &options) override;
void exit() override;
// sound_module
virtual void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override;
virtual void set_mastervolume(int attenuation) override;
void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override;
void set_mastervolume(int attenuation) override;
// Xaudio callbacks
void OnVoiceProcessingPassStart(UINT32 bytes_required) override;
void OnVoiceProcessingPassEnd() override {}
void OnStreamEnd() override {}
void OnBufferStart(void* pBufferContext) override {}
void OnLoopEnd(void* pBufferContext) override {}
void OnVoiceError(void* pBufferContext, HRESULT error) override {}
void OnBufferEnd(void *pBufferContext) override;
void STDMETHODCALLTYPE OnVoiceProcessingPassStart(UINT32 bytes_required) override;
void STDMETHODCALLTYPE OnVoiceProcessingPassEnd() override {}
void STDMETHODCALLTYPE OnStreamEnd() override {}
void STDMETHODCALLTYPE OnBufferStart(void* pBufferContext) override {}
void STDMETHODCALLTYPE OnLoopEnd(void* pBufferContext) override {}
void STDMETHODCALLTYPE OnVoiceError(void* pBufferContext, HRESULT error) override {}
void STDMETHODCALLTYPE OnBufferEnd(void *pBufferContext) override;
private:
void create_buffers(const WAVEFORMATEX &format);
HRESULT create_voices(const WAVEFORMATEX &format);
void process_audio();
void submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength);
void submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength) const;
void submit_needed();
HRESULT xaudio2_create(IXAudio2 ** xaudio2_interface);
void roll_buffer();
@ -274,7 +264,7 @@ private:
int sound_xaudio2::init(osd_options const &options)
{
HRESULT result = S_OK;
HRESULT result;
// Create the IXAudio2 object
IXAudio2 *temp_xaudio2 = nullptr;
@ -292,20 +282,13 @@ int sound_xaudio2::init(osd_options const &options)
m_sample_bytes = format.nBlockAlign;
#if defined(_DEBUG)
XAUDIO2_DEBUG_CONFIGURATION debugConfig = { 0 };
debugConfig.TraceMask = XAUDIO2_LOG_WARNINGS | XAUDIO2_LOG_TIMING | XAUDIO2_LOG_STREAMING;
debugConfig.LogFunctionName = TRUE;
m_xAudio2->SetDebugConfiguration(&debugConfig);
#endif
// Create the buffers
create_buffers(format);
// Initialize our events
m_hEventBufferCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEventDataAvailable = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEventExiting = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEventBufferCompleted = CreateEvent(nullptr, FALSE, FALSE, nullptr);
m_hEventDataAvailable = CreateEvent(nullptr, FALSE, FALSE, nullptr);
m_hEventExiting = CreateEvent(nullptr, FALSE, FALSE, nullptr);
// create the voices and start them
HR_RET1(create_voices(format));
@ -413,7 +396,7 @@ void sound_xaudio2::set_mastervolume(int attenuation)
// The XAudio2 voice callback triggered when a buffer finishes playing
void sound_xaudio2::OnBufferEnd(void *pBufferContext)
{
BYTE* completed_buffer = (BYTE*)pBufferContext;
BYTE* completed_buffer = static_cast<BYTE*>(pBufferContext);
if (completed_buffer != nullptr)
{
std::lock_guard<std::mutex> lock(m_buffer_lock);
@ -459,18 +442,18 @@ HRESULT sound_xaudio2::xaudio2_create(IXAudio2 ** ppxaudio2_interface)
{
if (nullptr == m_xaudio2_module)
{
m_xaudio2_module = LoadLibrary(XAUDIO2_DLL);
m_xaudio2_module = LoadLibrary(L"xaudio2_8.dll");
if (nullptr == m_xaudio2_module)
{
osd_printf_error("Failed to load module '%S', error: 0x%X\n", XAUDIO2_DLL, (unsigned int)GetLastError());
osd_printf_error("Failed to load module '%S', error: 0x%X\n", L"xaudio2_8.dll", static_cast<unsigned int>(GetLastError()));
HR_RETHR(E_FAIL);
}
}
m_pfnxaudio2create = (PFN_XAUDIO2CREATE)GetProcAddress(m_xaudio2_module, "XAudio2Create");
m_pfnxaudio2create = reinterpret_cast<PFN_XAUDIO2CREATE>(GetProcAddress(m_xaudio2_module, "XAudio2Create"));
if (nullptr == m_pfnxaudio2create)
{
osd_printf_error("Failed to get adddress of exported function XAudio2Create, error: 0x%X\n", (unsigned int)GetLastError());
osd_printf_error("Failed to get adddress of exported function XAudio2Create, error: 0x%X\n", static_cast<unsigned int>(GetLastError()));
HR_RETHR(E_FAIL);
}
}
@ -510,9 +493,9 @@ void sound_xaudio2::create_buffers(const WAVEFORMATEX &format)
osd_printf_verbose(
"Sound: XAudio2 created initial buffers. total size: %u, count %u, size each %u\n",
(unsigned int)total_buffer_size,
(unsigned int)m_buffer_count,
(unsigned int)m_buffer_size);
static_cast<unsigned int>(total_buffer_size),
static_cast<unsigned int>(m_buffer_count),
static_cast<unsigned int>(m_buffer_size));
// reset buffer states
m_writepos = 0;
@ -608,7 +591,7 @@ void sound_xaudio2::submit_needed()
// submit_buffer
//============================================================
void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength)
void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength) const
{
assert(audioLength != 0);
@ -623,7 +606,7 @@ void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audio
HRESULT result;
if (FAILED(result = m_sourceVoice->SubmitSourceBuffer(&buf)))
{
osd_printf_verbose("Sound: XAudio2 failed to submit source buffer (non-fatal). Error: 0x%X\n", (unsigned int)result);
osd_printf_verbose("Sound: XAudio2 failed to submit source buffer (non-fatal). Error: 0x%X\n", static_cast<unsigned int>(result));
m_buffer_pool->return_to_pool(audioData.release());
return;
}