|
|
|
@ -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
|
|
|
|
|