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