@@ -1,53 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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/apu.h"
|
||||
#include "xenia/apu/apu-private.h"
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
|
||||
DEFINE_string(apu, "any", "Audio system. Use: [any, nop, xaudio2]");
|
||||
|
||||
DEFINE_bool(mute, false, "Mutes all audio output.");
|
||||
|
||||
#include "xenia/apu/nop/nop_apu.h"
|
||||
std::unique_ptr<AudioSystem> xe::apu::CreateNop(Emulator* emulator) {
|
||||
return xe::apu::nop::Create(emulator);
|
||||
}
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
#include "xenia/apu/xaudio2/xaudio2_apu.h"
|
||||
std::unique_ptr<AudioSystem> xe::apu::CreateXAudio2(Emulator* emulator) {
|
||||
return xe::apu::xaudio2::Create(emulator);
|
||||
}
|
||||
#endif // WIN32
|
||||
|
||||
std::unique_ptr<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.
|
||||
std::unique_ptr<AudioSystem> best;
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
best = CreateXAudio2(emulator);
|
||||
if (best) {
|
||||
return best;
|
||||
}
|
||||
#endif // WIN32
|
||||
|
||||
// Fallback to nop.
|
||||
return CreateNop(emulator);
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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_APU_H_
|
||||
#define XENIA_APU_APU_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "xenia/apu/audio_system.h"
|
||||
#include "xenia/apu/xma_decoder.h"
|
||||
|
||||
namespace xe {
|
||||
class Emulator;
|
||||
} // namespace xe
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
|
||||
std::unique_ptr<AudioSystem> Create(Emulator* emulator);
|
||||
|
||||
std::unique_ptr<AudioSystem> CreateNop(Emulator* emulator);
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
std::unique_ptr<AudioSystem> CreateXAudio2(Emulator* emulator);
|
||||
#endif // WIN32
|
||||
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
#endif // XENIA_APU_APU_H_
|
||||
@@ -7,19 +7,8 @@
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_NOP_NOP_APU_PRIVATE_H_
|
||||
#define XENIA_APU_NOP_NOP_APU_PRIVATE_H_
|
||||
#include "xenia/apu/apu_flags.h"
|
||||
|
||||
#include "xenia/apu/nop/nop_apu.h"
|
||||
DEFINE_string(apu, "any", "Audio system. Use: [any, nop, xaudio2]");
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace nop {
|
||||
|
||||
//
|
||||
|
||||
} // namespace nop
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
#endif // XENIA_APU_NOP_NOP_APU_PRIVATE_H_
|
||||
DEFINE_bool(mute, false, "Mutes all audio output.");
|
||||
@@ -7,8 +7,8 @@
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_APU_PRIVATE_H_
|
||||
#define XENIA_APU_APU_PRIVATE_H_
|
||||
#ifndef XENIA_APU_APU_FLAGS_H_
|
||||
#define XENIA_APU_APU_FLAGS_H_
|
||||
|
||||
#include <gflags/gflags.h>
|
||||
|
||||
@@ -16,4 +16,4 @@ DECLARE_string(apu);
|
||||
|
||||
DECLARE_bool(mute);
|
||||
|
||||
#endif // XENIA_APU_APU_PRIVATE_H_
|
||||
#endif // XENIA_APU_APU_FLAGS_H_
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include "xenia/apu/audio_system.h"
|
||||
|
||||
#include "xenia/apu/apu_flags.h"
|
||||
#include "xenia/apu/audio_driver.h"
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/base/math.h"
|
||||
@@ -20,6 +21,11 @@
|
||||
#include "xenia/kernel/objects/xthread.h"
|
||||
#include "xenia/profiling.h"
|
||||
|
||||
#include "xenia/apu/nop/nop_audio_system.h"
|
||||
#if XE_PLATFORM_WIN32
|
||||
#include "xenia/apu/xaudio2/xaudio2_audio_system.h"
|
||||
#endif // XE_PLATFORM_WIN32
|
||||
|
||||
// As with normal Microsoft, there are like twelve different ways to access
|
||||
// the audio APIs. Early games use XMA*() methods almost exclusively to touch
|
||||
// decoders. Later games use XAudio*() and direct memory writes to the XMA
|
||||
@@ -35,7 +41,28 @@
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
|
||||
using namespace xe::cpu;
|
||||
std::unique_ptr<AudioSystem> AudioSystem::Create(Emulator* emulator) {
|
||||
if (FLAGS_apu.compare("nop") == 0) {
|
||||
return nop::NopAudioSystem::Create(emulator);
|
||||
#if XE_PLATFORM_WIN32
|
||||
} else if (FLAGS_apu.compare("xaudio2") == 0) {
|
||||
return xaudio2::XAudio2AudioSystem::Create(emulator);
|
||||
#endif // WIN32
|
||||
} else {
|
||||
// Create best available.
|
||||
std::unique_ptr<AudioSystem> best;
|
||||
|
||||
#if XE_PLATFORM_WIN32
|
||||
best = xaudio2::XAudio2AudioSystem::Create(emulator);
|
||||
if (best) {
|
||||
return best;
|
||||
}
|
||||
#endif // XE_PLATFORM_WIN32
|
||||
|
||||
// Fallback to nop.
|
||||
return nop::NopAudioSystem::Create(emulator);
|
||||
}
|
||||
}
|
||||
|
||||
AudioSystem::AudioSystem(Emulator* emulator)
|
||||
: emulator_(emulator), memory_(emulator->memory()), worker_running_(false) {
|
||||
|
||||
@@ -32,6 +32,8 @@ class AudioSystem {
|
||||
public:
|
||||
virtual ~AudioSystem();
|
||||
|
||||
static std::unique_ptr<AudioSystem> Create(Emulator* emulator);
|
||||
|
||||
Emulator* emulator() const { return emulator_; }
|
||||
Memory* memory() const { return memory_; }
|
||||
cpu::Processor* processor() const { return processor_; }
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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/nop/nop_apu.h"
|
||||
|
||||
#include "xenia/apu/nop/nop_audio_system.h"
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::nop;
|
||||
|
||||
namespace {
|
||||
void InitializeIfNeeded();
|
||||
void CleanupOnShutdown();
|
||||
|
||||
void InitializeIfNeeded() {
|
||||
static bool has_initialized = false;
|
||||
if (has_initialized) {
|
||||
return;
|
||||
}
|
||||
has_initialized = true;
|
||||
|
||||
//
|
||||
|
||||
atexit(CleanupOnShutdown);
|
||||
}
|
||||
|
||||
void CleanupOnShutdown() {}
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioSystem> xe::apu::nop::Create(Emulator* emulator) {
|
||||
InitializeIfNeeded();
|
||||
return std::make_unique<NopAudioSystem>(emulator);
|
||||
}
|
||||
10
src/xenia/apu/nop/nop_apu_flags.cc
Normal file
10
src/xenia/apu/nop/nop_apu_flags.cc
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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/nop/nop_apu_flags.h"
|
||||
@@ -7,19 +7,9 @@
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
||||
#ifndef XENIA_APU_NOP_NOP_APU_FLAGS_H_
|
||||
#define XENIA_APU_NOP_NOP_APU_FLAGS_H_
|
||||
|
||||
#include "xenia/apu/xaudio2/xaudio2_apu.h"
|
||||
#include <gflags/gflags.h>
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
//
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_APU_PRIVATE_H_
|
||||
#endif // XENIA_APU_NOP_NOP_APU_FLAGS_H_
|
||||
@@ -9,15 +9,19 @@
|
||||
|
||||
#include "xenia/apu/nop/nop_audio_system.h"
|
||||
|
||||
#include "xenia/apu/apu-private.h"
|
||||
#include "xenia/apu/apu_flags.h"
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::nop;
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace nop {
|
||||
|
||||
std::unique_ptr<AudioSystem> NopAudioSystem::Create(Emulator* emulator) {
|
||||
return std::make_unique<NopAudioSystem>(emulator);
|
||||
}
|
||||
|
||||
NopAudioSystem::NopAudioSystem(Emulator* emulator) : AudioSystem(emulator) {}
|
||||
|
||||
NopAudioSystem::~NopAudioSystem() {}
|
||||
NopAudioSystem::~NopAudioSystem() = default;
|
||||
|
||||
X_STATUS NopAudioSystem::CreateDriver(size_t index, HANDLE wait_handle,
|
||||
AudioDriver** out_driver) {
|
||||
@@ -25,3 +29,7 @@ X_STATUS NopAudioSystem::CreateDriver(size_t index, HANDLE wait_handle,
|
||||
}
|
||||
|
||||
void NopAudioSystem::DestroyDriver(AudioDriver* driver) { assert_always(); }
|
||||
|
||||
} // namespace nop
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#define XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_
|
||||
|
||||
#include "xenia/apu/audio_system.h"
|
||||
#include "xenia/apu/nop/nop_apu-private.h"
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
@@ -20,11 +19,13 @@ namespace nop {
|
||||
class NopAudioSystem : public AudioSystem {
|
||||
public:
|
||||
NopAudioSystem(Emulator* emulator);
|
||||
virtual ~NopAudioSystem();
|
||||
~NopAudioSystem() override;
|
||||
|
||||
virtual X_STATUS CreateDriver(size_t index, HANDLE wait_handle,
|
||||
AudioDriver** out_driver);
|
||||
virtual void DestroyDriver(AudioDriver* driver);
|
||||
static std::unique_ptr<AudioSystem> Create(Emulator* emulator);
|
||||
|
||||
X_STATUS CreateDriver(size_t index, HANDLE wait_handle,
|
||||
AudioDriver** out_driver) override;
|
||||
void DestroyDriver(AudioDriver* driver) override;
|
||||
};
|
||||
|
||||
} // namespace nop
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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() {}
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioSystem> xe::apu::xaudio2::Create(Emulator* emulator) {
|
||||
InitializeIfNeeded();
|
||||
return std::make_unique<XAudio2AudioSystem>(emulator);
|
||||
}
|
||||
10
src/xenia/apu/xaudio2/xaudio2_apu_flags.cc
Normal file
10
src/xenia/apu/xaudio2/xaudio2_apu_flags.cc
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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_flags.h"
|
||||
@@ -7,22 +7,9 @@
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_
|
||||
|
||||
#include <memory>
|
||||
#include <gflags/gflags.h>
|
||||
|
||||
#include "xenia/apu/audio_system.h"
|
||||
#include "xenia/emulator.h"
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
std::unique_ptr<AudioSystem> Create(Emulator* emulator);
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_APU_H_
|
||||
#endif // XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "xenia/apu/xaudio2/xaudio2_audio_driver.h"
|
||||
|
||||
#include "xenia/apu/apu-private.h"
|
||||
#include "xenia/apu/apu_flags.h"
|
||||
#include "xenia/base/clock.h"
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/emulator.h"
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <xaudio2.h>
|
||||
|
||||
#include "xenia/apu/audio_driver.h"
|
||||
#include "xenia/apu/xaudio2/xaudio2_apu-private.h"
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
@@ -22,11 +21,11 @@ namespace xaudio2 {
|
||||
class XAudio2AudioDriver : public AudioDriver {
|
||||
public:
|
||||
XAudio2AudioDriver(Emulator* emulator, HANDLE semaphore);
|
||||
virtual ~XAudio2AudioDriver();
|
||||
~XAudio2AudioDriver() override;
|
||||
|
||||
virtual void Initialize();
|
||||
virtual void SubmitFrame(uint32_t frame_ptr);
|
||||
virtual void Shutdown();
|
||||
void Initialize();
|
||||
void SubmitFrame(uint32_t frame_ptr) override;
|
||||
void Shutdown();
|
||||
|
||||
private:
|
||||
IXAudio2* audio_;
|
||||
|
||||
@@ -8,15 +8,20 @@
|
||||
*/
|
||||
|
||||
#include "xenia/apu/xaudio2/xaudio2_audio_system.h"
|
||||
|
||||
#include <xaudio2.h>
|
||||
|
||||
#include "xenia/apu/apu_flags.h"
|
||||
#include "xenia/apu/xaudio2/xaudio2_audio_driver.h"
|
||||
|
||||
#include "xenia/apu/apu-private.h"
|
||||
|
||||
#include "xenia/emulator.h"
|
||||
|
||||
using namespace xe;
|
||||
using namespace xe::apu;
|
||||
using namespace xe::apu::xaudio2;
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
namespace xaudio2 {
|
||||
|
||||
std::unique_ptr<AudioSystem> XAudio2AudioSystem::Create(Emulator* emulator) {
|
||||
return std::make_unique<XAudio2AudioSystem>(emulator);
|
||||
}
|
||||
|
||||
XAudio2AudioSystem::XAudio2AudioSystem(Emulator* emulator)
|
||||
: AudioSystem(emulator) {}
|
||||
@@ -41,3 +46,7 @@ void XAudio2AudioSystem::DestroyDriver(AudioDriver* driver) {
|
||||
assert_not_null(xdriver);
|
||||
delete xdriver;
|
||||
}
|
||||
|
||||
} // namespace xaudio2
|
||||
} // namespace apu
|
||||
} // namespace xe
|
||||
|
||||
@@ -10,10 +10,7 @@
|
||||
#ifndef XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_
|
||||
#define XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_
|
||||
|
||||
#include <xaudio2.h>
|
||||
|
||||
#include "xenia/apu/audio_system.h"
|
||||
#include "xenia/apu/xaudio2/xaudio2_apu-private.h"
|
||||
|
||||
namespace xe {
|
||||
namespace apu {
|
||||
@@ -22,11 +19,13 @@ namespace xaudio2 {
|
||||
class XAudio2AudioSystem : public AudioSystem {
|
||||
public:
|
||||
XAudio2AudioSystem(Emulator* emulator);
|
||||
virtual ~XAudio2AudioSystem();
|
||||
~XAudio2AudioSystem() override;
|
||||
|
||||
virtual X_RESULT CreateDriver(size_t index, HANDLE semaphore,
|
||||
AudioDriver** out_driver);
|
||||
virtual void DestroyDriver(AudioDriver* driver);
|
||||
static std::unique_ptr<AudioSystem> Create(Emulator* emulator);
|
||||
|
||||
X_RESULT CreateDriver(size_t index, HANDLE semaphore,
|
||||
AudioDriver** out_driver) override;
|
||||
void DestroyDriver(AudioDriver* driver) override;
|
||||
|
||||
protected:
|
||||
virtual void Initialize();
|
||||
|
||||
Reference in New Issue
Block a user