Revert "XAudio2 code cleanup, plus switch header to wine version."

This reverts commit d52ed107a5.
This commit is contained in:
Brad Hughes 2016-03-05 09:52:31 -05:00
parent d52ed107a5
commit f7b8e47a17
6 changed files with 1273 additions and 7717 deletions

1196
3rdparty/win81sdk/Include/um/xaudio2.h vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,7 @@
# USE_DISPATCH_GL = 0
# MODERN_WIN_API = 0
# USE_XAUDIO2 = 0
# DIRECTINPUT = 7
# USE_SDL = 1
# SDL_INI_PATH = .;$HOME/.mame/;ini;
@ -576,6 +577,10 @@ 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,7 +89,6 @@ function osdmodulesbuild()
if _OPTIONS["targetos"]=="windows" then
includedirs {
MAME_DIR .. "3rdparty/winpcap/Include",
MAME_DIR .. "3rdparty/wine/Include",
}
end
@ -432,6 +431,29 @@ 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,17 +9,26 @@
#include "sound_module.h"
#include "modules/osdmodule.h"
#if defined(OSD_WINDOWS) && (_WIN32_WINNT >= 0x0602)
#if (defined(OSD_WINDOWS) && USE_XAUDIO2)
// 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>
@ -28,6 +37,7 @@
// MAME headers
#include "emu.h"
#include "osdepend.h"
#include "emuopts.h"
//============================================================
// Constants
@ -219,11 +229,11 @@ public:
m_buffer_size(0),
m_buffer_count(0),
m_writepos(0),
m_hEventBufferCompleted(nullptr),
m_hEventDataAvailable(nullptr),
m_hEventExiting(nullptr),
m_hEventBufferCompleted(NULL),
m_hEventDataAvailable(NULL),
m_hEventExiting(NULL),
m_buffer_pool(nullptr),
m_xaudio2_module(nullptr),
m_xaudio2_module(NULL),
m_pfnxaudio2create(nullptr),
m_overflows(0),
m_underflows(0),
@ -231,27 +241,27 @@ public:
{
}
int init(osd_options const &options) override;
void exit() override;
virtual int init(osd_options const &options) override;
virtual void exit() override;
// sound_module
void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override;
void set_mastervolume(int attenuation) override;
virtual void update_audio_stream(bool is_throttled, INT16 const *buffer, int samples_this_frame) override;
virtual void set_mastervolume(int attenuation) override;
// Xaudio callbacks
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;
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;
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) const;
void submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength);
void submit_needed();
HRESULT xaudio2_create(IXAudio2 ** xaudio2_interface);
void roll_buffer();
@ -264,7 +274,7 @@ private:
int sound_xaudio2::init(osd_options const &options)
{
HRESULT result;
HRESULT result = S_OK;
// Create the IXAudio2 object
IXAudio2 *temp_xaudio2 = nullptr;
@ -282,13 +292,20 @@ 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(nullptr, FALSE, FALSE, nullptr);
m_hEventDataAvailable = CreateEvent(nullptr, FALSE, FALSE, nullptr);
m_hEventExiting = CreateEvent(nullptr, FALSE, FALSE, nullptr);
m_hEventBufferCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEventDataAvailable = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hEventExiting = CreateEvent(NULL, FALSE, FALSE, NULL);
// create the voices and start them
HR_RET1(create_voices(format));
@ -396,7 +413,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 = static_cast<BYTE*>(pBufferContext);
BYTE* completed_buffer = (BYTE*)pBufferContext;
if (completed_buffer != nullptr)
{
std::lock_guard<std::mutex> lock(m_buffer_lock);
@ -442,18 +459,18 @@ HRESULT sound_xaudio2::xaudio2_create(IXAudio2 ** ppxaudio2_interface)
{
if (nullptr == m_xaudio2_module)
{
m_xaudio2_module = LoadLibrary(L"xaudio2_8.dll");
m_xaudio2_module = LoadLibrary(XAUDIO2_DLL);
if (nullptr == m_xaudio2_module)
{
osd_printf_error("Failed to load module '%S', error: 0x%X\n", L"xaudio2_8.dll", static_cast<unsigned int>(GetLastError()));
osd_printf_error("Failed to load module '%S', error: 0x%X\n", XAUDIO2_DLL, (unsigned int)GetLastError());
HR_RETHR(E_FAIL);
}
}
m_pfnxaudio2create = reinterpret_cast<PFN_XAUDIO2CREATE>(GetProcAddress(m_xaudio2_module, "XAudio2Create"));
m_pfnxaudio2create = (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", static_cast<unsigned int>(GetLastError()));
osd_printf_error("Failed to get adddress of exported function XAudio2Create, error: 0x%X\n", (unsigned int)GetLastError());
HR_RETHR(E_FAIL);
}
}
@ -493,9 +510,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",
static_cast<unsigned int>(total_buffer_size),
static_cast<unsigned int>(m_buffer_count),
static_cast<unsigned int>(m_buffer_size));
(unsigned int)total_buffer_size,
(unsigned int)m_buffer_count,
(unsigned int)m_buffer_size);
// reset buffer states
m_writepos = 0;
@ -591,7 +608,7 @@ void sound_xaudio2::submit_needed()
// submit_buffer
//============================================================
void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength) const
void sound_xaudio2::submit_buffer(std::unique_ptr<BYTE[]> audioData, DWORD audioLength)
{
assert(audioLength != 0);
@ -606,7 +623,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", static_cast<unsigned int>(result));
osd_printf_verbose("Sound: XAudio2 failed to submit source buffer (non-fatal). Error: 0x%X\n", (unsigned int)result);
m_buffer_pool->return_to_pool(audioData.release());
return;
}