Merge pull request #6526 from bunnei/doom-update
services: Misc. minor changes for latest SDK update.
This commit is contained in:
commit
432fab7c4f
|
@ -15,7 +15,7 @@ constexpr ResultCode ERR_INVALID_PARAMETERS{ErrorModule::Audio, 41};
|
||||||
constexpr ResultCode ERR_SPLITTER_SORT_FAILED{ErrorModule::Audio, 43};
|
constexpr ResultCode ERR_SPLITTER_SORT_FAILED{ErrorModule::Audio, 43};
|
||||||
} // namespace Audren
|
} // namespace Audren
|
||||||
|
|
||||||
constexpr u32_le CURRENT_PROCESS_REVISION = Common::MakeMagic('R', 'E', 'V', '8');
|
constexpr u32_le CURRENT_PROCESS_REVISION = Common::MakeMagic('R', 'E', 'V', '9');
|
||||||
constexpr std::size_t MAX_MIX_BUFFERS = 24;
|
constexpr std::size_t MAX_MIX_BUFFERS = 24;
|
||||||
constexpr std::size_t MAX_BIQUAD_FILTERS = 2;
|
constexpr std::size_t MAX_BIQUAD_FILTERS = 2;
|
||||||
constexpr std::size_t MAX_CHANNEL_COUNT = 6;
|
constexpr std::size_t MAX_CHANNEL_COUNT = 6;
|
||||||
|
|
|
@ -345,8 +345,12 @@ public:
|
||||||
explicit RequestParser(u32* command_buffer) : RequestHelperBase(command_buffer) {}
|
explicit RequestParser(u32* command_buffer) : RequestHelperBase(command_buffer) {}
|
||||||
|
|
||||||
explicit RequestParser(Kernel::HLERequestContext& ctx) : RequestHelperBase(ctx) {
|
explicit RequestParser(Kernel::HLERequestContext& ctx) : RequestHelperBase(ctx) {
|
||||||
|
// TIPC does not have data payload offset
|
||||||
|
if (!ctx.IsTipc()) {
|
||||||
ASSERT_MSG(ctx.GetDataPayloadOffset(), "context is incomplete");
|
ASSERT_MSG(ctx.GetDataPayloadOffset(), "context is incomplete");
|
||||||
Skip(ctx.GetDataPayloadOffset(), false);
|
Skip(ctx.GetDataPayloadOffset(), false);
|
||||||
|
}
|
||||||
|
|
||||||
// Skip the u64 command id, it's already stored in the context
|
// Skip the u64 command id, it's already stored in the context
|
||||||
static constexpr u32 CommandIdSize = 2;
|
static constexpr u32 CommandIdSize = 2;
|
||||||
Skip(CommandIdSize, false);
|
Skip(CommandIdSize, false);
|
||||||
|
|
|
@ -117,7 +117,7 @@ AOC_U::AOC_U(Core::System& system_)
|
||||||
{7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"},
|
{7, &AOC_U::PrepareAddOnContent, "PrepareAddOnContent"},
|
||||||
{8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"},
|
{8, &AOC_U::GetAddOnContentListChangedEvent, "GetAddOnContentListChangedEvent"},
|
||||||
{9, nullptr, "GetAddOnContentLostErrorCode"},
|
{9, nullptr, "GetAddOnContentLostErrorCode"},
|
||||||
{10, nullptr, "GetAddOnContentListChangedEventWithProcessId"},
|
{10, &AOC_U::GetAddOnContentListChangedEventWithProcessId, "GetAddOnContentListChangedEventWithProcessId"},
|
||||||
{100, &AOC_U::CreateEcPurchasedEventManager, "CreateEcPurchasedEventManager"},
|
{100, &AOC_U::CreateEcPurchasedEventManager, "CreateEcPurchasedEventManager"},
|
||||||
{101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"},
|
{101, &AOC_U::CreatePermanentEcPurchasedEventManager, "CreatePermanentEcPurchasedEventManager"},
|
||||||
{110, nullptr, "CreateContentsServiceManager"},
|
{110, nullptr, "CreateContentsServiceManager"},
|
||||||
|
@ -257,6 +257,14 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) {
|
||||||
rb.PushCopyObjects(aoc_change_event.GetReadableEvent());
|
rb.PushCopyObjects(aoc_change_event.GetReadableEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AOC_U::GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AOC, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushCopyObjects(aoc_change_event.GetReadableEvent());
|
||||||
|
}
|
||||||
|
|
||||||
void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) {
|
void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_AOC, "(STUBBED) called");
|
LOG_WARNING(Service_AOC, "(STUBBED) called");
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ private:
|
||||||
void GetAddOnContentBaseId(Kernel::HLERequestContext& ctx);
|
void GetAddOnContentBaseId(Kernel::HLERequestContext& ctx);
|
||||||
void PrepareAddOnContent(Kernel::HLERequestContext& ctx);
|
void PrepareAddOnContent(Kernel::HLERequestContext& ctx);
|
||||||
void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx);
|
void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx);
|
||||||
|
void GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestContext& ctx);
|
||||||
void CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
|
void CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
|
||||||
void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
|
void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,11 @@ void HwOpus::GetWorkBufferSize(Kernel::HLERequestContext& ctx) {
|
||||||
rb.Push<u32>(worker_buffer_sz);
|
rb.Push<u32>(worker_buffer_sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HwOpus::OpenOpusDecoder(Kernel::HLERequestContext& ctx) {
|
void HwOpus::GetWorkBufferSizeEx(Kernel::HLERequestContext& ctx) {
|
||||||
|
GetWorkBufferSize(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HwOpus::OpenHardwareOpusDecoder(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto sample_rate = rp.Pop<u32>();
|
const auto sample_rate = rp.Pop<u32>();
|
||||||
const auto channel_count = rp.Pop<u32>();
|
const auto channel_count = rp.Pop<u32>();
|
||||||
|
@ -291,14 +295,47 @@ void HwOpus::OpenOpusDecoder(Kernel::HLERequestContext& ctx) {
|
||||||
system, OpusDecoderState{std::move(decoder), sample_rate, channel_count});
|
system, OpusDecoderState{std::move(decoder), sample_rate, channel_count});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HwOpus::OpenHardwareOpusDecoderEx(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto sample_rate = rp.Pop<u32>();
|
||||||
|
const auto channel_count = rp.Pop<u32>();
|
||||||
|
|
||||||
|
LOG_CRITICAL(Audio, "called sample_rate={}, channel_count={}", sample_rate, channel_count);
|
||||||
|
|
||||||
|
ASSERT_MSG(sample_rate == 48000 || sample_rate == 24000 || sample_rate == 16000 ||
|
||||||
|
sample_rate == 12000 || sample_rate == 8000,
|
||||||
|
"Invalid sample rate");
|
||||||
|
ASSERT_MSG(channel_count == 1 || channel_count == 2, "Invalid channel count");
|
||||||
|
|
||||||
|
const int num_stereo_streams = channel_count == 2 ? 1 : 0;
|
||||||
|
const auto mapping_table = CreateMappingTable(channel_count);
|
||||||
|
|
||||||
|
int error = 0;
|
||||||
|
OpusDecoderPtr decoder{
|
||||||
|
opus_multistream_decoder_create(sample_rate, static_cast<int>(channel_count), 1,
|
||||||
|
num_stereo_streams, mapping_table.data(), &error)};
|
||||||
|
if (error != OPUS_OK || decoder == nullptr) {
|
||||||
|
LOG_ERROR(Audio, "Failed to create Opus decoder (error={}).", error);
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
// TODO(ogniK): Use correct error code
|
||||||
|
rb.Push(ResultUnknown);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<IHardwareOpusDecoderManager>(
|
||||||
|
system, OpusDecoderState{std::move(decoder), sample_rate, channel_count});
|
||||||
|
}
|
||||||
|
|
||||||
HwOpus::HwOpus(Core::System& system_) : ServiceFramework{system_, "hwopus"} {
|
HwOpus::HwOpus(Core::System& system_) : ServiceFramework{system_, "hwopus"} {
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, &HwOpus::OpenOpusDecoder, "OpenOpusDecoder"},
|
{0, &HwOpus::OpenHardwareOpusDecoder, "OpenHardwareOpusDecoder"},
|
||||||
{1, &HwOpus::GetWorkBufferSize, "GetWorkBufferSize"},
|
{1, &HwOpus::GetWorkBufferSize, "GetWorkBufferSize"},
|
||||||
{2, nullptr, "OpenOpusDecoderForMultiStream"},
|
{2, nullptr, "OpenOpusDecoderForMultiStream"},
|
||||||
{3, nullptr, "GetWorkBufferSizeForMultiStream"},
|
{3, nullptr, "GetWorkBufferSizeForMultiStream"},
|
||||||
{4, nullptr, "OpenHardwareOpusDecoderEx"},
|
{4, &HwOpus::OpenHardwareOpusDecoderEx, "OpenHardwareOpusDecoderEx"},
|
||||||
{5, nullptr, "GetWorkBufferSizeEx"},
|
{5, &HwOpus::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"},
|
||||||
{6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"},
|
{6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"},
|
||||||
{7, nullptr, "GetWorkBufferSizeForMultiStreamEx"},
|
{7, nullptr, "GetWorkBufferSizeForMultiStreamEx"},
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,8 +18,10 @@ public:
|
||||||
~HwOpus() override;
|
~HwOpus() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OpenOpusDecoder(Kernel::HLERequestContext& ctx);
|
void OpenHardwareOpusDecoder(Kernel::HLERequestContext& ctx);
|
||||||
|
void OpenHardwareOpusDecoderEx(Kernel::HLERequestContext& ctx);
|
||||||
void GetWorkBufferSize(Kernel::HLERequestContext& ctx);
|
void GetWorkBufferSize(Kernel::HLERequestContext& ctx);
|
||||||
|
void GetWorkBufferSizeEx(Kernel::HLERequestContext& ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::Audio
|
} // namespace Service::Audio
|
||||||
|
|
Reference in New Issue