summaryrefslogtreecommitdiffstats
path: root/src/audio_core/memory_pool.cpp
blob: 627e5f15e61a639ceb862771cad80f3052d66e46 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#include "audio_core/memory_pool.h"
#include "common/logging/log.h"

namespace AudioCore {

ServerMemoryPoolInfo::ServerMemoryPoolInfo() = default;
ServerMemoryPoolInfo::~ServerMemoryPoolInfo() = default;

bool ServerMemoryPoolInfo::Update(const InParams& in_params, OutParams& out_params) {
    // Our state does not need to be changed
    if (in_params.state != State::RequestAttach && in_params.state != State::RequestDetach) {
        return true;
    }

    // Address or size is null
    if (in_params.address == 0 || in_params.size == 0) {
        LOG_ERROR(Audio, "Memory pool address or size is zero! address={:X}, size={:X}",
                  in_params.address, in_params.size);
        return false;
    }

    // Address or size is not aligned
    if ((in_params.address % 0x1000) != 0 || (in_params.size % 0x1000) != 0) {
        LOG_ERROR(Audio, "Memory pool address or size is not aligned! address={:X}, size={:X}",
                  in_params.address, in_params.size);
        return false;
    }

    if (in_params.state == State::RequestAttach) {
        cpu_address = in_params.address;
        size = in_params.size;
        used = true;
        out_params.state = State::Attached;
    } else {
        // Unexpected address
        if (cpu_address != in_params.address) {
            LOG_ERROR(Audio, "Memory pool address differs! Expecting {:X} but address is {:X}",
                      cpu_address, in_params.address);
            return false;
        }

        if (size != in_params.size) {
            LOG_ERROR(Audio, "Memory pool size differs! Expecting {:X} but size is {:X}", size,
                      in_params.size);
            return false;
        }

        cpu_address = 0;
        size = 0;
        used = false;
        out_params.state = State::Detached;
    }
    return true;
}

} // namespace AudioCore