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 | ||||
| // 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" | ||||
|  | ||||
| namespace Service::Audio { | ||||
| @@ -36,11 +39,12 @@ public: | ||||
| AudInU::AudInU() : ServiceFramework("audin:u") { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "ListAudioIns"}, | ||||
|         {1, nullptr, "OpenAudioIn"}, | ||||
|         {2, nullptr, "Unknown"}, | ||||
|         {3, nullptr, "OpenAudioInAuto"}, | ||||
|         {4, nullptr, "ListAudioInsAuto"}, | ||||
|         {0, &AudInU::ListAudioIns, "ListAudioIns"}, | ||||
|         {1, &AudInU::OpenAudioIn, "OpenAudioIn"}, | ||||
|         {2, &AudInU::ListAudioIns, "ListAudioInsAuto"}, | ||||
|         {3, &AudInU::OpenAudioIn, "OpenAudioInAuto"}, | ||||
|         {4, &AudInU::ListAudioInsAutoFiltered, "ListAudioInsAutoFiltered"}, | ||||
|         {5, &AudInU::OpenAudioInProtocolSpecified, "OpenAudioInProtocolSpecified"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
| @@ -49,4 +53,60 @@ AudInU::AudInU() : ServiceFramework("audin:u") { | ||||
|  | ||||
| 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 | ||||
|   | ||||
| @@ -16,6 +16,35 @@ class AudInU final : public ServiceFramework<AudInU> { | ||||
| public: | ||||
|     explicit AudInU(); | ||||
|     ~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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user