From d940974789b1b8ff473440883d8c506a275b9b3b Mon Sep 17 00:00:00 2001 From: Liam Date: Fri, 12 Jan 2024 09:35:08 -0500 Subject: audio: fetch process object from handle table --- src/audio_core/device/device_session.cpp | 14 +++++++++++--- src/audio_core/device/device_session.h | 12 ++++++++---- src/audio_core/in/audio_in_system.cpp | 2 +- src/audio_core/in/audio_in_system.h | 13 +++++++------ src/audio_core/out/audio_out_system.cpp | 4 ++-- src/audio_core/out/audio_out_system.h | 13 +++++++------ 6 files changed, 36 insertions(+), 22 deletions(-) (limited to 'src/audio_core') diff --git a/src/audio_core/device/device_session.cpp b/src/audio_core/device/device_session.cpp index ee42ae529..3c214ec00 100644 --- a/src/audio_core/device/device_session.cpp +++ b/src/audio_core/device/device_session.cpp @@ -10,6 +10,8 @@ #include "core/core_timing.h" #include "core/memory.h" +#include "core/hle/kernel/k_process.h" + namespace AudioCore { using namespace std::literals; @@ -25,7 +27,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 +38,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 +57,11 @@ void DeviceSession::Finalize() { sink->CloseStream(stream); stream = nullptr; } + + if (handle) { + handle->Close(); + handle = nullptr; + } } void DeviceSession::Start() { @@ -91,7 +99,7 @@ void DeviceSession::AppendBuffers(std::span buffers) { stream->AppendBuffer(new_buffer, tmp_samples); } else { Core::Memory::CpuGuestMemory samples( - system.ApplicationMemory(), buffer.samples, buffer.size / sizeof(s16)); + handle->GetMemory(), buffer.samples, buffer.size / sizeof(s16)); stream->AppendBuffer(new_buffer, samples); } } @@ -100,7 +108,7 @@ void DeviceSession::AppendBuffers(std::span 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 -- cgit v1.2.3