summaryrefslogtreecommitdiffstats
path: root/src/audio_core/common/feature_support.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_core/common/feature_support.h')
-rw-r--r--src/audio_core/common/feature_support.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/audio_core/common/feature_support.h b/src/audio_core/common/feature_support.h
new file mode 100644
index 000000000..55c9e690d
--- /dev/null
+++ b/src/audio_core/common/feature_support.h
@@ -0,0 +1,105 @@
+// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <map>
+#include <ranges>
+#include <tuple>
+
+#include "common/assert.h"
+#include "common/common_funcs.h"
+#include "common/common_types.h"
+
+namespace AudioCore {
+constexpr u32 CurrentRevision = 11;
+
+enum class SupportTags {
+ CommandProcessingTimeEstimatorVersion4,
+ CommandProcessingTimeEstimatorVersion3,
+ CommandProcessingTimeEstimatorVersion2,
+ MultiTapBiquadFilterProcessing,
+ EffectInfoVer2,
+ WaveBufferVer2,
+ BiquadFilterFloatProcessing,
+ VolumeMixParameterPrecisionQ23,
+ MixInParameterDirtyOnlyUpdate,
+ BiquadFilterEffectStateClearBugFix,
+ VoicePlayedSampleCountResetAtLoopPoint,
+ VoicePitchAndSrcSkipped,
+ SplitterBugFix,
+ FlushVoiceWaveBuffers,
+ ElapsedFrameCount,
+ AudioRendererVariadicCommandBufferSize,
+ PerformanceMetricsDataFormatVersion2,
+ AudioRendererProcessingTimeLimit80Percent,
+ AudioRendererProcessingTimeLimit75Percent,
+ AudioRendererProcessingTimeLimit70Percent,
+ AdpcmLoopContextBugFix,
+ Splitter,
+ LongSizePreDelay,
+ AudioUsbDeviceOutput,
+ DeviceApiVersion2,
+ DelayChannelMappingChange,
+ ReverbChannelMappingChange,
+ I3dl2ReverbChannelMappingChange,
+
+ // Not a real tag, just here to get the count.
+ Size
+};
+
+constexpr u32 GetRevisionNum(u32 user_revision) {
+ if (user_revision >= 0x100) {
+ user_revision -= Common::MakeMagic('R', 'E', 'V', '0');
+ user_revision >>= 24;
+ }
+ return user_revision;
+};
+
+constexpr bool CheckFeatureSupported(SupportTags tag, u32 user_revision) {
+ constexpr std::array<std::pair<SupportTags, u32>, static_cast<u32>(SupportTags::Size)> features{
+ {
+ {SupportTags::AudioRendererProcessingTimeLimit70Percent, 1},
+ {SupportTags::Splitter, 2},
+ {SupportTags::AdpcmLoopContextBugFix, 2},
+ {SupportTags::LongSizePreDelay, 3},
+ {SupportTags::AudioUsbDeviceOutput, 4},
+ {SupportTags::AudioRendererProcessingTimeLimit75Percent, 4},
+ {SupportTags::VoicePlayedSampleCountResetAtLoopPoint, 5},
+ {SupportTags::VoicePitchAndSrcSkipped, 5},
+ {SupportTags::SplitterBugFix, 5},
+ {SupportTags::FlushVoiceWaveBuffers, 5},
+ {SupportTags::ElapsedFrameCount, 5},
+ {SupportTags::AudioRendererProcessingTimeLimit80Percent, 5},
+ {SupportTags::AudioRendererVariadicCommandBufferSize, 5},
+ {SupportTags::PerformanceMetricsDataFormatVersion2, 5},
+ {SupportTags::CommandProcessingTimeEstimatorVersion2, 5},
+ {SupportTags::BiquadFilterEffectStateClearBugFix, 6},
+ {SupportTags::BiquadFilterFloatProcessing, 7},
+ {SupportTags::VolumeMixParameterPrecisionQ23, 7},
+ {SupportTags::MixInParameterDirtyOnlyUpdate, 7},
+ {SupportTags::WaveBufferVer2, 8},
+ {SupportTags::CommandProcessingTimeEstimatorVersion3, 8},
+ {SupportTags::EffectInfoVer2, 9},
+ {SupportTags::CommandProcessingTimeEstimatorVersion4, 10},
+ {SupportTags::MultiTapBiquadFilterProcessing, 10},
+ {SupportTags::DelayChannelMappingChange, 11},
+ {SupportTags::ReverbChannelMappingChange, 11},
+ {SupportTags::I3dl2ReverbChannelMappingChange, 11},
+ }};
+
+ const auto& feature =
+ std::ranges::find_if(features, [tag](const auto& entry) { return entry.first == tag; });
+ if (feature == features.cend()) {
+ LOG_ERROR(Service_Audio, "Invalid SupportTag {}!", static_cast<u32>(tag));
+ return false;
+ }
+ user_revision = GetRevisionNum(user_revision);
+ return (*feature).second <= user_revision;
+}
+
+constexpr bool CheckValidRevision(u32 user_revision) {
+ return GetRevisionNum(user_revision) <= CurrentRevision;
+};
+
+} // namespace AudioCore