mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Audio: Add sink selection to configuration files
This commit is contained in:
		
							parent
							
								
									8b94422e3e
								
							
						
					
					
						commit
						4e971f44a2
					
				
					 10 changed files with 79 additions and 4 deletions
				
			
		|  | @ -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
 | ||||
|  |  | |||
|  | @ -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(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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>(); } }, | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue