mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-24 22:51:04 +00:00
Memory: ExtractFromMemory returns a boost::optional<T>
This commit is contained in:
parent
5973712410
commit
3e75de6006
@ -195,13 +195,11 @@ static VAddr GetCurrentBase() {
|
||||
static std::array<u16, NUM_CHANNELS> syncs;
|
||||
|
||||
static ChannelContext GetChannelContext(VAddr base, int channel_id) {
|
||||
ChannelContext ctx;
|
||||
|
||||
if (!Memory::ExtractFromMemory(DspAddrToVAddr(base, DSPADDR1) + channel_id * sizeof(ChannelContext), ctx)) {
|
||||
auto ret = Memory::ExtractFromMemory<ChannelContext>(DspAddrToVAddr(base, DSPADDR1) + channel_id * sizeof(ChannelContext));
|
||||
if (!ret) {
|
||||
LOG_CRITICAL(Service_DSP, "ExtractFromMemory for DSPADDR1 failed");
|
||||
}
|
||||
|
||||
return ctx;
|
||||
return *ret;
|
||||
}
|
||||
|
||||
static void SetChannelContext(VAddr base, int channel_id, const ChannelContext& ctx) {
|
||||
@ -224,12 +222,12 @@ static void ReadChannelContext(VAddr current_base, int channel_id) {
|
||||
|
||||
if (TestAndUnsetBit<2>(ctx.dirty)) {
|
||||
// Update ADPCM coefficients
|
||||
AdpcmCoefficients coeff;
|
||||
if (!Memory::ExtractFromMemory(DspAddrToVAddr(current_base, DSPADDR3) + channel_id * sizeof(coeff), coeff)) {
|
||||
auto coeff = Memory::ExtractFromMemory<AdpcmCoefficients>(DspAddrToVAddr(current_base, DSPADDR3) + channel_id * sizeof(AdpcmCoefficients));
|
||||
if (!coeff) {
|
||||
LOG_CRITICAL(Service_DSP, "ExtractFromMemory for DSPADDR3 failed");
|
||||
return;
|
||||
}
|
||||
Audio::UpdateAdpcm(channel_id, coeff.coeff);
|
||||
Audio::UpdateAdpcm(channel_id, coeff->coeff);
|
||||
}
|
||||
|
||||
if (TestAndUnsetBit<17>(ctx.dirty)) {
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <boost/optional.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
#include "common/common_types.h"
|
||||
@ -134,16 +135,17 @@ u8* GetPointer(VAddr virtual_address);
|
||||
* Extracts a POD type from memory. Returns false if address is invalid.
|
||||
*/
|
||||
template <typename T>
|
||||
bool ExtractFromMemory(VAddr address, T& object) {
|
||||
boost::optional<T> ExtractFromMemory(VAddr address) {
|
||||
static_assert(std::is_standard_layout<T>::value, "Type must have standard layout");
|
||||
|
||||
const u8* memory = GetPointer(address);
|
||||
if (!memory) {
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
|
||||
T object;
|
||||
std::memcpy(&object, memory, sizeof(T));
|
||||
return true;
|
||||
return boost::make_optional(object);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user