aboutsummaryrefslogtreecommitdiff
path: root/src/audio_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_core')
-rw-r--r--src/audio_core/audio_render_manager.cpp4
-rw-r--r--src/audio_core/common/feature_support.h30
-rw-r--r--src/audio_core/renderer/behavior/behavior_info.cpp8
-rw-r--r--src/audio_core/renderer/behavior/behavior_info.h1
-rw-r--r--src/audio_core/renderer/behavior/info_updater.cpp9
5 files changed, 37 insertions, 15 deletions
diff --git a/src/audio_core/audio_render_manager.cpp b/src/audio_core/audio_render_manager.cpp
index 8083b92287..4034de1ec3 100644
--- a/src/audio_core/audio_render_manager.cpp
+++ b/src/audio_core/audio_render_manager.cpp
@@ -33,8 +33,8 @@ SystemManager& Manager::GetSystemManager() {
Result Manager::GetWorkBufferSize(const AudioRendererParameterInternal& params,
u64& out_count) const {
if (!CheckValidRevision(params.revision)) {
- LOG_ERROR(Service_Audio, "Audio renderer revision {:#x} ({}) is newer than {}",
- params.revision, GetRevisionNum(params.revision), MaxAcceptedRevision);
+ LOG_ERROR(Service_Audio, "Audio renderer revision {:#x} ({}) is not supported",
+ params.revision, GetRevisionNum(params.revision));
return Service::Audio::ResultInvalidRevision;
}
diff --git a/src/audio_core/common/feature_support.h b/src/audio_core/common/feature_support.h
index 1a6bfef527..d6571c0661 100644
--- a/src/audio_core/common/feature_support.h
+++ b/src/audio_core/common/feature_support.h
@@ -17,8 +17,16 @@
namespace AudioCore {
constexpr u32 CurrentRevision = 15;
-/// Newest revision accepted: Switch 2 SDKs ask for 16 ("REv@"), run with revision 15's features.
-constexpr u32 MaxAcceptedRevision = 16;
+constexpr u32 NativeCurrentRevision = 16;
+
+constexpr bool IsNativeRevision(u32 revision) {
+ return (revision & 0xffffff) == Common::MakeMagic('R', 'E', 'v', '\0');
+}
+
+constexpr u32 EncodeRevision(u32 revision, bool native) {
+ return Common::MakeMagic('R', 'E', native ? 'v' : 'V',
+ static_cast<char>('0' + revision));
+}
enum class SupportTags {
CommandProcessingTimeEstimatorVersion4,
@@ -59,12 +67,15 @@ enum class SupportTags {
};
constexpr u32 GetRevisionNum(u32 user_revision) {
- if (user_revision >= 0x100) {
- user_revision -= Common::MakeMagic('R', 'E', 'V', '0');
- user_revision >>= 24;
+ if (user_revision < 0x100) {
+ return user_revision;
}
-
- return user_revision;
+ if (!IsNativeRevision(user_revision) &&
+ (user_revision & 0xffffff) != Common::MakeMagic('R', 'E', 'V', '\0')) {
+ return ~u32{0};
+ }
+ const u32 encoded = user_revision >> 24;
+ return encoded >= '0' ? encoded - '0' : ~u32{0};
};
constexpr bool CheckFeatureSupported(SupportTags tag, u32 user_revision) {
@@ -110,11 +121,12 @@ constexpr bool CheckFeatureSupported(SupportTags tag, u32 user_revision) {
return false;
}
user_revision = GetRevisionNum(user_revision);
- return (*feature).second <= user_revision;
+ return user_revision != ~u32{0} && (*feature).second <= user_revision;
}
constexpr bool CheckValidRevision(u32 user_revision) {
- return GetRevisionNum(user_revision) <= MaxAcceptedRevision;
+ return GetRevisionNum(user_revision) <=
+ (IsNativeRevision(user_revision) ? NativeCurrentRevision : CurrentRevision);
};
} // namespace AudioCore
diff --git a/src/audio_core/renderer/behavior/behavior_info.cpp b/src/audio_core/renderer/behavior/behavior_info.cpp
index 63b80c503a..983cfd5b85 100644
--- a/src/audio_core/renderer/behavior/behavior_info.cpp
+++ b/src/audio_core/renderer/behavior/behavior_info.cpp
@@ -16,8 +16,7 @@ u32 BehaviorInfo::GetProcessRevisionNum() const {
}
u32 BehaviorInfo::GetProcessRevision() const {
- return Common::MakeMagic('R', 'E', 'V',
- static_cast<char>(static_cast<u8>('0') + process_revision));
+ return EncodeRevision(process_revision, native_platform);
}
u32 BehaviorInfo::GetUserRevisionNum() const {
@@ -25,11 +24,12 @@ u32 BehaviorInfo::GetUserRevisionNum() const {
}
u32 BehaviorInfo::GetUserRevision() const {
- return Common::MakeMagic('R', 'E', 'V',
- static_cast<char>(static_cast<u8>('0') + user_revision));
+ return EncodeRevision(user_revision, native_platform);
}
void BehaviorInfo::SetUserLibRevision(const u32 user_revision_) {
+ native_platform = IsNativeRevision(user_revision_);
+ process_revision = native_platform ? NativeCurrentRevision : CurrentRevision;
user_revision = GetRevisionNum(user_revision_);
}
diff --git a/src/audio_core/renderer/behavior/behavior_info.h b/src/audio_core/renderer/behavior/behavior_info.h
index 757f163c5a..318d4e1ff4 100644
--- a/src/audio_core/renderer/behavior/behavior_info.h
+++ b/src/audio_core/renderer/behavior/behavior_info.h
@@ -400,6 +400,7 @@ public:
u32 process_revision;
/// User version
u32 user_revision{};
+ bool native_platform{};
/// Behaviour flags
Flags flags{};
/// Errors generated and reported during Update
diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp
index ca3eaece94..a8fbcf9730 100644
--- a/src/audio_core/renderer/behavior/info_updater.cpp
+++ b/src/audio_core/renderer/behavior/info_updater.cpp
@@ -122,12 +122,21 @@ Result InfoUpdater::UpdateVoices(VoiceContext& voice_context,
u8 flush_wave_buffer_count;
u16 reserved2;
VoiceInfo::Flags flags;
+ u8 reserved_after_flags;
SrcQuality src_quality;
+ u8 crossfade_curve;
u32 external_ctx;
u32 external_ctx_size;
u32 reserved3[2];
};
+ static_assert(sizeof(VoiceInParameterV2) == 0x188);
+ static_assert(offsetof(VoiceInParameterV2, crossfade_curve) == 0x177);
const auto* vin = reinterpret_cast<const VoiceInParameterV2*>(input + i * in_stride);
+ if (behaviour.GetUserRevisionNum() >= 16 && vin->in_use && vin->crossfade_curve != 0) {
+ LOG_ERROR(Service_Audio, "Unsupported voice biquad crossfade curve {}",
+ vin->crossfade_curve);
+ return Service::Audio::ResultInvalidUpdateInfo;
+ }
local_in.id = vin->id;
local_in.node_id = vin->node_id;
local_in.is_new = vin->is_new;