diff options
author | MerryMage <MerryMage@users.noreply.github.com> | 2016-04-27 14:53:23 +0200 |
---|---|---|
committer | MerryMage <MerryMage@users.noreply.github.com> | 2016-04-30 08:41:02 +0200 |
commit | 4e971f44a27c2e4abc25ddf0720d287a688e0a4d (patch) | |
tree | c88ce045e20e40dd022a56dbd4a5281024591e61 /src/audio_core/audio_core.cpp | |
parent | AudioCore: List of sink types (diff) | |
download | yuzu-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/audio_core.cpp')
-rw-r--r-- | src/audio_core/audio_core.cpp | 33 |
1 files changed, 29 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 |