Merge pull request #8915 from vonchenplus/opus_multi_stream
core: implement HwOpus GetWorkBufferSizeForMultiStreamEx
This commit is contained in:
		| @@ -255,6 +255,32 @@ void HwOpus::GetWorkBufferSizeEx(Kernel::HLERequestContext& ctx) { | ||||
|     GetWorkBufferSize(ctx); | ||||
| } | ||||
|  | ||||
| void HwOpus::GetWorkBufferSizeForMultiStreamEx(Kernel::HLERequestContext& ctx) { | ||||
|     OpusMultiStreamParametersEx param; | ||||
|     std::memcpy(¶m, ctx.ReadBuffer().data(), ctx.GetReadBufferSize()); | ||||
|  | ||||
|     const auto sample_rate = param.sample_rate; | ||||
|     const auto channel_count = param.channel_count; | ||||
|     const auto number_streams = param.number_streams; | ||||
|     const auto number_stereo_streams = param.number_stereo_streams; | ||||
|  | ||||
|     LOG_DEBUG( | ||||
|         Audio, | ||||
|         "called with sample_rate={}, channel_count={}, number_streams={}, number_stereo_streams={}", | ||||
|         sample_rate, channel_count, number_streams, number_stereo_streams); | ||||
|  | ||||
|     ASSERT_MSG(sample_rate == 48000 || sample_rate == 24000 || sample_rate == 16000 || | ||||
|                    sample_rate == 12000 || sample_rate == 8000, | ||||
|                "Invalid sample rate"); | ||||
|  | ||||
|     const u32 worker_buffer_sz = | ||||
|         static_cast<u32>(opus_multistream_decoder_get_size(number_streams, number_stereo_streams)); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push<u32>(worker_buffer_sz); | ||||
| } | ||||
|  | ||||
| void HwOpus::OpenHardwareOpusDecoder(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto sample_rate = rp.Pop<u32>(); | ||||
| @@ -335,7 +361,7 @@ HwOpus::HwOpus(Core::System& system_) : ServiceFramework{system_, "hwopus"} { | ||||
|         {4, &HwOpus::OpenHardwareOpusDecoderEx, "OpenHardwareOpusDecoderEx"}, | ||||
|         {5, &HwOpus::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"}, | ||||
|         {6, nullptr, "OpenHardwareOpusDecoderForMultiStreamEx"}, | ||||
|         {7, nullptr, "GetWorkBufferSizeForMultiStreamEx"}, | ||||
|         {7, &HwOpus::GetWorkBufferSizeForMultiStreamEx, "GetWorkBufferSizeForMultiStreamEx"}, | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|   | ||||
| @@ -11,6 +11,16 @@ class System; | ||||
|  | ||||
| namespace Service::Audio { | ||||
|  | ||||
| struct OpusMultiStreamParametersEx { | ||||
|     u32 sample_rate; | ||||
|     u32 channel_count; | ||||
|     u32 number_streams; | ||||
|     u32 number_stereo_streams; | ||||
|     u32 use_large_frame_size; | ||||
|     u32 padding; | ||||
|     std::array<u32, 64> channel_mappings; | ||||
| }; | ||||
|  | ||||
| class HwOpus final : public ServiceFramework<HwOpus> { | ||||
| public: | ||||
|     explicit HwOpus(Core::System& system_); | ||||
| @@ -21,6 +31,7 @@ private: | ||||
|     void OpenHardwareOpusDecoderEx(Kernel::HLERequestContext& ctx); | ||||
|     void GetWorkBufferSize(Kernel::HLERequestContext& ctx); | ||||
|     void GetWorkBufferSizeEx(Kernel::HLERequestContext& ctx); | ||||
|     void GetWorkBufferSizeForMultiStreamEx(Kernel::HLERequestContext& ctx); | ||||
| }; | ||||
|  | ||||
| } // namespace Service::Audio | ||||
|   | ||||
		Reference in New Issue
	
	Block a user