|
|
@@ -3,241 +3,154 @@
|
|
|
|
|
|
#include "core/hle/service/audio/hardware_opus_decoder.h"
|
|
|
#include "core/hle/service/audio/hardware_opus_decoder_manager.h"
|
|
|
-#include "core/hle/service/ipc_helpers.h"
|
|
|
+#include "core/hle/service/cmif_serialization.h"
|
|
|
|
|
|
namespace Service::Audio {
|
|
|
|
|
|
using namespace AudioCore::OpusDecoder;
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::OpenHardwareOpusDecoder(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
+IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
|
|
|
+ : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
|
|
|
+ // clang-format off
|
|
|
+ static const FunctionInfo functions[] = {
|
|
|
+ {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
|
|
|
+ {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
|
|
|
+ {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
|
|
|
+ {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
|
|
|
+ {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
|
|
|
+ {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
|
|
|
+ {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
|
|
|
+ {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
|
|
|
+ {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
|
|
|
+ {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"},
|
|
|
+ };
|
|
|
+ // clang-format on
|
|
|
+ RegisterHandlers(functions);
|
|
|
+}
|
|
|
|
|
|
- auto params = rp.PopRaw<OpusParameters>();
|
|
|
- auto transfer_memory_size{rp.Pop<u32>()};
|
|
|
- auto transfer_memory_handle{ctx.GetCopyHandle(0)};
|
|
|
- auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
|
|
|
+IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
|
|
|
|
|
|
- LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, transfer_memory_size);
|
|
|
+Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoder(
|
|
|
+ Out<SharedPointer<IHardwareOpusDecoder>> out_decoder, OpusParameters params, u32 tmem_size,
|
|
|
+ InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
|
|
|
+ LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size {:#x}",
|
|
|
+ params.sample_rate, params.channel_count, tmem_size);
|
|
|
|
|
|
auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
|
|
|
-
|
|
|
OpusParametersEx ex{
|
|
|
.sample_rate = params.sample_rate,
|
|
|
.channel_count = params.channel_count,
|
|
|
.use_large_frame_size = false,
|
|
|
};
|
|
|
- auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
|
|
|
+ R_TRY(decoder->Initialize(ex, tmem_handle.Get(), tmem_size));
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
- rb.Push(result);
|
|
|
- rb.PushIpcInterface(decoder);
|
|
|
+ *out_decoder = decoder;
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSize(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
- auto params = rp.PopRaw<OpusParameters>();
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSize(params, size);
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} -- returned size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSize(Out<u32> out_size, OpusParameters params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSize(params, *out_size));
|
|
|
+ LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} -- returned size {:#x}",
|
|
|
+ params.sample_rate, params.channel_count, *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto input{ctx.ReadBuffer()};
|
|
|
- OpusMultiStreamParameters params;
|
|
|
- std::memcpy(¶ms, input.data(), sizeof(OpusMultiStreamParameters));
|
|
|
-
|
|
|
- auto transfer_memory_size{rp.Pop<u32>()};
|
|
|
- auto transfer_memory_handle{ctx.GetCopyHandle(0)};
|
|
|
- auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
|
|
|
-
|
|
|
+Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream(
|
|
|
+ Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
|
|
|
+ InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params, u32 tmem_size,
|
|
|
+ InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
|
|
|
LOG_DEBUG(Service_Audio,
|
|
|
"sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
|
|
|
- "transfer_memory_size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, params.total_stream_count,
|
|
|
- params.stereo_stream_count, transfer_memory_size);
|
|
|
+ "transfer_memory_size {:#x}",
|
|
|
+ params->sample_rate, params->channel_count, params->total_stream_count,
|
|
|
+ params->stereo_stream_count, tmem_size);
|
|
|
|
|
|
auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
|
|
|
|
|
|
OpusMultiStreamParametersEx ex{
|
|
|
- .sample_rate = params.sample_rate,
|
|
|
- .channel_count = params.channel_count,
|
|
|
- .total_stream_count = params.total_stream_count,
|
|
|
- .stereo_stream_count = params.stereo_stream_count,
|
|
|
+ .sample_rate = params->sample_rate,
|
|
|
+ .channel_count = params->channel_count,
|
|
|
+ .total_stream_count = params->total_stream_count,
|
|
|
+ .stereo_stream_count = params->stereo_stream_count,
|
|
|
.use_large_frame_size = false,
|
|
|
.mappings{},
|
|
|
};
|
|
|
- std::memcpy(ex.mappings.data(), params.mappings.data(), sizeof(params.mappings));
|
|
|
- auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
|
|
|
+ std::memcpy(ex.mappings.data(), params->mappings.data(), sizeof(params->mappings));
|
|
|
+ R_TRY(decoder->Initialize(ex, tmem_handle.Get(), tmem_size));
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
- rb.Push(result);
|
|
|
- rb.PushIpcInterface(decoder);
|
|
|
+ *out_decoder = decoder;
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto input{ctx.ReadBuffer()};
|
|
|
- OpusMultiStreamParameters params;
|
|
|
- std::memcpy(¶ms, input.data(), sizeof(OpusMultiStreamParameters));
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSizeForMultiStream(params, size);
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream(
|
|
|
+ Out<u32> out_size, InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSizeForMultiStream(*params, *out_size));
|
|
|
+ LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto params = rp.PopRaw<OpusParametersEx>();
|
|
|
- auto transfer_memory_size{rp.Pop<u32>()};
|
|
|
- auto transfer_memory_handle{ctx.GetCopyHandle(0)};
|
|
|
- auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, transfer_memory_size);
|
|
|
+Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx(
|
|
|
+ Out<SharedPointer<IHardwareOpusDecoder>> out_decoder, OpusParametersEx params, u32 tmem_size,
|
|
|
+ InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
|
|
|
+ LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size {:#x}",
|
|
|
+ params.sample_rate, params.channel_count, tmem_size);
|
|
|
|
|
|
auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
|
|
|
+ R_TRY(decoder->Initialize(params, tmem_handle.Get(), tmem_size));
|
|
|
|
|
|
- auto result =
|
|
|
- decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
- rb.Push(result);
|
|
|
- rb.PushIpcInterface(decoder);
|
|
|
+ *out_decoder = decoder;
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSizeEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
- auto params = rp.PopRaw<OpusParametersEx>();
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSizeEx(params, size);
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSizeEx(Out<u32> out_size,
|
|
|
+ OpusParametersEx params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSizeEx(params, *out_size));
|
|
|
+ LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto input{ctx.ReadBuffer()};
|
|
|
- OpusMultiStreamParametersEx params;
|
|
|
- std::memcpy(¶ms, input.data(), sizeof(OpusMultiStreamParametersEx));
|
|
|
-
|
|
|
- auto transfer_memory_size{rp.Pop<u32>()};
|
|
|
- auto transfer_memory_handle{ctx.GetCopyHandle(0)};
|
|
|
- auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
|
|
|
-
|
|
|
+Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx(
|
|
|
+ Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
|
|
|
+ InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params, u32 tmem_size,
|
|
|
+ InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
|
|
|
LOG_DEBUG(Service_Audio,
|
|
|
"sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
|
|
|
"use_large_frame_size {}"
|
|
|
- "transfer_memory_size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, params.total_stream_count,
|
|
|
- params.stereo_stream_count, params.use_large_frame_size, transfer_memory_size);
|
|
|
+ "transfer_memory_size {:#x}",
|
|
|
+ params->sample_rate, params->channel_count, params->total_stream_count,
|
|
|
+ params->stereo_stream_count, params->use_large_frame_size, tmem_size);
|
|
|
|
|
|
auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
|
|
|
|
|
|
- auto result =
|
|
|
- decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
|
|
|
+ R_TRY(decoder->Initialize(*params, tmem_handle.Get(), tmem_size));
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
- rb.Push(result);
|
|
|
- rb.PushIpcInterface(decoder);
|
|
|
+ *out_decoder = decoder;
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto input{ctx.ReadBuffer()};
|
|
|
- OpusMultiStreamParametersEx params;
|
|
|
- std::memcpy(¶ms, input.data(), sizeof(OpusMultiStreamParametersEx));
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSizeForMultiStreamEx(params, size);
|
|
|
-
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(
|
|
|
+ Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSizeForMultiStreamEx(*params, *out_size));
|
|
|
LOG_DEBUG(Service_Audio,
|
|
|
"sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
|
|
|
- "use_large_frame_size {} -- returned size 0x{:X}",
|
|
|
- params.sample_rate, params.channel_count, params.total_stream_count,
|
|
|
- params.stereo_stream_count, params.use_large_frame_size, size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
-}
|
|
|
-
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSizeExEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
- auto params = rp.PopRaw<OpusParametersEx>();
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSizeExEx(params, size);
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
+ "use_large_frame_size {} -- returned size {:#x}",
|
|
|
+ params->sample_rate, params->channel_count, params->total_stream_count,
|
|
|
+ params->stereo_stream_count, params->use_large_frame_size, *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx) {
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
-
|
|
|
- auto input{ctx.ReadBuffer()};
|
|
|
- OpusMultiStreamParametersEx params;
|
|
|
- std::memcpy(¶ms, input.data(), sizeof(OpusMultiStreamParametersEx));
|
|
|
-
|
|
|
- u64 size{};
|
|
|
- auto result = impl.GetWorkBufferSizeForMultiStreamExEx(params, size);
|
|
|
-
|
|
|
- LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
|
|
|
-
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
- rb.Push(result);
|
|
|
- rb.Push(size);
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSizeExEx(Out<u32> out_size,
|
|
|
+ OpusParametersEx params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSizeExEx(params, *out_size));
|
|
|
+ LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
|
|
|
- : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
|
|
|
- static const FunctionInfo functions[] = {
|
|
|
- {0, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoder, "OpenHardwareOpusDecoder"},
|
|
|
- {1, &IHardwareOpusDecoderManager::GetWorkBufferSize, "GetWorkBufferSize"},
|
|
|
- {2, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream,
|
|
|
- "OpenOpusDecoderForMultiStream"},
|
|
|
- {3, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream,
|
|
|
- "GetWorkBufferSizeForMultiStream"},
|
|
|
- {4, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx, "OpenHardwareOpusDecoderEx"},
|
|
|
- {5, &IHardwareOpusDecoderManager::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"},
|
|
|
- {6, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx,
|
|
|
- "OpenHardwareOpusDecoderForMultiStreamEx"},
|
|
|
- {7, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx,
|
|
|
- "GetWorkBufferSizeForMultiStreamEx"},
|
|
|
- {8, &IHardwareOpusDecoderManager::GetWorkBufferSizeExEx, "GetWorkBufferSizeExEx"},
|
|
|
- {9, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx,
|
|
|
- "GetWorkBufferSizeForMultiStreamExEx"},
|
|
|
- };
|
|
|
- RegisterHandlers(functions);
|
|
|
+Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(
|
|
|
+ Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params) {
|
|
|
+ R_TRY(impl.GetWorkBufferSizeForMultiStreamExEx(*params, *out_size));
|
|
|
+ LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
|
|
|
|
-IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
|
|
|
-
|
|
|
} // namespace Service::Audio
|