diff --git a/README.md b/README.md index 576a5c7cb..07a1c947e 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 3468. +This is the source code for early-access 3470. ## Legal Notice diff --git a/src/common/bounded_threadsafe_queue.h b/src/common/bounded_threadsafe_queue.h index 6e90f59e0..e2c2feba4 100755 --- a/src/common/bounded_threadsafe_queue.h +++ b/src/common/bounded_threadsafe_queue.h @@ -143,7 +143,7 @@ private: ++m_read_index; // Notify the producer that we have popped off the queue. - std::unique_lock lock{producer_cv_mutex}; + std::scoped_lock lock{producer_cv_mutex}; producer_cv.notify_one(); return true; diff --git a/src/common/typed_address.h b/src/common/typed_address.h index c9a4946a9..cf7bbeae1 100755 --- a/src/common/typed_address.h +++ b/src/common/typed_address.h @@ -3,6 +3,8 @@ #pragma once +#include +#include #include #include "common/common_types.h" @@ -13,11 +15,12 @@ template class TypedAddress { public: // Constructors. - inline TypedAddress() : m_address(0) {} + constexpr inline TypedAddress() : m_address(0) {} constexpr inline TypedAddress(uint64_t a) : m_address(a) {} template - constexpr inline explicit TypedAddress(U* ptr) : m_address(reinterpret_cast(ptr)) {} + constexpr inline explicit TypedAddress(const U* ptr) + : m_address(reinterpret_cast(ptr)) {} // Copy constructor. constexpr inline TypedAddress(const TypedAddress& rhs) = default; @@ -105,36 +108,16 @@ public: return m_address / size; } - constexpr inline bool operator!() const { - return m_address == 0; + constexpr explicit operator bool() const { + return m_address != 0; } // constexpr inline uint64_t operator%(U align) const { return m_address % align; } // Comparison operators. - constexpr inline bool operator==(TypedAddress rhs) const { - return m_address == rhs.m_address; - } - - constexpr inline bool operator!=(TypedAddress rhs) const { - return m_address != rhs.m_address; - } - - constexpr inline bool operator<(TypedAddress rhs) const { - return m_address < rhs.m_address; - } - - constexpr inline bool operator<=(TypedAddress rhs) const { - return m_address <= rhs.m_address; - } - - constexpr inline bool operator>(TypedAddress rhs) const { - return m_address > rhs.m_address; - } - - constexpr inline bool operator>=(TypedAddress rhs) const { - return m_address >= rhs.m_address; - } + constexpr bool operator==(const TypedAddress&) const = default; + constexpr bool operator!=(const TypedAddress&) const = default; + constexpr auto operator<=>(const TypedAddress&) const = default; // For convenience, also define comparison operators versus uint64_t. constexpr inline bool operator==(uint64_t rhs) const { diff --git a/src/core/hle/service/nfc/nfc_device.cpp b/src/core/hle/service/nfc/nfc_device.cpp index 3f17d0c7a..c7db74d14 100755 --- a/src/core/hle/service/nfc/nfc_device.cpp +++ b/src/core/hle/service/nfc/nfc_device.cpp @@ -42,8 +42,18 @@ NfcDevice::~NfcDevice() { }; void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) { - if (type == Core::HID::ControllerTriggerType::Connected || - type == Core::HID::ControllerTriggerType::Disconnected) { + if (!is_initalized) { + return; + } + + if (type == Core::HID::ControllerTriggerType::Connected) { + Initialize(); + availability_change_event->Signal(); + return; + } + + if (type == Core::HID::ControllerTriggerType::Disconnected) { + device_state = NFP::DeviceState::Unavailable; availability_change_event->Signal(); return; } @@ -113,6 +123,7 @@ void NfcDevice::Initialize() { device_state = npad_device->HasNfc() ? NFP::DeviceState::Initialized : NFP::DeviceState::Unavailable; encrypted_tag_data = {}; + is_initalized = true; } void NfcDevice::Finalize() { @@ -121,6 +132,7 @@ void NfcDevice::Finalize() { StopDetection(); } device_state = NFP::DeviceState::Unavailable; + is_initalized = false; } Result NfcDevice::StartDetection(NFP::TagProtocol allowed_protocol) { diff --git a/src/core/hle/service/nfc/nfc_device.h b/src/core/hle/service/nfc/nfc_device.h index a6e114d36..ea63f0537 100755 --- a/src/core/hle/service/nfc/nfc_device.h +++ b/src/core/hle/service/nfc/nfc_device.h @@ -67,6 +67,7 @@ private: Kernel::KEvent* deactivate_event = nullptr; Kernel::KEvent* availability_change_event = nullptr; + bool is_initalized{}; NFP::TagProtocol allowed_protocols{}; NFP::DeviceState device_state{NFP::DeviceState::Unavailable}; diff --git a/src/core/hle/service/nfp/nfp_device.cpp b/src/core/hle/service/nfp/nfp_device.cpp index c93088932..5f7f64905 100755 --- a/src/core/hle/service/nfp/nfp_device.cpp +++ b/src/core/hle/service/nfp/nfp_device.cpp @@ -66,8 +66,18 @@ NfpDevice::~NfpDevice() { }; void NfpDevice::NpadUpdate(Core::HID::ControllerTriggerType type) { - if (type == Core::HID::ControllerTriggerType::Connected || - type == Core::HID::ControllerTriggerType::Disconnected) { + if (!is_initalized) { + return; + } + + if (type == Core::HID::ControllerTriggerType::Connected) { + Initialize(); + availability_change_event->Signal(); + return; + } + + if (type == Core::HID::ControllerTriggerType::Disconnected) { + device_state = DeviceState::Unavailable; availability_change_event->Signal(); return; } @@ -145,6 +155,7 @@ void NfpDevice::Initialize() { device_state = npad_device->HasNfc() ? DeviceState::Initialized : DeviceState::Unavailable; encrypted_tag_data = {}; tag_data = {}; + is_initalized = true; } void NfpDevice::Finalize() { @@ -155,6 +166,7 @@ void NfpDevice::Finalize() { StopDetection(); } device_state = DeviceState::Unavailable; + is_initalized = false; } Result NfpDevice::StartDetection(TagProtocol allowed_protocol) { diff --git a/src/core/hle/service/nfp/nfp_device.h b/src/core/hle/service/nfp/nfp_device.h index cf9d7c407..3bfa94595 100755 --- a/src/core/hle/service/nfp/nfp_device.h +++ b/src/core/hle/service/nfp/nfp_device.h @@ -92,6 +92,7 @@ private: Kernel::KEvent* deactivate_event = nullptr; Kernel::KEvent* availability_change_event = nullptr; + bool is_initalized{}; bool is_data_moddified{}; bool is_app_area_open{}; TagProtocol allowed_protocols{};