yuzu-emu
/
yuzu
Archived
1
0
Fork 0

audio: rewrite IHardwareOpusDecoderManager

This commit is contained in:
Liam 2024-02-20 20:42:28 -05:00
parent 0471e54e5a
commit ea4703cb31
17 changed files with 273 additions and 340 deletions

View File

@ -28,8 +28,8 @@ OpusDecoder::~OpusDecoder() {
} }
} }
Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, Result OpusDecoder::Initialize(const OpusParametersEx& params,
u64 transfer_memory_size) { Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) {
auto frame_size{params.use_large_frame_size ? 5760 : 1920}; auto frame_size{params.use_large_frame_size ? 5760 : 1920};
shared_buffer_size = transfer_memory_size; shared_buffer_size = transfer_memory_size;
shared_buffer = std::make_unique<u8[]>(shared_buffer_size); shared_buffer = std::make_unique<u8[]>(shared_buffer_size);
@ -59,7 +59,7 @@ Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory
R_SUCCEED(); R_SUCCEED();
} }
Result OpusDecoder::Initialize(OpusMultiStreamParametersEx& params, Result OpusDecoder::Initialize(const OpusMultiStreamParametersEx& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) {
auto frame_size{params.use_large_frame_size ? 5760 : 1920}; auto frame_size{params.use_large_frame_size ? 5760 : 1920};
shared_buffer_size = transfer_memory_size; shared_buffer_size = transfer_memory_size;

View File

@ -22,10 +22,10 @@ public:
explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_); explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_);
~OpusDecoder(); ~OpusDecoder();
Result Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, Result Initialize(const OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory,
u64 transfer_memory_size);
Result Initialize(OpusMultiStreamParametersEx& params, Kernel::KTransferMemory* transfer_memory,
u64 transfer_memory_size); u64 transfer_memory_size);
Result Initialize(const OpusMultiStreamParametersEx& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count, Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count,
std::span<const u8> input_data, std::span<u8> output_data, bool reset); std::span<const u8> input_data, std::span<u8> output_data, bool reset);
Result SetContext([[maybe_unused]] std::span<const u8> context); Result SetContext([[maybe_unused]] std::span<const u8> context);

View File

@ -38,7 +38,7 @@ OpusDecoderManager::OpusDecoderManager(Core::System& system_)
} }
} }
Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_size) { Result OpusDecoderManager::GetWorkBufferSize(const OpusParameters& params, u32& out_size) {
OpusParametersEx ex{ OpusParametersEx ex{
.sample_rate = params.sample_rate, .sample_rate = params.sample_rate,
.channel_count = params.channel_count, .channel_count = params.channel_count,
@ -47,11 +47,11 @@ Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_si
R_RETURN(GetWorkBufferSizeExEx(ex, out_size)); R_RETURN(GetWorkBufferSizeExEx(ex, out_size));
} }
Result OpusDecoderManager::GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size) { Result OpusDecoderManager::GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size) {
R_RETURN(GetWorkBufferSizeExEx(params, out_size)); R_RETURN(GetWorkBufferSizeExEx(params, out_size));
} }
Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size) { Result OpusDecoderManager::GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size) {
R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount); R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount);
R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate);
@ -63,8 +63,8 @@ Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64&
R_SUCCEED(); R_SUCCEED();
} }
Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params,
u64& out_size) { u32& out_size) {
OpusMultiStreamParametersEx ex{ OpusMultiStreamParametersEx ex{
.sample_rate = params.sample_rate, .sample_rate = params.sample_rate,
.channel_count = params.channel_count, .channel_count = params.channel_count,
@ -76,13 +76,13 @@ Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParame
R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size)); R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size));
} }
Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(
u64& out_size) { const OpusMultiStreamParametersEx& params, u32& out_size) {
R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size)); R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size));
} }
Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(
u64& out_size) { const OpusMultiStreamParametersEx& params, u32& out_size) {
R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount); R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount);
R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate);
R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count, R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count,

View File

@ -22,17 +22,19 @@ public:
return hardware_opus; return hardware_opus;
} }
Result GetWorkBufferSize(OpusParameters& params, u64& out_size); Result GetWorkBufferSize(const OpusParameters& params, u32& out_size);
Result GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size); Result GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size);
Result GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size); Result GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size);
Result GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, u64& out_size); Result GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params, u32& out_size);
Result GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, u64& out_size); Result GetWorkBufferSizeForMultiStreamEx(const OpusMultiStreamParametersEx& params,
Result GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, u64& out_size); u32& out_size);
Result GetWorkBufferSizeForMultiStreamExEx(const OpusMultiStreamParametersEx& params,
u32& out_size);
private: private:
Core::System& system; Core::System& system;
HardwareOpus hardware_opus; HardwareOpus hardware_opus;
std::array<u64, MaxChannels> required_workbuffer_sizes{}; std::array<u32, MaxChannels> required_workbuffer_sizes{};
}; };
} // namespace AudioCore::OpusDecoder } // namespace AudioCore::OpusDecoder

View File

@ -42,7 +42,7 @@ HardwareOpus::HardwareOpus(Core::System& system_)
opus_decoder.SetSharedMemory(shared_memory); opus_decoder.SetSharedMemory(shared_memory);
} }
u64 HardwareOpus::GetWorkBufferSize(u32 channel) { u32 HardwareOpus::GetWorkBufferSize(u32 channel) {
if (!opus_decoder.IsRunning()) { if (!opus_decoder.IsRunning()) {
return 0; return 0;
} }
@ -55,10 +55,10 @@ u64 HardwareOpus::GetWorkBufferSize(u32 channel) {
ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg); ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg);
return 0; return 0;
} }
return shared_memory.dsp_return_data[0]; return static_cast<u32>(shared_memory.dsp_return_data[0]);
} }
u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) { u32 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) {
std::scoped_lock l{mutex}; std::scoped_lock l{mutex};
shared_memory.host_send_data[0] = total_stream_count; shared_memory.host_send_data[0] = total_stream_count;
shared_memory.host_send_data[1] = stereo_stream_count; shared_memory.host_send_data[1] = stereo_stream_count;
@ -70,7 +70,7 @@ u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 st
ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg); ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg);
return 0; return 0;
} }
return shared_memory.dsp_return_data[0]; return static_cast<u32>(shared_memory.dsp_return_data[0]);
} }
Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer,
@ -94,8 +94,9 @@ Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count,
Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count,
u32 total_stream_count, u32 total_stream_count,
u32 stereo_stream_count, void* mappings, u32 stereo_stream_count,
void* buffer, u64 buffer_size) { const void* mappings, void* buffer,
u64 buffer_size) {
std::scoped_lock l{mutex}; std::scoped_lock l{mutex};
shared_memory.host_send_data[0] = (u64)buffer; shared_memory.host_send_data[0] = (u64)buffer;
shared_memory.host_send_data[1] = buffer_size; shared_memory.host_send_data[1] = buffer_size;

View File

@ -16,14 +16,14 @@ class HardwareOpus {
public: public:
HardwareOpus(Core::System& system); HardwareOpus(Core::System& system);
u64 GetWorkBufferSize(u32 channel); u32 GetWorkBufferSize(u32 channel);
u64 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count); u32 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count);
Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer,
u64 buffer_size); u64 buffer_size);
Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count,
u32 totaL_stream_count, u32 stereo_stream_count, u32 totaL_stream_count, u32 stereo_stream_count,
void* mappings, void* buffer, u64 buffer_size); const void* mappings, void* buffer, u64 buffer_size);
Result ShutdownDecodeObject(void* buffer, u64 buffer_size); Result ShutdownDecodeObject(void* buffer, u64 buffer_size);
Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size); Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size);
Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size, Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size,

View File

@ -16,23 +16,23 @@ IAudioController::IAudioController(Core::System& system_)
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, nullptr, "GetTargetVolume"}, {0, nullptr, "GetTargetVolume"},
{1, nullptr, "SetTargetVolume"}, {1, nullptr, "SetTargetVolume"},
{2, C<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
{3, C<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
{4, nullptr, "IsTargetMute"}, {4, nullptr, "IsTargetMute"},
{5, nullptr, "SetTargetMute"}, {5, nullptr, "SetTargetMute"},
{6, nullptr, "IsTargetConnected"}, {6, nullptr, "IsTargetConnected"},
{7, nullptr, "SetDefaultTarget"}, {7, nullptr, "SetDefaultTarget"},
{8, nullptr, "GetDefaultTarget"}, {8, nullptr, "GetDefaultTarget"},
{9, C<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
{10, C<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
{11, nullptr, "SetForceMutePolicy"}, {11, nullptr, "SetForceMutePolicy"},
{12, C<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
{13, C<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
{14, C<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
{15, nullptr, "SetOutputTarget"}, {15, nullptr, "SetOutputTarget"},
{16, nullptr, "SetInputTargetForceEnabled"}, {16, nullptr, "SetInputTargetForceEnabled"},
{17, C<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
{18, C<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
{19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
{20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
{21, nullptr, "GetAudioOutputTargetForPlayReport"}, {21, nullptr, "GetAudioOutputTargetForPlayReport"},
@ -44,11 +44,11 @@ IAudioController::IAudioController(Core::System& system_)
{27, nullptr, "SetVolumeMappingTableForDev"}, {27, nullptr, "SetVolumeMappingTableForDev"},
{28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
{29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
{30, C<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
{31, C<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
{32, nullptr, "GetActiveOutputTarget"}, {32, nullptr, "GetActiveOutputTarget"},
{33, nullptr, "GetTargetDeviceInfo"}, {33, nullptr, "GetTargetDeviceInfo"},
{34, C<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
{37, nullptr, "SetHearingProtectionSafeguardEnabled"}, {37, nullptr, "SetHearingProtectionSafeguardEnabled"},

View File

@ -16,21 +16,21 @@ IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id,
impl{std::make_shared<In>(system_, manager, event, session_id)} { impl{std::make_shared<In>(system_, manager, event, session_id)} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioIn::GetAudioInState>, "GetAudioInState"}, {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
{1, C<&IAudioIn::Start>, "Start"}, {1, D<&IAudioIn::Start>, "Start"},
{2, C<&IAudioIn::Stop>, "Stop"}, {2, D<&IAudioIn::Stop>, "Stop"},
{3, C<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
{4, C<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
{5, C<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
{6, C<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
{7, C<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
{8, C<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
{9, C<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
{10, C<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
{11, C<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
{12, C<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
{13, C<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
{14, C<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}, {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"},
}; };
// clang-format on // clang-format on

View File

@ -14,12 +14,12 @@ IAudioInManager::IAudioInManager(Core::System& system_)
impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)} { impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
{1, C<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
{2, C<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
{3, C<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
{4, C<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
{5, C<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}, {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"},
}; };
// clang-format on // clang-format on

View File

@ -21,20 +21,20 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
{1, C<&IAudioOut::Start>, "Start"}, {1, D<&IAudioOut::Start>, "Start"},
{2, C<&IAudioOut::Stop>, "Stop"}, {2, D<&IAudioOut::Stop>, "Stop"},
{3, C<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
{4, C<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
{5, C<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
{6, C<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
{7, C<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
{8, C<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
{9, C<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
{10, C<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
{11, C<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
{12, C<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
{13, C<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}, {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"},
}; };
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);

View File

@ -14,10 +14,10 @@ IAudioOutManager::IAudioOutManager(Core::System& system_)
: ServiceFramework{system_, "audout:u"}, impl{std::make_unique<Manager>(system_)} { : ServiceFramework{system_, "audout:u"}, impl{std::make_unique<Manager>(system_)} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
{1, C<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
{2, C<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
{3, C<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}, {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"},
}; };
// clang-format on // clang-format on

View File

@ -18,20 +18,20 @@ IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
process_handle{process_handle_} { process_handle{process_handle_} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
{1, C<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
{2, C<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
{3, C<&IAudioRenderer::GetState>, "GetState"}, {3, D<&IAudioRenderer::GetState>, "GetState"},
{4, C<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
{5, C<&IAudioRenderer::Start>, "Start"}, {5, D<&IAudioRenderer::Start>, "Start"},
{6, C<&IAudioRenderer::Stop>, "Stop"}, {6, D<&IAudioRenderer::Stop>, "Stop"},
{7, C<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
{8, C<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
{9, C<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
{10, C<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"},
{11, nullptr, "ExecuteAudioRendererRendering"}, {11, nullptr, "ExecuteAudioRendererRendering"},
{12, C<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"},
{13, C<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"},
}; };
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);

View File

@ -18,11 +18,11 @@ IAudioRendererManager::IAudioRendererManager(Core::System& system_)
: ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} { : ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
{1, C<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
{2, C<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
{3, nullptr, "OpenAudioRendererForManualExecution"}, {3, nullptr, "OpenAudioRendererForManualExecution"},
{4, C<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}, {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"},
}; };
// clang-format on // clang-format on

View File

@ -31,13 +31,13 @@ IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus&
IHardwareOpusDecoder::~IHardwareOpusDecoder() = default; IHardwareOpusDecoder::~IHardwareOpusDecoder() = default;
Result IHardwareOpusDecoder::Initialize(OpusParametersEx& params, Result IHardwareOpusDecoder::Initialize(const OpusParametersEx& params,
Kernel::KTransferMemory* transfer_memory, Kernel::KTransferMemory* transfer_memory,
u64 transfer_memory_size) { u64 transfer_memory_size) {
return impl->Initialize(params, transfer_memory, transfer_memory_size); return impl->Initialize(params, transfer_memory, transfer_memory_size);
} }
Result IHardwareOpusDecoder::Initialize(OpusMultiStreamParametersEx& params, Result IHardwareOpusDecoder::Initialize(const OpusMultiStreamParametersEx& params,
Kernel::KTransferMemory* transfer_memory, Kernel::KTransferMemory* transfer_memory,
u64 transfer_memory_size) { u64 transfer_memory_size) {
return impl->Initialize(params, transfer_memory, transfer_memory_size); return impl->Initialize(params, transfer_memory, transfer_memory_size);

View File

@ -14,9 +14,9 @@ public:
AudioCore::OpusDecoder::HardwareOpus& hardware_opus); AudioCore::OpusDecoder::HardwareOpus& hardware_opus);
~IHardwareOpusDecoder() override; ~IHardwareOpusDecoder() override;
Result Initialize(AudioCore::OpusDecoder::OpusParametersEx& params, Result Initialize(const AudioCore::OpusDecoder::OpusParametersEx& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size); Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
Result Initialize(AudioCore::OpusDecoder::OpusMultiStreamParametersEx& params, Result Initialize(const AudioCore::OpusDecoder::OpusMultiStreamParametersEx& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size); Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
private: private:

View File

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

View File

@ -4,30 +4,47 @@
#pragma once #pragma once
#include "audio_core/opus/decoder_manager.h" #include "audio_core/opus/decoder_manager.h"
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Core {
class System;
}
namespace Service::Audio { namespace Service::Audio {
class IHardwareOpusDecoder;
using AudioCore::OpusDecoder::OpusMultiStreamParameters;
using AudioCore::OpusDecoder::OpusMultiStreamParametersEx;
using AudioCore::OpusDecoder::OpusParameters;
using AudioCore::OpusDecoder::OpusParametersEx;
class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> { class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> {
public: public:
explicit IHardwareOpusDecoderManager(Core::System& system_); explicit IHardwareOpusDecoderManager(Core::System& system_);
~IHardwareOpusDecoderManager() override; ~IHardwareOpusDecoderManager() override;
private: private:
void OpenHardwareOpusDecoder(HLERequestContext& ctx); Result OpenHardwareOpusDecoder(Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
void GetWorkBufferSize(HLERequestContext& ctx); OpusParameters params, u32 tmem_size,
void OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx); InCopyHandle<Kernel::KTransferMemory> tmem_handle);
void GetWorkBufferSizeForMultiStream(HLERequestContext& ctx); Result GetWorkBufferSize(Out<u32> out_size, OpusParameters params);
void OpenHardwareOpusDecoderEx(HLERequestContext& ctx); Result OpenHardwareOpusDecoderForMultiStream(
void GetWorkBufferSizeEx(HLERequestContext& ctx); Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
void OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx); InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params, u32 tmem_size,
void GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx); InCopyHandle<Kernel::KTransferMemory> tmem_handle);
void GetWorkBufferSizeExEx(HLERequestContext& ctx); Result GetWorkBufferSizeForMultiStream(
void GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx); Out<u32> out_size, InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params);
Result OpenHardwareOpusDecoderEx(Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
OpusParametersEx params, u32 tmem_size,
InCopyHandle<Kernel::KTransferMemory> tmem_handle);
Result GetWorkBufferSizeEx(Out<u32> out_size, OpusParametersEx params);
Result OpenHardwareOpusDecoderForMultiStreamEx(
Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params, u32 tmem_size,
InCopyHandle<Kernel::KTransferMemory> tmem_handle);
Result GetWorkBufferSizeForMultiStreamEx(
Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
Result GetWorkBufferSizeExEx(Out<u32> out_size, OpusParametersEx params);
Result GetWorkBufferSizeForMultiStreamExEx(
Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
Core::System& system; Core::System& system;
AudioCore::OpusDecoder::OpusDecoderManager impl; AudioCore::OpusDecoder::OpusDecoderManager impl;