Merge pull request #3811 from ogniK5377/audin-init
audin:u: ListAudioIns, OpenAudioIn, ListAudioInsAuto, OpenAudioInAuto, ListAudioInsAutoFiltered, OpenAudioInProtocolSpecified
This commit is contained in:
		| @@ -2,6 +2,9 @@ | |||||||
| // Licensed under GPLv2 or any later version | // Licensed under GPLv2 or any later version | ||||||
| // Refer to the license.txt file included. | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "common/logging/log.h" | ||||||
|  | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/kernel/hle_ipc.h" | ||||||
| #include "core/hle/service/audio/audin_u.h" | #include "core/hle/service/audio/audin_u.h" | ||||||
|  |  | ||||||
| namespace Service::Audio { | namespace Service::Audio { | ||||||
| @@ -36,11 +39,12 @@ public: | |||||||
| AudInU::AudInU() : ServiceFramework("audin:u") { | AudInU::AudInU() : ServiceFramework("audin:u") { | ||||||
|     // clang-format off |     // clang-format off | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0, nullptr, "ListAudioIns"}, |         {0, &AudInU::ListAudioIns, "ListAudioIns"}, | ||||||
|         {1, nullptr, "OpenAudioIn"}, |         {1, &AudInU::OpenAudioIn, "OpenAudioIn"}, | ||||||
|         {2, nullptr, "Unknown"}, |         {2, &AudInU::ListAudioIns, "ListAudioInsAuto"}, | ||||||
|         {3, nullptr, "OpenAudioInAuto"}, |         {3, &AudInU::OpenAudioIn, "OpenAudioInAuto"}, | ||||||
|         {4, nullptr, "ListAudioInsAuto"}, |         {4, &AudInU::ListAudioInsAutoFiltered, "ListAudioInsAutoFiltered"}, | ||||||
|  |         {5, &AudInU::OpenAudioInProtocolSpecified, "OpenAudioInProtocolSpecified"}, | ||||||
|     }; |     }; | ||||||
|     // clang-format on |     // clang-format on | ||||||
|  |  | ||||||
| @@ -49,4 +53,60 @@ AudInU::AudInU() : ServiceFramework("audin:u") { | |||||||
|  |  | ||||||
| AudInU::~AudInU() = default; | AudInU::~AudInU() = default; | ||||||
|  |  | ||||||
|  | void AudInU::ListAudioIns(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_Audio, "called"); | ||||||
|  |     const std::size_t count = ctx.GetWriteBufferSize() / sizeof(AudioInDeviceName); | ||||||
|  |  | ||||||
|  |     const std::size_t device_count = std::min(count, audio_device_names.size()); | ||||||
|  |     std::vector<AudioInDeviceName> device_names; | ||||||
|  |     device_names.reserve(device_count); | ||||||
|  |  | ||||||
|  |     for (std::size_t i = 0; i < device_count; i++) { | ||||||
|  |         const auto& device_name = audio_device_names[i]; | ||||||
|  |         auto& entry = device_names.emplace_back(); | ||||||
|  |         device_name.copy(entry.data(), device_name.size()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ctx.WriteBuffer(device_names); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(static_cast<u32>(device_names.size())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void AudInU::ListAudioInsAutoFiltered(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_DEBUG(Service_Audio, "called"); | ||||||
|  |     constexpr u32 device_count = 0; | ||||||
|  |  | ||||||
|  |     // Since we don't actually use any other audio input devices, we return 0 devices. Filtered | ||||||
|  |     // device listing just omits the default input device | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(static_cast<u32>(device_count)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void AudInU::OpenInOutImpl(Kernel::HLERequestContext& ctx) { | ||||||
|  |     AudInOutParams params{}; | ||||||
|  |     params.channel_count = 2; | ||||||
|  |     params.sample_format = SampleFormat::PCM16; | ||||||
|  |     params.sample_rate = 48000; | ||||||
|  |     params.state = State::Started; | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 6, 0, 1}; | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw<AudInOutParams>(params); | ||||||
|  |     rb.PushIpcInterface<IAudioIn>(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void AudInU::OpenAudioIn(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_WARNING(Service_Audio, "(STUBBED) called"); | ||||||
|  |     OpenInOutImpl(ctx); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void AudInU::OpenAudioInProtocolSpecified(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_WARNING(Service_Audio, "(STUBBED) called"); | ||||||
|  |     OpenInOutImpl(ctx); | ||||||
|  | } | ||||||
|  |  | ||||||
| } // namespace Service::Audio | } // namespace Service::Audio | ||||||
|   | |||||||
| @@ -16,6 +16,35 @@ class AudInU final : public ServiceFramework<AudInU> { | |||||||
| public: | public: | ||||||
|     explicit AudInU(); |     explicit AudInU(); | ||||||
|     ~AudInU() override; |     ~AudInU() override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     enum class SampleFormat : u32_le { | ||||||
|  |         PCM16 = 2, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     enum class State : u32_le { | ||||||
|  |         Started = 0, | ||||||
|  |         Stopped = 1, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     struct AudInOutParams { | ||||||
|  |         u32_le sample_rate{}; | ||||||
|  |         u32_le channel_count{}; | ||||||
|  |         SampleFormat sample_format{}; | ||||||
|  |         State state{}; | ||||||
|  |     }; | ||||||
|  |     static_assert(sizeof(AudInOutParams) == 0x10, "AudInOutParams is an invalid size"); | ||||||
|  |  | ||||||
|  |     using AudioInDeviceName = std::array<char, 256>; | ||||||
|  |     static constexpr std::array<std::string_view, 1> audio_device_names{{ | ||||||
|  |         "BuiltInHeadset", | ||||||
|  |     }}; | ||||||
|  |  | ||||||
|  |     void ListAudioIns(Kernel::HLERequestContext& ctx); | ||||||
|  |     void ListAudioInsAutoFiltered(Kernel::HLERequestContext& ctx); | ||||||
|  |     void OpenInOutImpl(Kernel::HLERequestContext& ctx); | ||||||
|  |     void OpenAudioIn(Kernel::HLERequestContext& ctx); | ||||||
|  |     void OpenAudioInProtocolSpecified(Kernel::HLERequestContext& ctx); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace Service::Audio | } // namespace Service::Audio | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user