summaryrefslogblamecommitdiffstats
path: root/src/audio_core/memory_pool.cpp
blob: 627e5f15e61a639ceb862771cad80f3052d66e46 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
 

                                                               







                                                        

                                                                                     
                                            
                                                                                             
















                                                                                               
                                                  


                                        
                                           
















                                                                                               
                                           




                        

// 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