summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp7
-rw-r--r--src/audio_core/adsp/apps/audio_renderer/audio_renderer.h7
-rw-r--r--src/audio_core/adsp/apps/audio_renderer/command_buffer.h5
-rw-r--r--src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp7
-rw-r--r--src/audio_core/adsp/apps/audio_renderer/command_list_processor.h7
-rw-r--r--src/audio_core/renderer/audio_renderer.cpp6
-rw-r--r--src/audio_core/renderer/audio_renderer.h6
-rw-r--r--src/audio_core/renderer/system.cpp10
-rw-r--r--src/audio_core/renderer/system.h6
-rw-r--r--src/core/hle/service/audio/audren_u.cpp16
10 files changed, 56 insertions, 21 deletions
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) {
89} 89}
90 90
91void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, 91void AudioRenderer::SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
92 u64 applet_resource_user_id, bool reset) noexcept { 92 u64 applet_resource_user_id, Kernel::KProcess* process,
93 bool reset) noexcept {
93 command_buffers[session_id].buffer = buffer; 94 command_buffers[session_id].buffer = buffer;
94 command_buffers[session_id].size = size; 95 command_buffers[session_id].size = size;
95 command_buffers[session_id].time_limit = time_limit; 96 command_buffers[session_id].time_limit = time_limit;
96 command_buffers[session_id].applet_resource_user_id = applet_resource_user_id; 97 command_buffers[session_id].applet_resource_user_id = applet_resource_user_id;
98 command_buffers[session_id].process = process;
97 command_buffers[session_id].reset_buffer = reset; 99 command_buffers[session_id].reset_buffer = reset;
98} 100}
99 101
@@ -173,7 +175,8 @@ void AudioRenderer::Main(std::stop_token stop_token) {
173 // If there are no remaining commands (from the previous list), 175 // If there are no remaining commands (from the previous list),
174 // this is a new command list, initialize it. 176 // this is a new command list, initialize it.
175 if (command_buffer.remaining_command_count == 0) { 177 if (command_buffer.remaining_command_count == 0) {
176 command_list_processor.Initialize(system, command_buffer.buffer, 178 command_list_processor.Initialize(system, *command_buffer.process,
179 command_buffer.buffer,
177 command_buffer.size, streams[index]); 180 command_buffer.size, streams[index]);
178 } 181 }
179 182
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 {
19class System; 19class System;
20} // namespace Core 20} // namespace Core
21 21
22namespace Kernel {
23class KProcess;
24}
25
22namespace AudioCore { 26namespace AudioCore {
23namespace Sink { 27namespace Sink {
24class Sink; 28class Sink;
@@ -69,7 +73,8 @@ public:
69 u32 Receive(Direction dir); 73 u32 Receive(Direction dir);
70 74
71 void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit, 75 void SetCommandBuffer(s32 session_id, CpuAddr buffer, u64 size, u64 time_limit,
72 u64 applet_resource_user_id, bool reset) noexcept; 76 u64 applet_resource_user_id, Kernel::KProcess* process,
77 bool reset) noexcept;
73 u32 GetRemainCommandCount(s32 session_id) const noexcept; 78 u32 GetRemainCommandCount(s32 session_id) const noexcept;
74 void ClearRemainCommandCount(s32 session_id) noexcept; 79 void ClearRemainCommandCount(s32 session_id) noexcept;
75 u64 GetRenderingStartTick(s32 session_id) const noexcept; 80 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 @@
6#include "audio_core/common/common.h" 6#include "audio_core/common/common.h"
7#include "common/common_types.h" 7#include "common/common_types.h"
8 8
9namespace Kernel {
10class KProcess;
11}
12
9namespace AudioCore::ADSP::AudioRenderer { 13namespace AudioCore::ADSP::AudioRenderer {
10 14
11struct CommandBuffer { 15struct CommandBuffer {
@@ -14,6 +18,7 @@ struct CommandBuffer {
14 u64 size{}; 18 u64 size{};
15 u64 time_limit{}; 19 u64 time_limit{};
16 u64 applet_resource_user_id{}; 20 u64 applet_resource_user_id{};
21 Kernel::KProcess* process{};
17 bool reset_buffer{}; 22 bool reset_buffer{};
18 // Set by the DSP 23 // Set by the DSP
19 u32 remaining_command_count{}; 24 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 @@
9#include "common/settings.h" 9#include "common/settings.h"
10#include "core/core.h" 10#include "core/core.h"
11#include "core/core_timing.h" 11#include "core/core_timing.h"
12#include "core/hle/kernel/k_process.h"
12#include "core/memory.h" 13#include "core/memory.h"
13 14
14namespace AudioCore::ADSP::AudioRenderer { 15namespace AudioCore::ADSP::AudioRenderer {
15 16
16void CommandListProcessor::Initialize(Core::System& system_, CpuAddr buffer, u64 size, 17void CommandListProcessor::Initialize(Core::System& system_, Kernel::KProcess& process,
17 Sink::SinkStream* stream_) { 18 CpuAddr buffer, u64 size, Sink::SinkStream* stream_) {
18 system = &system_; 19 system = &system_;
19 memory = &system->ApplicationMemory(); 20 memory = &process.GetMemory();
20 stream = stream_; 21 stream = stream_;
21 header = reinterpret_cast<Renderer::CommandListHeader*>(buffer); 22 header = reinterpret_cast<Renderer::CommandListHeader*>(buffer);
22 commands = reinterpret_cast<u8*>(buffer + sizeof(Renderer::CommandListHeader)); 23 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;
16class System; 16class System;
17} // namespace Core 17} // namespace Core
18 18
19namespace Kernel {
20class KProcess;
21}
22
19namespace AudioCore { 23namespace AudioCore {
20namespace Sink { 24namespace Sink {
21class SinkStream; 25class SinkStream;
@@ -40,7 +44,8 @@ public:
40 * @param size - The size of the buffer. 44 * @param size - The size of the buffer.
41 * @param stream - The stream to be used for sending the samples. 45 * @param stream - The stream to be used for sending the samples.
42 */ 46 */
43 void Initialize(Core::System& system, CpuAddr buffer, u64 size, Sink::SinkStream* stream); 47 void Initialize(Core::System& system, Kernel::KProcess& process, CpuAddr buffer, u64 size,
48 Sink::SinkStream* stream);
44 49
45 /** 50 /**
46 * Set the maximum processing time for this command list. 51 * Set the maximum processing time for this command list.
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 @@
6#include "audio_core/renderer/audio_renderer.h" 6#include "audio_core/renderer/audio_renderer.h"
7#include "audio_core/renderer/system_manager.h" 7#include "audio_core/renderer/system_manager.h"
8#include "core/core.h" 8#include "core/core.h"
9#include "core/hle/kernel/k_process.h"
9#include "core/hle/kernel/k_transfer_memory.h" 10#include "core/hle/kernel/k_transfer_memory.h"
10#include "core/hle/service/audio/errors.h" 11#include "core/hle/service/audio/errors.h"
11 12
@@ -17,7 +18,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren
17Result Renderer::Initialize(const AudioRendererParameterInternal& params, 18Result Renderer::Initialize(const AudioRendererParameterInternal& params,
18 Kernel::KTransferMemory* transfer_memory, 19 Kernel::KTransferMemory* transfer_memory,
19 const u64 transfer_memory_size, const u32 process_handle, 20 const u64 transfer_memory_size, const u32 process_handle,
20 const u64 applet_resource_user_id, const s32 session_id) { 21 Kernel::KProcess& process, const u64 applet_resource_user_id,
22 const s32 session_id) {
21 if (params.execution_mode == ExecutionMode::Auto) { 23 if (params.execution_mode == ExecutionMode::Auto) {
22 if (!manager.AddSystem(system)) { 24 if (!manager.AddSystem(system)) {
23 LOG_ERROR(Service_Audio, 25 LOG_ERROR(Service_Audio,
@@ -28,7 +30,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params,
28 } 30 }
29 31
30 initialized = true; 32 initialized = true;
31 system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, 33 system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process,
32 applet_resource_user_id, session_id); 34 applet_resource_user_id, session_id);
33 35
34 return ResultSuccess; 36 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;
14 14
15namespace Kernel { 15namespace Kernel {
16class KTransferMemory; 16class KTransferMemory;
17} 17class KProcess;
18} // namespace Kernel
18 19
19namespace AudioCore { 20namespace AudioCore {
20struct AudioRendererParameterInternal; 21struct AudioRendererParameterInternal;
@@ -44,7 +45,8 @@ public:
44 */ 45 */
45 Result Initialize(const AudioRendererParameterInternal& params, 46 Result Initialize(const AudioRendererParameterInternal& params,
46 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 47 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
47 u32 process_handle, u64 applet_resource_user_id, s32 session_id); 48 u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id,
49 s32 session_id);
48 50
49 /** 51 /**
50 * Finalize the renderer for shutdown. 52 * Finalize the renderer for shutdown.
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 @@
32#include "core/core.h" 32#include "core/core.h"
33#include "core/core_timing.h" 33#include "core/core_timing.h"
34#include "core/hle/kernel/k_event.h" 34#include "core/hle/kernel/k_event.h"
35#include "core/hle/kernel/k_process.h"
35#include "core/hle/kernel/k_transfer_memory.h" 36#include "core/hle/kernel/k_transfer_memory.h"
36#include "core/memory.h" 37#include "core/memory.h"
37 38
@@ -101,7 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_)
101 102
102Result System::Initialize(const AudioRendererParameterInternal& params, 103Result System::Initialize(const AudioRendererParameterInternal& params,
103 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 104 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
104 u32 process_handle_, u64 applet_resource_user_id_, s32 session_id_) { 105 u32 process_handle_, Kernel::KProcess& process_,
106 u64 applet_resource_user_id_, s32 session_id_) {
105 if (!CheckValidRevision(params.revision)) { 107 if (!CheckValidRevision(params.revision)) {
106 return Service::Audio::ResultInvalidRevision; 108 return Service::Audio::ResultInvalidRevision;
107 } 109 }
@@ -117,6 +119,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
117 behavior.SetUserLibRevision(params.revision); 119 behavior.SetUserLibRevision(params.revision);
118 120
119 process_handle = process_handle_; 121 process_handle = process_handle_;
122 process = &process_;
120 applet_resource_user_id = applet_resource_user_id_; 123 applet_resource_user_id = applet_resource_user_id_;
121 session_id = session_id_; 124 session_id = session_id_;
122 125
@@ -129,7 +132,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
129 render_device = params.rendering_device; 132 render_device = params.rendering_device;
130 execution_mode = params.execution_mode; 133 execution_mode = params.execution_mode;
131 134
132 core.ApplicationMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); 135 process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size);
133 136
134 // Note: We're not actually using the transfer memory because it's a pain to code for. 137 // Note: We're not actually using the transfer memory because it's a pain to code for.
135 // Allocate the memory normally instead and hope the game doesn't try to read anything back 138 // Allocate the memory normally instead and hope the game doesn't try to read anything back
@@ -613,7 +616,8 @@ void System::SendCommandToDsp() {
613 static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * 616 static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
614 (static_cast<f32>(render_time_limit_percent) / 100.0f))}; 617 (static_cast<f32>(render_time_limit_percent) / 100.0f))};
615 audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, 618 audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit,
616 applet_resource_user_id, reset_command_buffers); 619 applet_resource_user_id, process,
620 reset_command_buffers);
617 reset_command_buffers = false; 621 reset_command_buffers = false;
618 command_buffer_size = command_size; 622 command_buffer_size = command_size;
619 if (remaining_command_count == 0) { 623 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;
29 29
30namespace Kernel { 30namespace Kernel {
31class KEvent; 31class KEvent;
32class KProcess;
32class KTransferMemory; 33class KTransferMemory;
33} // namespace Kernel 34} // namespace Kernel
34 35
@@ -80,7 +81,8 @@ public:
80 */ 81 */
81 Result Initialize(const AudioRendererParameterInternal& params, 82 Result Initialize(const AudioRendererParameterInternal& params,
82 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 83 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
83 u32 process_handle, u64 applet_resource_user_id, s32 session_id); 84 u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id,
85 s32 session_id);
84 86
85 /** 87 /**
86 * Finalize the system. 88 * Finalize the system.
@@ -275,6 +277,8 @@ private:
275 Common::Event terminate_event{}; 277 Common::Event terminate_event{};
276 /// Does what locks do 278 /// Does what locks do
277 std::mutex lock{}; 279 std::mutex lock{};
280 /// Process this audio render is operating within, used for memory reads/writes.
281 Kernel::KProcess* process{};
278 /// Handle for the process for this system, unused 282 /// Handle for the process for this system, unused
279 u32 process_handle{}; 283 u32 process_handle{};
280 /// Applet resource id for this system, unused 284 /// Applet resource id for this system, unused
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index 05581e6e0..10108abc0 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -35,10 +35,11 @@ public:
35 explicit IAudioRenderer(Core::System& system_, Manager& manager_, 35 explicit IAudioRenderer(Core::System& system_, Manager& manager_,
36 AudioCore::AudioRendererParameterInternal& params, 36 AudioCore::AudioRendererParameterInternal& params,
37 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 37 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
38 u32 process_handle, u64 applet_resource_user_id, s32 session_id) 38 u32 process_handle, Kernel::KProcess& process_,
39 u64 applet_resource_user_id, s32 session_id)
39 : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, 40 : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"},
40 rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, 41 rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_},
41 impl{std::make_unique<Renderer>(system_, manager, rendered_event)} { 42 impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process{process_} {
42 // clang-format off 43 // clang-format off
43 static const FunctionInfo functions[] = { 44 static const FunctionInfo functions[] = {
44 {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, 45 {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"},
@@ -59,13 +60,15 @@ public:
59 // clang-format on 60 // clang-format on
60 RegisterHandlers(functions); 61 RegisterHandlers(functions);
61 62
62 impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, 63 process.Open();
64 impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, process,
63 applet_resource_user_id, session_id); 65 applet_resource_user_id, session_id);
64 } 66 }
65 67
66 ~IAudioRenderer() override { 68 ~IAudioRenderer() override {
67 impl->Finalize(); 69 impl->Finalize();
68 service_context.CloseEvent(rendered_event); 70 service_context.CloseEvent(rendered_event);
71 process.Close();
69 } 72 }
70 73
71private: 74private:
@@ -235,6 +238,7 @@ private:
235 Kernel::KEvent* rendered_event; 238 Kernel::KEvent* rendered_event;
236 Manager& manager; 239 Manager& manager;
237 std::unique_ptr<Renderer> impl; 240 std::unique_ptr<Renderer> impl;
241 Kernel::KProcess& process;
238 Common::ScratchBuffer<u8> output_buffer; 242 Common::ScratchBuffer<u8> output_buffer;
239 Common::ScratchBuffer<u8> performance_buffer; 243 Common::ScratchBuffer<u8> performance_buffer;
240}; 244};
@@ -455,7 +459,7 @@ void AudRenU::OpenAudioRenderer(HLERequestContext& ctx) {
455 return; 459 return;
456 } 460 }
457 461
458 auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle)}; 462 auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle).GetPointerUnsafe()};
459 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)}; 463 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
460 464
461 const auto session_id{impl->GetSessionId()}; 465 const auto session_id{impl->GetSessionId()};
@@ -472,7 +476,7 @@ void AudRenU::OpenAudioRenderer(HLERequestContext& ctx) {
472 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 476 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
473 rb.Push(ResultSuccess); 477 rb.Push(ResultSuccess);
474 rb.PushIpcInterface<IAudioRenderer>(system, *impl, params, transfer_memory.GetPointerUnsafe(), 478 rb.PushIpcInterface<IAudioRenderer>(system, *impl, params, transfer_memory.GetPointerUnsafe(),
475 transfer_memory_size, process_handle, 479 transfer_memory_size, process_handle, *process,
476 applet_resource_user_id, session_id); 480 applet_resource_user_id, session_id);
477} 481}
478 482
@@ -522,7 +526,7 @@ void AudRenU::GetAudioDeviceService(HLERequestContext& ctx) {
522} 526}
523 527
524void AudRenU::OpenAudioRendererForManualExecution(HLERequestContext& ctx) { 528void AudRenU::OpenAudioRendererForManualExecution(HLERequestContext& ctx) {
525 LOG_DEBUG(Service_Audio, "called"); 529 LOG_ERROR(Service_Audio, "called. Implement me!");
526} 530}
527 531
528void AudRenU::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) { 532void AudRenU::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) {