diff options
| author | bunnei <bunneidev@gmail.com> | 2020-05-02 13:11:52 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-02 13:11:52 -0400 | 
| commit | 30bd77c6e70808da7b2c0332a7235dbc68696ba8 (patch) | |
| tree | 14a1d2cd98934a749b6bfe0f55a4052b46cb9457 /src/core/hle | |
| parent | 5ddcc1b2f582b10ac52ba9d329bfb4e49360c738 (diff) | |
| parent | 1276e425d2e1cd0f80c6b7872a56956d5e2a985b (diff) | |
Merge pull request #3811 from ogniK5377/audin-init
audin:u: ListAudioIns, OpenAudioIn, ListAudioInsAuto, OpenAudioInAuto, ListAudioInsAutoFiltered, OpenAudioInProtocolSpecified
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/audio/audin_u.cpp | 70 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audin_u.h | 29 | 
2 files changed, 94 insertions, 5 deletions
| diff --git a/src/core/hle/service/audio/audin_u.cpp b/src/core/hle/service/audio/audin_u.cpp index d7f1d348d..3e2299426 100644 --- a/src/core/hle/service/audio/audin_u.cpp +++ b/src/core/hle/service/audio/audin_u.cpp @@ -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 diff --git a/src/core/hle/service/audio/audin_u.h b/src/core/hle/service/audio/audin_u.h index 0538b9560..a599f4a64 100644 --- a/src/core/hle/service/audio/audin_u.h +++ b/src/core/hle/service/audio/audin_u.h @@ -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 | 
