diff options
Diffstat (limited to 'src/audio_core')
21 files changed, 94 insertions, 47 deletions
diff --git a/src/audio_core/adsp/adsp.cpp b/src/audio_core/adsp/adsp.cpp index 6c53c98fd..48f0a63d4 100644 --- a/src/audio_core/adsp/adsp.cpp +++ b/src/audio_core/adsp/adsp.cpp @@ -11,7 +11,7 @@ ADSP::ADSP(Core::System& system, Sink::Sink& sink) { opus_decoder = std::make_unique<OpusDecoder::OpusDecoder>(system); opus_decoder->Send(Direction::DSP, OpusDecoder::Message::Start); if (opus_decoder->Receive(Direction::Host) != OpusDecoder::Message::StartOK) { - LOG_ERROR(Service_Audio, "OpusDeocder failed to initialize."); + LOG_ERROR(Service_Audio, "OpusDecoder failed to initialize."); return; } } diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index ef301d8b4..7a76c3d0b 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -89,11 +89,13 @@ u32 AudioRenderer::Receive(Direction dir) { } void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, - u64 applet_resource_user_id, bool reset) noexcept { + u64 applet_resource_user_id, Kernel::KProcess* process, + bool reset) noexcept { command_buffers[session_id].buffer = buffer; command_buffers[session_id].size = size; command_buffers[session_id].time_limit = time_limit; command_buffers[session_id].applet_resource_user_id = applet_resource_user_id; + command_buffers[session_id].process = process; command_buffers[session_id].reset_buffer = reset; } @@ -173,7 +175,8 @@ void AudioRenderer::Main(std::stop_token stop_token) { // If there are no remaining commands (from the previous list), // this is a new command list, initialize it. if (command_buffer.remaining_command_count == 0) { - command_list_processor.Initialize(system, command_buffer.buffer, + command_list_processor.Initialize(system, *command_buffer.process, + command_buffer.buffer, command_buffer.size, streams[index]); } diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h index 57b89d9fe..875266f27 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h @@ -19,6 +19,10 @@ namespace Core { class System; } // namespace Core +namespace Kernel { +class KProcess; +} + namespace AudioCore { namespace Sink { class Sink; @@ -69,7 +73,8 @@ public: u32 Receive(Direction dir); void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, - u64 applet_resource_user_id, bool reset) noexcept; + u64 applet_resource_user_id, Kernel::KProcess* process, + bool reset) noexcept; u32 GetRemainCommandCount(s32 session_id) const noexcept; void ClearRemainCommandCount(s32 session_id) noexcept; u64 GetRenderingStartTick(s32 session_id) const noexcept; diff --git a/src/audio_core/adsp/apps/audio_renderer/command_buffer.h b/src/audio_core/adsp/apps/audio_renderer/command_buffer.h index 3fd1b09dc..d6a721f34 100644 --- a/src/audio_core/adsp/apps/audio_renderer/command_buffer.h +++ b/src/audio_core/adsp/apps/audio_renderer/command_buffer.h @@ -6,6 +6,10 @@ #include "audio_core/common/common.h" #include "common/common_types.h" +namespace Kernel { +class KProcess; +} + namespace AudioCore::ADSP::AudioRenderer { struct CommandBuffer { @@ -14,6 +18,7 @@ struct CommandBuffer { u64 size{}; u64 time_limit{}; u64 applet_resource_user_id{}; + Kernel::KProcess* process{}; bool reset_buffer{}; // Set by the DSP u32 remaining_command_count{}; diff --git a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp index 24e4d0496..eef2c0b89 100644 --- a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp @@ -9,14 +9,15 @@ #include "common/settings.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/hle/kernel/k_process.h" #include "core/memory.h" namespace AudioCore::ADSP::AudioRenderer { -void CommandListProcessor::Initialize(Core::System& system_, CpuAddr buffer, u64 size, - Sink::SinkStream* stream_) { +void CommandListProcessor::Initialize(Core::System& system_, Kernel::KProcess& process, + CpuAddr buffer, u64 size, Sink::SinkStream* stream_) { system = &system_; - memory = &system->ApplicationMemory(); + memory = &process.GetMemory(); stream = stream_; header = reinterpret_cast<Renderer::CommandListHeader*>(buffer); commands = reinterpret_cast<u8*>(buffer + sizeof(Renderer::CommandListHeader)); diff --git a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h index 4e5fb793e..944e82505 100644 --- a/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h +++ b/src/audio_core/adsp/apps/audio_renderer/command_list_processor.h @@ -16,6 +16,10 @@ class Memory; class System; } // namespace Core +namespace Kernel { +class KProcess; +} + namespace AudioCore { namespace Sink { class SinkStream; @@ -40,7 +44,8 @@ public: * @param size - The size of the buffer. * @param stream - The stream to be used for sending the samples. */ - void Initialize(Core::System& system, CpuAddr buffer, u64 size, Sink::SinkStream* stream); + void Initialize(Core::System& system, Kernel::KProcess& process, CpuAddr buffer, u64 size, + Sink::SinkStream* stream); /** * Set the maximum processing time for this command list. diff --git a/src/audio_core/device/device_session.cpp b/src/audio_core/device/device_session.cpp index ee42ae529..2a1ae1bb3 100644 --- a/src/audio_core/device/device_session.cpp +++ b/src/audio_core/device/device_session.cpp @@ -8,8 +8,11 @@ #include "audio_core/sink/sink_stream.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/guest_memory.h" #include "core/memory.h" +#include "core/hle/kernel/k_process.h" + namespace AudioCore { using namespace std::literals; @@ -25,7 +28,7 @@ DeviceSession::~DeviceSession() { } Result DeviceSession::Initialize(std::string_view name_, SampleFormat sample_format_, - u16 channel_count_, size_t session_id_, u32 handle_, + u16 channel_count_, size_t session_id_, Kernel::KProcess* handle_, u64 applet_resource_user_id_, Sink::StreamType type_) { if (stream) { Finalize(); @@ -36,6 +39,7 @@ Result DeviceSession::Initialize(std::string_view name_, SampleFormat sample_for channel_count = channel_count_; session_id = session_id_; handle = handle_; + handle->Open(); applet_resource_user_id = applet_resource_user_id_; if (type == Sink::StreamType::In) { @@ -54,6 +58,11 @@ void DeviceSession::Finalize() { sink->CloseStream(stream); stream = nullptr; } + + if (handle) { + handle->Close(); + handle = nullptr; + } } void DeviceSession::Start() { @@ -91,7 +100,7 @@ void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) { stream->AppendBuffer(new_buffer, tmp_samples); } else { Core::Memory::CpuGuestMemory<s16, Core::Memory::GuestMemoryFlags::UnsafeRead> samples( - system.ApplicationMemory(), buffer.samples, buffer.size / sizeof(s16)); + handle->GetMemory(), buffer.samples, buffer.size / sizeof(s16)); stream->AppendBuffer(new_buffer, samples); } } @@ -100,7 +109,7 @@ void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) { void DeviceSession::ReleaseBuffer(const AudioBuffer& buffer) const { if (type == Sink::StreamType::In) { auto samples{stream->ReleaseBuffer(buffer.size / sizeof(s16))}; - system.ApplicationMemory().WriteBlockUnsafe(buffer.samples, samples.data(), buffer.size); + handle->GetMemory().WriteBlockUnsafe(buffer.samples, samples.data(), buffer.size); } } diff --git a/src/audio_core/device/device_session.h b/src/audio_core/device/device_session.h index 7d52f362d..f3fae2617 100644 --- a/src/audio_core/device/device_session.h +++ b/src/audio_core/device/device_session.h @@ -20,6 +20,10 @@ struct EventType; } // namespace Timing } // namespace Core +namespace Kernel { +class KProcess; +} // namespace Kernel + namespace AudioCore { namespace Sink { @@ -44,13 +48,13 @@ public: * @param sample_format - Sample format for this device's output. * @param channel_count - Number of channels for this device (2 or 6). * @param session_id - This session's id. - * @param handle - Handle for this device session (unused). + * @param handle - Process handle for this device session. * @param applet_resource_user_id - Applet resource user id for this device session (unused). * @param type - Type of this stream (Render, In, Out). * @return Result code for this call. */ Result Initialize(std::string_view name, SampleFormat sample_format, u16 channel_count, - size_t session_id, u32 handle, u64 applet_resource_user_id, + size_t session_id, Kernel::KProcess* handle, u64 applet_resource_user_id, Sink::StreamType type); /** @@ -137,8 +141,8 @@ private: u16 channel_count{}; /// Session id of this device session size_t session_id{}; - /// Handle of this device session - u32 handle{}; + /// Process handle of device memory owner + Kernel::KProcess* handle{}; /// Applet resource user id of this device session u64 applet_resource_user_id{}; /// Total number of samples played by this device session diff --git a/src/audio_core/in/audio_in_system.cpp b/src/audio_core/in/audio_in_system.cpp index 579129121..b2dd3ef9f 100644 --- a/src/audio_core/in/audio_in_system.cpp +++ b/src/audio_core/in/audio_in_system.cpp @@ -57,7 +57,7 @@ Result System::IsConfigValid(const std::string_view device_name, } Result System::Initialize(std::string device_name, const AudioInParameter& in_params, - const u32 handle_, const u64 applet_resource_user_id_) { + Kernel::KProcess* handle_, const u64 applet_resource_user_id_) { auto result{IsConfigValid(device_name, in_params)}; if (result.IsError()) { return result; diff --git a/src/audio_core/in/audio_in_system.h b/src/audio_core/in/audio_in_system.h index 1c5154638..ee048190c 100644 --- a/src/audio_core/in/audio_in_system.h +++ b/src/audio_core/in/audio_in_system.h @@ -19,7 +19,8 @@ class System; namespace Kernel { class KEvent; -} +class KProcess; +} // namespace Kernel namespace AudioCore::AudioIn { @@ -93,12 +94,12 @@ public: * * @param device_name - The name of the requested input device. * @param in_params - Input parameters, see AudioInParameter. - * @param handle - Unused. + * @param handle - Process handle. * @param applet_resource_user_id - Unused. * @return Result code. */ - Result Initialize(std::string device_name, const AudioInParameter& in_params, u32 handle, - u64 applet_resource_user_id); + Result Initialize(std::string device_name, const AudioInParameter& in_params, + Kernel::KProcess* handle, u64 applet_resource_user_id); /** * Start this system. @@ -244,8 +245,8 @@ public: private: /// Core system Core::System& system; - /// (Unused) - u32 handle{}; + /// Process handle + Kernel::KProcess* handle{}; /// (Unused) u64 applet_resource_user_id{}; /// Buffer event, signalled when a buffer is ready diff --git a/src/audio_core/out/audio_out_system.cpp b/src/audio_core/out/audio_out_system.cpp index 0adf64bd3..7b3ff4e88 100644 --- a/src/audio_core/out/audio_out_system.cpp +++ b/src/audio_core/out/audio_out_system.cpp @@ -48,8 +48,8 @@ Result System::IsConfigValid(std::string_view device_name, return Service::Audio::ResultInvalidChannelCount; } -Result System::Initialize(std::string device_name, const AudioOutParameter& in_params, u32 handle_, - u64 applet_resource_user_id_) { +Result System::Initialize(std::string device_name, const AudioOutParameter& in_params, + Kernel::KProcess* handle_, u64 applet_resource_user_id_) { auto result = IsConfigValid(device_name, in_params); if (result.IsError()) { return result; diff --git a/src/audio_core/out/audio_out_system.h b/src/audio_core/out/audio_out_system.h index b95cb91be..82aada185 100644 --- a/src/audio_core/out/audio_out_system.h +++ b/src/audio_core/out/audio_out_system.h @@ -19,7 +19,8 @@ class System; namespace Kernel { class KEvent; -} +class KProcess; +} // namespace Kernel namespace AudioCore::AudioOut { @@ -84,12 +85,12 @@ public: * * @param device_name - The name of the requested output device. * @param in_params - Input parameters, see AudioOutParameter. - * @param handle - Unused. + * @param handle - Process handle. * @param applet_resource_user_id - Unused. * @return Result code. */ - Result Initialize(std::string device_name, const AudioOutParameter& in_params, u32 handle, - u64 applet_resource_user_id); + Result Initialize(std::string device_name, const AudioOutParameter& in_params, + Kernel::KProcess* handle, u64 applet_resource_user_id); /** * Start this system. @@ -228,8 +229,8 @@ public: private: /// Core system Core::System& system; - /// (Unused) - u32 handle{}; + /// Process handle + Kernel::KProcess* handle{}; /// (Unused) u64 applet_resource_user_id{}; /// Buffer event, signalled when a buffer is ready diff --git a/src/audio_core/renderer/audio_renderer.cpp b/src/audio_core/renderer/audio_renderer.cpp index 09efe9be9..df03d03aa 100644 --- a/src/audio_core/renderer/audio_renderer.cpp +++ b/src/audio_core/renderer/audio_renderer.cpp @@ -6,6 +6,7 @@ #include "audio_core/renderer/audio_renderer.h" #include "audio_core/renderer/system_manager.h" #include "core/core.h" +#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_transfer_memory.h" #include "core/hle/service/audio/errors.h" @@ -17,7 +18,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren Result Renderer::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, const u64 transfer_memory_size, const u32 process_handle, - const u64 applet_resource_user_id, const s32 session_id) { + Kernel::KProcess& process, const u64 applet_resource_user_id, + const s32 session_id) { if (params.execution_mode == ExecutionMode::Auto) { if (!manager.AddSystem(system)) { LOG_ERROR(Service_Audio, @@ -28,7 +30,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params, } initialized = true; - system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, + system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, applet_resource_user_id, session_id); return ResultSuccess; diff --git a/src/audio_core/renderer/audio_renderer.h b/src/audio_core/renderer/audio_renderer.h index 24650278b..1219f74ca 100644 --- a/src/audio_core/renderer/audio_renderer.h +++ b/src/audio_core/renderer/audio_renderer.h @@ -14,7 +14,8 @@ class System; namespace Kernel { class KTransferMemory; -} +class KProcess; +} // namespace Kernel namespace AudioCore { struct AudioRendererParameterInternal; @@ -44,7 +45,8 @@ public: */ Result Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle, u64 applet_resource_user_id, s32 session_id); + u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, + s32 session_id); /** * Finalize the renderer for shutdown. diff --git a/src/audio_core/renderer/command/command_generator.cpp b/src/audio_core/renderer/command/command_generator.cpp index ccb186209..f97db5899 100644 --- a/src/audio_core/renderer/command/command_generator.cpp +++ b/src/audio_core/renderer/command/command_generator.cpp @@ -41,7 +41,7 @@ void CommandGenerator::GenerateDataSourceCommand(VoiceInfo& voice_info, const VoiceState& voice_state, const s8 channel) { if (voice_info.mix_id == UnusedMixId) { if (voice_info.splitter_id != UnusedSplitterId) { - auto destination{splitter_context.GetDesintationData(voice_info.splitter_id, 0)}; + auto destination{splitter_context.GetDestinationData(voice_info.splitter_id, 0)}; u32 dest_id{0}; while (destination != nullptr) { if (destination->IsConfigured()) { @@ -55,7 +55,7 @@ void CommandGenerator::GenerateDataSourceCommand(VoiceInfo& voice_info, } } dest_id++; - destination = splitter_context.GetDesintationData(voice_info.splitter_id, dest_id); + destination = splitter_context.GetDestinationData(voice_info.splitter_id, dest_id); } } } else { @@ -234,7 +234,7 @@ void CommandGenerator::GenerateVoiceCommand(VoiceInfo& voice_info) { if (voice_info.mix_id == UnusedMixId) { if (voice_info.splitter_id != UnusedSplitterId) { auto i{channel}; - auto destination{splitter_context.GetDesintationData(voice_info.splitter_id, i)}; + auto destination{splitter_context.GetDestinationData(voice_info.splitter_id, i)}; while (destination != nullptr) { if (destination->IsConfigured()) { const auto mix_id{destination->GetMixId()}; @@ -249,7 +249,7 @@ void CommandGenerator::GenerateVoiceCommand(VoiceInfo& voice_info) { } } i += voice_info.channel_count; - destination = splitter_context.GetDesintationData(voice_info.splitter_id, i); + destination = splitter_context.GetDestinationData(voice_info.splitter_id, i); } } } else { @@ -591,7 +591,7 @@ void CommandGenerator::GenerateMixCommands(MixInfo& mix_info) { if (mix_info.dst_splitter_id != UnusedSplitterId) { s16 dest_id{0}; auto destination{ - splitter_context.GetDesintationData(mix_info.dst_splitter_id, dest_id)}; + splitter_context.GetDestinationData(mix_info.dst_splitter_id, dest_id)}; while (destination != nullptr) { if (destination->IsConfigured()) { auto splitter_mix_id{destination->GetMixId()}; @@ -612,7 +612,7 @@ void CommandGenerator::GenerateMixCommands(MixInfo& mix_info) { } dest_id++; destination = - splitter_context.GetDesintationData(mix_info.dst_splitter_id, dest_id); + splitter_context.GetDestinationData(mix_info.dst_splitter_id, dest_id); } } } else { diff --git a/src/audio_core/renderer/command/data_source/decode.cpp b/src/audio_core/renderer/command/data_source/decode.cpp index 911dae3c1..905613a5a 100644 --- a/src/audio_core/renderer/command/data_source/decode.cpp +++ b/src/audio_core/renderer/command/data_source/decode.cpp @@ -9,6 +9,7 @@ #include "common/fixed_point.h" #include "common/logging/log.h" #include "common/scratch_buffer.h" +#include "core/guest_memory.h" #include "core/memory.h" namespace AudioCore::Renderer { diff --git a/src/audio_core/renderer/mix/mix_info.cpp b/src/audio_core/renderer/mix/mix_info.cpp index 5e44bde18..68bbe0aed 100644 --- a/src/audio_core/renderer/mix/mix_info.cpp +++ b/src/audio_core/renderer/mix/mix_info.cpp @@ -93,7 +93,7 @@ bool MixInfo::UpdateConnection(EdgeMatrix& edge_matrix, const InParameter& in_pa for (u32 i = 0; i < destination_count; i++) { auto destination{ - splitter_context.GetDesintationData(in_params.dest_splitter_id, i)}; + splitter_context.GetDestinationData(in_params.dest_splitter_id, i)}; if (destination) { const auto destination_id{destination->GetMixId()}; diff --git a/src/audio_core/renderer/splitter/splitter_context.cpp b/src/audio_core/renderer/splitter/splitter_context.cpp index 686150ea6..d0f3b60c2 100644 --- a/src/audio_core/renderer/splitter/splitter_context.cpp +++ b/src/audio_core/renderer/splitter/splitter_context.cpp @@ -9,7 +9,7 @@ namespace AudioCore::Renderer { -SplitterDestinationData* SplitterContext::GetDesintationData(const s32 splitter_id, +SplitterDestinationData* SplitterContext::GetDestinationData(const s32 splitter_id, const s32 destination_id) { return splitter_infos[splitter_id].GetData(destination_id); } diff --git a/src/audio_core/renderer/splitter/splitter_context.h b/src/audio_core/renderer/splitter/splitter_context.h index 556e6dcc3..1c0b84671 100644 --- a/src/audio_core/renderer/splitter/splitter_context.h +++ b/src/audio_core/renderer/splitter/splitter_context.h @@ -42,7 +42,7 @@ public: * @param destination_id - Destination index within the splitter. * @return Pointer to the found destination. May be nullptr. */ - SplitterDestinationData* GetDesintationData(s32 splitter_id, s32 destination_id); + SplitterDestinationData* GetDestinationData(s32 splitter_id, s32 destination_id); /** * Get a splitter from the given index. diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index 31f92087c..ca656edae 100644 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp @@ -32,6 +32,7 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" +#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_transfer_memory.h" #include "core/memory.h" @@ -101,7 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_) Result System::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle_, u64 applet_resource_user_id_, s32 session_id_) { + u32 process_handle_, Kernel::KProcess& process_, + u64 applet_resource_user_id_, s32 session_id_) { if (!CheckValidRevision(params.revision)) { return Service::Audio::ResultInvalidRevision; } @@ -117,6 +119,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params, behavior.SetUserLibRevision(params.revision); process_handle = process_handle_; + process = &process_; applet_resource_user_id = applet_resource_user_id_; session_id = session_id_; @@ -129,7 +132,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params, render_device = params.rendering_device; execution_mode = params.execution_mode; - core.ApplicationMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); + process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); // Note: We're not actually using the transfer memory because it's a pain to code for. // Allocate the memory normally instead and hope the game doesn't try to read anything back @@ -613,7 +616,8 @@ void System::SendCommandToDsp() { static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * (static_cast<f32>(render_time_limit_percent) / 100.0f))}; audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, - applet_resource_user_id, reset_command_buffers); + applet_resource_user_id, process, + reset_command_buffers); reset_command_buffers = false; command_buffer_size = command_size; if (remaining_command_count == 0) { diff --git a/src/audio_core/renderer/system.h b/src/audio_core/renderer/system.h index 8a8341710..753a0b796 100644 --- a/src/audio_core/renderer/system.h +++ b/src/audio_core/renderer/system.h @@ -29,6 +29,7 @@ class System; namespace Kernel { class KEvent; +class KProcess; class KTransferMemory; } // namespace Kernel @@ -80,7 +81,8 @@ public: */ Result Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, - u32 process_handle, u64 applet_resource_user_id, s32 session_id); + u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, + s32 session_id); /** * Finalize the system. @@ -275,6 +277,8 @@ private: Common::Event terminate_event{}; /// Does what locks do std::mutex lock{}; + /// Process this audio render is operating within, used for memory reads/writes. + Kernel::KProcess* process{}; /// Handle for the process for this system, unused u32 process_handle{}; /// Applet resource id for this system, unused |