early-access version 4167
This commit is contained in:
parent
0cc974af92
commit
b9d9dc3c71
8 changed files with 43 additions and 25 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 4166.
|
This is the source code for early-access 4167.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -26,12 +26,9 @@ Service::PSC::Time::SystemClockContext g_report_ephemeral_clock_context{};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys,
|
T GetSettingsItemValue(std::shared_ptr<Service::Set::ISystemSettingsServer>& set_sys,
|
||||||
const char* category, const char* name) {
|
const char* category, const char* name) {
|
||||||
std::vector<u8> interval_buf;
|
|
||||||
auto res = set_sys->GetSettingsItemValueImpl(interval_buf, category, name);
|
|
||||||
ASSERT(res == ResultSuccess);
|
|
||||||
|
|
||||||
T v{};
|
T v{};
|
||||||
std::memcpy(&v, interval_buf.data(), sizeof(T));
|
auto res = set_sys->GetSettingsItemValueImpl(v, category, name);
|
||||||
|
ASSERT(res == ResultSuccess);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
||||||
SetupSettings();
|
SetupSettings();
|
||||||
|
|
||||||
m_system_settings.region_code =
|
m_system_settings.region_code =
|
||||||
static_cast<SystemRegionCode>(Settings::values.region_index.GetValue());
|
static_cast<SystemRegionCode>(::Settings::values.region_index.GetValue());
|
||||||
|
|
||||||
// TODO: Remove this when starter applet is fully functional
|
// TODO: Remove this when starter applet is fully functional
|
||||||
EulaVersion eula_version{
|
EulaVersion eula_version{
|
||||||
|
@ -715,7 +715,7 @@ Result ISystemSettingsServer::GetSettingsItemValueSize(
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ISystemSettingsServer::GetSettingsItemValue(
|
Result ISystemSettingsServer::GetSettingsItemValue(
|
||||||
OutBuffer<BufferAttr_HipcMapAlias> out_data,
|
Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data,
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) {
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer) {
|
||||||
const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)};
|
const std::string setting_category{Common::StringFromBuffer(*setting_category_buffer)};
|
||||||
|
@ -723,7 +723,7 @@ Result ISystemSettingsServer::GetSettingsItemValue(
|
||||||
|
|
||||||
LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name);
|
LOG_INFO(Service_SET, "called, category={}, name={}", setting_category, setting_name);
|
||||||
|
|
||||||
R_RETURN(GetSettingsItemValueImpl(out_data, setting_category, setting_name));
|
R_RETURN(GetSettingsItemValueImpl(out_data, *out_size, setting_category, setting_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) {
|
Result ISystemSettingsServer::GetTvSettings(Out<TvSettings> out_tv_settings) {
|
||||||
|
@ -1363,13 +1363,16 @@ void ISystemSettingsServer::SetSaveNeeded() {
|
||||||
m_save_needed = true;
|
m_save_needed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ISystemSettingsServer::GetSettingsItemValueImpl(std::vector<u8>& out_value,
|
Result ISystemSettingsServer::GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size,
|
||||||
const std::string& category,
|
const std::string& category,
|
||||||
const std::string& name) {
|
const std::string& name) {
|
||||||
auto settings{GetSettings()};
|
auto settings{GetSettings()};
|
||||||
R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown);
|
R_UNLESS(settings.contains(category) && settings[category].contains(name), ResultUnknown);
|
||||||
|
|
||||||
out_value = settings[category][name];
|
ASSERT_MSG(out_value.size() >= settings[category][name].size(),
|
||||||
|
"Stored type is bigger than requested type");
|
||||||
|
out_size = std::min<u64>(settings[category][name].size(), out_value.size());
|
||||||
|
std::memcpy(out_value.data(), settings[category][name].data(), out_size);
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,20 +34,17 @@ public:
|
||||||
explicit ISystemSettingsServer(Core::System& system_);
|
explicit ISystemSettingsServer(Core::System& system_);
|
||||||
~ISystemSettingsServer() override;
|
~ISystemSettingsServer() override;
|
||||||
|
|
||||||
Result GetSettingsItemValueImpl(std::vector<u8>& out_value, const std::string& category,
|
Result GetSettingsItemValueImpl(std::span<u8> out_value, u64& out_size,
|
||||||
const std::string& name);
|
const std::string& category, const std::string& name);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
Result GetSettingsItemValueImpl(T& value, const std::string& category,
|
Result GetSettingsItemValueImpl(T& out_value, const std::string& category,
|
||||||
const std::string& name) {
|
const std::string& name) {
|
||||||
std::vector<u8> data;
|
u64 data_size{};
|
||||||
const auto result = GetSettingsItemValueImpl(data, category, name);
|
std::vector<u8> data(sizeof(T));
|
||||||
if (result.IsError()) {
|
R_TRY(GetSettingsItemValueImpl(data, data_size, category, name));
|
||||||
return result;
|
std::memcpy(&out_value, data.data(), data_size);
|
||||||
}
|
R_SUCCEED();
|
||||||
ASSERT(data.size() >= sizeof(T));
|
|
||||||
std::memcpy(&value, data.data(), sizeof(T));
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -84,7 +81,7 @@ public:
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf);
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buf);
|
||||||
Result GetSettingsItemValue(
|
Result GetSettingsItemValue(
|
||||||
OutBuffer<BufferAttr_HipcMapAlias> out_data,
|
Out<u64> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_data,
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_category_buffer,
|
||||||
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer);
|
InLargeData<SettingItemName, BufferAttr_HipcPointer> setting_name_buffer);
|
||||||
Result GetTvSettings(Out<TvSettings> out_tv_settings);
|
Result GetTvSettings(Out<TvSettings> out_tv_settings);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
#include <common/scope_exit.h>
|
#include <common/scope_exit.h>
|
||||||
|
|
||||||
#include "common/polyfill_ranges.h"
|
#include "common/polyfill_ranges.h"
|
||||||
|
@ -1287,6 +1288,22 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Settings::values.enable_accurate_vibrations.GetValue()) {
|
||||||
|
using std::chrono::duration_cast;
|
||||||
|
using std::chrono::milliseconds;
|
||||||
|
using std::chrono::steady_clock;
|
||||||
|
|
||||||
|
const auto now = steady_clock::now();
|
||||||
|
|
||||||
|
// Filter out non-zero vibrations that are within 15ms of each other.
|
||||||
|
if ((vibration.low_amplitude != 0.0f || vibration.high_amplitude != 0.0f) &&
|
||||||
|
duration_cast<milliseconds>(now - last_vibration_timepoint[index]) < milliseconds(15)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_vibration_timepoint[index] = now;
|
||||||
|
}
|
||||||
|
|
||||||
// Exponential amplification is too strong at low amplitudes. Switch to a linear
|
// Exponential amplification is too strong at low amplitudes. Switch to a linear
|
||||||
// amplification if strength is set below 0.7f
|
// amplification if strength is set below 0.7f
|
||||||
const Common::Input::VibrationAmplificationType type =
|
const Common::Input::VibrationAmplificationType type =
|
||||||
|
|
|
@ -583,6 +583,7 @@ private:
|
||||||
std::size_t nfc_handles{0};
|
std::size_t nfc_handles{0};
|
||||||
std::array<VibrationValue, 2> last_vibration_value{DEFAULT_VIBRATION_VALUE,
|
std::array<VibrationValue, 2> last_vibration_value{DEFAULT_VIBRATION_VALUE,
|
||||||
DEFAULT_VIBRATION_VALUE};
|
DEFAULT_VIBRATION_VALUE};
|
||||||
|
std::array<std::chrono::steady_clock::time_point, 2> last_vibration_timepoint{};
|
||||||
|
|
||||||
// Temporary values to avoid doing changes while the controller is in configuring mode
|
// Temporary values to avoid doing changes while the controller is in configuring mode
|
||||||
NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};
|
NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};
|
||||||
|
|
|
@ -638,7 +638,11 @@ struct VibrationValue {
|
||||||
if (low_amplitude != b.low_amplitude || high_amplitude != b.high_amplitude) {
|
if (low_amplitude != b.low_amplitude || high_amplitude != b.high_amplitude) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (low_frequency != b.low_amplitude || high_frequency != b.high_frequency) {
|
// Changes in frequency without amplitude don't have any effect
|
||||||
|
if (low_amplitude == 0 && high_amplitude == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (low_frequency != b.low_frequency || high_frequency != b.high_frequency) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <chrono>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
|
|
Loading…
Reference in a new issue