1 // Copyright 2018 Citra Emulator Project 2 // Licensed under GPLv2 or any later version 3 // Refer to the license.txt file included. 4 5 #pragma once 6 7 #include <memory> 8 #include <optional> 9 #include <vector> 10 #include "common/common_types.h" 11 #include "common/swap.h" 12 #include "core/core.h" 13 14 namespace AudioCore::HLE { 15 16 enum class DecoderCommand : u16 { 17 Init, 18 Decode, 19 Unknown, 20 }; 21 22 enum class DecoderCodec : u16 { 23 None, 24 AAC, 25 }; 26 27 // TODO(xperia64): I'm guessing that this is a u32 (from when it was an unknown) 28 // but it could be a u16 or u8 I suppose 29 enum class DecoderSampleRate : u32 { 30 Rate48000 = 0, 31 Rate44100 = 1, 32 Rate32000 = 2, 33 Rate24000 = 3, 34 Rate22050 = 4, 35 Rate16000 = 5, 36 Rate12000 = 6, 37 Rate11025 = 7, 38 Rate8000 = 8 39 }; 40 41 struct BinaryRequest { 42 enum_le<DecoderCodec> codec = 43 DecoderCodec::None; // this is a guess. until now only 0x1 was observed here 44 enum_le<DecoderCommand> cmd = DecoderCommand::Init; 45 u32_le fixed = 0; 46 u32_le src_addr = 0; 47 u32_le size = 0; 48 u32_le dst_addr_ch0 = 0; 49 u32_le dst_addr_ch1 = 0; 50 u32_le unknown1 = 0; 51 u32_le unknown2 = 0; 52 }; 53 static_assert(sizeof(BinaryRequest) == 32, "Unexpected struct size for BinaryRequest"); 54 55 struct BinaryResponse { 56 enum_le<DecoderCodec> codec = 57 DecoderCodec::None; // this could be something else. until now only 0x1 was observed here 58 enum_le<DecoderCommand> cmd = DecoderCommand::Init; 59 u32_le unknown1 = 0; 60 enum_le<DecoderSampleRate> sample_rate; 61 u32_le num_channels = 0; // this is a guess, so far I only observed 2 here 62 u32_le size = 0; 63 u32_le unknown3 = 0; 64 u32_le unknown4 = 0; 65 u32_le num_samples = 0; // this is a guess, so far I only observed 1024 here 66 }; 67 static_assert(sizeof(BinaryResponse) == 32, "Unexpected struct size for BinaryResponse"); 68 69 enum_le<DecoderSampleRate> GetSampleRateEnum(u32 sample_rate); 70 71 class DecoderBase { 72 public: 73 virtual ~DecoderBase(); 74 virtual std::optional<BinaryResponse> ProcessRequest(const BinaryRequest& request) = 0; 75 /// Return true if this Decoder can be loaded. Return false if the system cannot create the 76 /// decoder 77 virtual bool IsValid() const = 0; 78 }; 79 80 class NullDecoder final : public DecoderBase { 81 public: 82 NullDecoder(); 83 ~NullDecoder() override; 84 std::optional<BinaryResponse> ProcessRequest(const BinaryRequest& request) override; IsValid()85 bool IsValid() const override { 86 return true; 87 } 88 }; 89 90 } // namespace AudioCore::HLE 91