XAudio2 APU stub.
This commit is contained in:
parent
4e9d3a00e4
commit
edb1633fc9
|
@ -17,7 +17,7 @@ using namespace xe::apu;
|
|||
|
||||
|
||||
DEFINE_string(apu, "any",
|
||||
"Audio system. Use: [any, nop]");
|
||||
"Audio system. Use: [any, nop, xaudio2]");
|
||||
|
||||
|
||||
#include <xenia/apu/nop/nop_apu.h>
|
||||
|
@ -26,13 +26,32 @@ AudioSystem* xe::apu::CreateNop(Emulator* emulator) {
|
|||
}
|
||||
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
#include <xenia/apu/xaudio2/xaudio2_apu.h>
|
||||
AudioSystem* xe::apu::CreateXAudio2(Emulator* emulator) {
|
||||
return xe::apu::xaudio2::Create(emulator);
|
||||
}
|
||||
#endif // WIN32
|
||||
|
||||
AudioSystem* xe::apu::Create(Emulator* emulator) {
|
||||
if (FLAGS_apu.compare("nop") == 0) {
|
||||
return CreateNop(emulator);
|
||||
#if XE_PLATFORM_WIN32
|
||||
}
|
||||
else if (FLAGS_apu.compare("xaudio2") == 0) {
|
||||
return CreateXAudio2(emulator);
|
||||
#endif // WIN32
|
||||
} else {
|
||||
// Create best available.
|
||||
AudioSystem* best = NULL;
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
best = CreateXAudio2(emulator);
|
||||
if (best) {
|
||||
return best;
|
||||
}
|
||||
#endif // WIN32
|
||||
|
||||
// Fallback to nop.
|
||||
return CreateNop(emulator);
|
||||
}
|
||||
|
|
|
@ -24,6 +24,9 @@ AudioSystem* Create(Emulator* emulator);
|
|||
|
||||
AudioSystem* CreateNop(Emulator* emulator);
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
AudioSystem* CreateXAudio2(Emulator* emulator);
|
||||
#endif // WIN32
|
||||
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
'conditions': [
|
||||
['OS == "win"', {
|
||||
'includes': [
|
||||
'xaudio2/sources.gypi',
|
||||
],
|
||||
}],
|
||||
],
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||
{
|
||||
'sources': [
|
||||
'xaudio2_apu-private.h',
|
||||
'xaudio2_apu.cc',
|
||||
'xaudio2_apu.h',
|
||||
'xaudio2_audio_driver.cc',
|
||||
'xaudio2_audio_driver.h',
|
||||
'xaudio2_audio_system.cc',
|
||||
'xaudio2_audio_system.h',
|
||||
],
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
||||
|
||||
#include <xenia/core.h>
|
||||
|
||||
#include <xenia/apu/xaudio2/xaudio2_apu.h>
|
||||
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
|
@ -0,0 +1,44 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <xenia/apu/xaudio2/xaudio2_apu.h>
|
||||
|
||||
#include <xenia/apu/xaudio2/xaudio2_audio_system.h>
|
||||
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::xaudio2;
|
||||
|
||||
|
||||
namespace {
|
||||
void InitializeIfNeeded();
|
||||
void CleanupOnShutdown();
|
||||
|
||||
void InitializeIfNeeded() {
|
||||
static bool has_initialized = false;
|
||||
if (has_initialized) {
|
||||
return;
|
||||
}
|
||||
has_initialized = true;
|
||||
|
||||
//
|
||||
|
||||
atexit(CleanupOnShutdown);
|
||||
}
|
||||
|
||||
void CleanupOnShutdown() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AudioSystem* xe::apu::xaudio2::Create(Emulator* emulator) {
|
||||
InitializeIfNeeded();
|
||||
return new XAudio2AudioSystem(emulator);
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
||||
|
||||
#include <xenia/core.h>
|
||||
|
||||
|
||||
XEDECLARECLASS1(xe, Emulator);
|
||||
XEDECLARECLASS2(xe, apu, AudioSystem);
|
||||
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
|
||||
AudioSystem* Create(Emulator* emulator);
|
||||
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <xenia/apu/xaudio2/xaudio2_audio_driver.h>
|
||||
|
||||
#include <xenia/apu/apu-private.h>
|
||||
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::xaudio2;
|
||||
|
||||
|
||||
XAudio2AudioDriver::XAudio2AudioDriver(Memory* memory) :
|
||||
AudioDriver(memory) {
|
||||
}
|
||||
|
||||
XAudio2AudioDriver::~XAudio2AudioDriver() {
|
||||
}
|
||||
|
||||
void XAudio2AudioDriver::Initialize() {
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_
|
||||
|
||||
#include <xenia/core.h>
|
||||
|
||||
#include <xenia/apu/audio_driver.h>
|
||||
#include <xenia/apu/xaudio2/xaudio2_apu-private.h>
|
||||
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
|
||||
class XAudio2AudioDriver : public AudioDriver {
|
||||
public:
|
||||
XAudio2AudioDriver(Memory* memory);
|
||||
virtual ~XAudio2AudioDriver();
|
||||
|
||||
virtual void Initialize();
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_
|
|
@ -0,0 +1,108 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <xenia/apu/xaudio2/xaudio2_audio_system.h>
|
||||
|
||||
#include <xenia/apu/apu-private.h>
|
||||
#include <xenia/apu/xaudio2/xaudio2_audio_driver.h>
|
||||
|
||||
#include <xenia/emulator.h>
|
||||
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::xaudio2;
|
||||
|
||||
|
||||
XAudio2AudioSystem::XAudio2AudioSystem(Emulator* emulator) :
|
||||
audio_(0), mastering_voice_(0), pcm_voice_(0),
|
||||
AudioSystem(emulator) {
|
||||
}
|
||||
|
||||
XAudio2AudioSystem::~XAudio2AudioSystem() {
|
||||
}
|
||||
|
||||
void XAudio2AudioSystem::Initialize() {
|
||||
AudioSystem::Initialize();
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
hr = XAudio2Create(&audio_, 0, XAUDIO2_DEFAULT_PROCESSOR);
|
||||
if (FAILED(hr)) {
|
||||
XELOGE("XAudio2Create failed with %.8X", hr);
|
||||
exit(1);
|
||||
return;
|
||||
}
|
||||
|
||||
hr = audio_->CreateMasteringVoice(&mastering_voice_);
|
||||
if (FAILED(hr)) {
|
||||
XELOGE("CreateMasteringVoice failed with %.8X", hr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
WAVEFORMATEX waveformat;
|
||||
waveformat.wFormatTag = WAVE_FORMAT_PCM;
|
||||
waveformat.nChannels = 1;
|
||||
waveformat.nSamplesPerSec = 44100;
|
||||
waveformat.nAvgBytesPerSec = 44100 * 2;
|
||||
waveformat.nBlockAlign = 2;
|
||||
waveformat.wBitsPerSample = 16;
|
||||
waveformat.cbSize = 0;
|
||||
hr = audio_->CreateSourceVoice(&pcm_voice_, &waveformat);
|
||||
if (FAILED(hr)) {
|
||||
XELOGE("CreateSourceVoice failed with %.8X", hr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
pcm_voice_->Start();
|
||||
|
||||
XEASSERTNULL(driver_);
|
||||
driver_ = new XAudio2AudioDriver(memory_);
|
||||
}
|
||||
|
||||
void XAudio2AudioSystem::Pump() {
|
||||
//
|
||||
}
|
||||
|
||||
void XAudio2AudioSystem::SubmitFrame(uint32_t samples_ptr) {
|
||||
// Process samples! They are big-endian floats.
|
||||
HRESULT hr;
|
||||
|
||||
auto samples = reinterpret_cast<float*>(emulator_->memory()->membase() + samples_ptr);
|
||||
for (int i = 0; i < _countof(samples_); ++i)
|
||||
{
|
||||
samples_[i] = XESWAPF32BE(*samples++);
|
||||
}
|
||||
|
||||
// this is dumb and not right.
|
||||
XAUDIO2_BUFFER buffer;
|
||||
buffer.Flags = 0;
|
||||
buffer.AudioBytes = sizeof(samples_);
|
||||
buffer.pAudioData = reinterpret_cast<BYTE*>(samples_);
|
||||
buffer.PlayBegin = 0;
|
||||
buffer.PlayLength = 0;
|
||||
buffer.LoopBegin = 0;
|
||||
buffer.LoopLength = 0;
|
||||
buffer.LoopCount = 0;
|
||||
buffer.pContext = 0;
|
||||
hr = pcm_voice_->SubmitSourceBuffer(&buffer);
|
||||
if (FAILED(hr)) {
|
||||
XELOGE("SubmitSourceBuffer failed with %.8X", hr);
|
||||
exit(1);
|
||||
}
|
||||
hr = pcm_voice_->Start(0);
|
||||
if (FAILED(hr)) {
|
||||
XELOGE("Start failed with %.8X", hr);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
void XAudio2AudioSystem::Shutdown() {
|
||||
AudioSystem::Shutdown();
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_
|
||||
|
||||
#include <xenia/core.h>
|
||||
|
||||
#include <xenia/apu/audio_system.h>
|
||||
#include <xenia/apu/xaudio2/xaudio2_apu-private.h>
|
||||
|
||||
#include <xaudio2.h>
|
||||
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
|
||||
class XAudio2AudioSystem : public AudioSystem {
|
||||
public:
|
||||
XAudio2AudioSystem(Emulator* emulator);
|
||||
virtual ~XAudio2AudioSystem();
|
||||
|
||||
virtual void Shutdown();
|
||||
|
||||
virtual void SubmitFrame(uint32_t samples_ptr);
|
||||
|
||||
protected:
|
||||
virtual void Initialize();
|
||||
virtual void Pump();
|
||||
|
||||
private:
|
||||
IXAudio2* audio_;
|
||||
IXAudio2MasteringVoice* mastering_voice_;
|
||||
IXAudio2SourceVoice* pcm_voice_;
|
||||
float samples_[1536];
|
||||
};
|
||||
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_
|
Loading…
Reference in New Issue