summaryrefslogtreecommitdiffstats
path: root/src/audio_core
diff options
context:
space:
mode:
authorMerryMage <MerryMage@users.noreply.github.com>2016-04-27 14:53:23 +0200
committerMerryMage <MerryMage@users.noreply.github.com>2016-04-30 08:41:02 +0200
commit4e971f44a27c2e4abc25ddf0720d287a688e0a4d (patch)
treec88ce045e20e40dd022a56dbd4a5281024591e61 /src/audio_core
parentAudioCore: List of sink types (diff)
downloadyuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar.gz
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar.bz2
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar.lz
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar.xz
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.tar.zst
yuzu-4e971f44a27c2e4abc25ddf0720d287a688e0a4d.zip
Diffstat (limited to 'src/audio_core')
-rw-r--r--src/audio_core/audio_core.cpp33
-rw-r--r--src/audio_core/audio_core.h5
-rw-r--r--src/audio_core/hle/dsp.cpp9
-rw-r--r--src/audio_core/hle/dsp.h11
-rw-r--r--src/audio_core/sink_details.cpp1
5 files changed, 55 insertions, 4 deletions
diff --git a/src/audio_core/audio_core.cpp b/src/audio_core/audio_core.cpp
index cbe869a04..d42249ebd 100644
--- a/src/audio_core/audio_core.cpp
+++ b/src/audio_core/audio_core.cpp
@@ -2,9 +2,15 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <memory>
+#include <string>
+
#include "audio_core/audio_core.h"
#include "audio_core/hle/dsp.h"
#include "audio_core/hle/pipe.h"
+#include "audio_core/null_sink.h"
+#include "audio_core/sink.h"
+#include "audio_core/sink_details.h"
#include "core/core_timing.h"
#include "core/hle/kernel/vm_manager.h"
@@ -28,7 +34,6 @@ static void AudioTickCallback(u64 /*userdata*/, int cycles_late) {
CoreTiming::ScheduleEvent(audio_frame_ticks - cycles_late, tick_event);
}
-/// Initialise Audio
void Init() {
DSP::HLE::Init();
@@ -36,7 +41,6 @@ void Init() {
CoreTiming::ScheduleEvent(audio_frame_ticks, tick_event);
}
-/// Add DSP address spaces to Process's address space.
void AddAddressSpace(Kernel::VMManager& address_space) {
auto r0_vma = address_space.MapBackingMemory(DSP::HLE::region0_base, reinterpret_cast<u8*>(&DSP::HLE::g_regions[0]), sizeof(DSP::HLE::SharedMemory), Kernel::MemoryState::IO).MoveFrom();
address_space.Reprotect(r0_vma, Kernel::VMAPermission::ReadWrite);
@@ -45,10 +49,31 @@ void AddAddressSpace(Kernel::VMManager& address_space) {
address_space.Reprotect(r1_vma, Kernel::VMAPermission::ReadWrite);
}
-/// Shutdown Audio
+void SelectSink(std::string sink_id) {
+ if (sink_id == "auto") {
+ // Auto-select.
+ // g_sink_details is ordered in terms of desirability, with the best choice at the front.
+ const auto& sink_detail = g_sink_details.front();
+ DSP::HLE::SetSink(sink_detail.factory());
+ return;
+ }
+
+ auto iter = std::find_if(g_sink_details.begin(), g_sink_details.end(), [sink_id](const auto& sink_detail) {
+ return sink_detail.id == sink_id;
+ });
+
+ if (iter == g_sink_details.end()) {
+ LOG_ERROR(Audio, "AudioCore::SelectSink given invalid sink_id");
+ DSP::HLE::SetSink(std::make_unique<NullSink>());
+ return;
+ }
+
+ DSP::HLE::SetSink(iter->factory());
+}
+
void Shutdown() {
CoreTiming::UnscheduleEvent(tick_event, 0);
DSP::HLE::Shutdown();
}
-} //namespace
+} // namespace AudioCore
diff --git a/src/audio_core/audio_core.h b/src/audio_core/audio_core.h
index b349895ea..f618361f3 100644
--- a/src/audio_core/audio_core.h
+++ b/src/audio_core/audio_core.h
@@ -4,6 +4,8 @@
#pragma once
+#include <string>
+
namespace Kernel {
class VMManager;
}
@@ -18,6 +20,9 @@ void Init();
/// Add DSP address spaces to a Process.
void AddAddressSpace(Kernel::VMManager& vm_manager);
+/// Select the sink to use based on sink id.
+void SelectSink(std::string sink_id);
+
/// Shutdown Audio Core
void Shutdown();
diff --git a/src/audio_core/hle/dsp.cpp b/src/audio_core/hle/dsp.cpp
index 5759a5b9e..4d44bd2d9 100644
--- a/src/audio_core/hle/dsp.cpp
+++ b/src/audio_core/hle/dsp.cpp
@@ -2,8 +2,11 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <memory>
+
#include "audio_core/hle/dsp.h"
#include "audio_core/hle/pipe.h"
+#include "audio_core/sink.h"
namespace DSP {
namespace HLE {
@@ -35,6 +38,8 @@ static SharedMemory& WriteRegion() {
return g_regions[1 - CurrentRegionIndex()];
}
+static std::unique_ptr<AudioCore::Sink> sink;
+
void Init() {
DSP::HLE::ResetPipes();
}
@@ -46,5 +51,9 @@ bool Tick() {
return true;
}
+void SetSink(std::unique_ptr<AudioCore::Sink> sink_) {
+ sink = std::move(sink_);
+}
+
} // namespace HLE
} // namespace DSP
diff --git a/src/audio_core/hle/dsp.h b/src/audio_core/hle/dsp.h
index f0f125284..4f2410c27 100644
--- a/src/audio_core/hle/dsp.h
+++ b/src/audio_core/hle/dsp.h
@@ -6,6 +6,7 @@
#include <array>
#include <cstddef>
+#include <memory>
#include <type_traits>
#include "audio_core/hle/common.h"
@@ -15,6 +16,10 @@
#include "common/common_types.h"
#include "common/swap.h"
+namespace AudioCore {
+class Sink;
+}
+
namespace DSP {
namespace HLE {
@@ -535,5 +540,11 @@ void Shutdown();
*/
bool Tick();
+/**
+ * Set the output sink. This must be called before calling Tick().
+ * @param sink The sink to which audio will be output to.
+ */
+void SetSink(std::unique_ptr<AudioCore::Sink> sink);
+
} // namespace HLE
} // namespace DSP
diff --git a/src/audio_core/sink_details.cpp b/src/audio_core/sink_details.cpp
index 20412daaf..d2cc74103 100644
--- a/src/audio_core/sink_details.cpp
+++ b/src/audio_core/sink_details.cpp
@@ -10,6 +10,7 @@
namespace AudioCore {
+// g_sink_details is ordered in terms of desirability, with the best choice at the top.
const std::vector<SinkDetails> g_sink_details = {
{ "null", []() { return std::make_unique<NullSink>(); } },
};