behavior_info.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2020 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <cstring>
  5. #include "audio_core/behavior_info.h"
  6. #include "audio_core/common.h"
  7. #include "common/logging/log.h"
  8. namespace AudioCore {
  9. BehaviorInfo::BehaviorInfo() : process_revision(CURRENT_PROCESS_REVISION) {}
  10. BehaviorInfo::~BehaviorInfo() = default;
  11. bool BehaviorInfo::UpdateInput(const std::vector<u8>& buffer, std::size_t offset) {
  12. if (!CanConsumeBuffer(buffer.size(), offset, sizeof(InParams))) {
  13. LOG_ERROR(Audio, "Buffer is an invalid size!");
  14. return false;
  15. }
  16. InParams params{};
  17. std::memcpy(&params, buffer.data() + offset, sizeof(InParams));
  18. if (!IsValidRevision(params.revision)) {
  19. LOG_ERROR(Audio, "Invalid input revision, revision=0x{:08X}", params.revision);
  20. return false;
  21. }
  22. if (user_revision != params.revision) {
  23. LOG_ERROR(Audio,
  24. "User revision differs from input revision, expecting 0x{:08X} but got 0x{:08X}",
  25. user_revision, params.revision);
  26. return false;
  27. }
  28. ClearError();
  29. UpdateFlags(params.flags);
  30. // TODO(ogniK): Check input params size when InfoUpdater is used
  31. return true;
  32. }
  33. bool BehaviorInfo::UpdateOutput(std::vector<u8>& buffer, std::size_t offset) {
  34. if (!CanConsumeBuffer(buffer.size(), offset, sizeof(OutParams))) {
  35. LOG_ERROR(Audio, "Buffer is an invalid size!");
  36. return false;
  37. }
  38. OutParams params{};
  39. std::memcpy(params.errors.data(), errors.data(), sizeof(ErrorInfo) * errors.size());
  40. params.error_count = static_cast<u32_le>(error_count);
  41. std::memcpy(buffer.data() + offset, &params, sizeof(OutParams));
  42. return true;
  43. }
  44. void BehaviorInfo::ClearError() {
  45. error_count = 0;
  46. }
  47. void BehaviorInfo::UpdateFlags(u64_le dest_flags) {
  48. flags = dest_flags;
  49. }
  50. void BehaviorInfo::SetUserRevision(u32_le revision) {
  51. user_revision = revision;
  52. }
  53. bool BehaviorInfo::IsAdpcmLoopContextBugFixed() const {
  54. return IsRevisionSupported(2, user_revision);
  55. }
  56. bool BehaviorInfo::IsSplitterSupported() const {
  57. return IsRevisionSupported(2, user_revision);
  58. }
  59. bool BehaviorInfo::IsLongSizePreDelaySupported() const {
  60. return IsRevisionSupported(3, user_revision);
  61. }
  62. bool BehaviorInfo::IsAudioRenererProcessingTimeLimit80PercentSupported() const {
  63. return IsRevisionSupported(5, user_revision);
  64. }
  65. bool BehaviorInfo::IsAudioRenererProcessingTimeLimit75PercentSupported() const {
  66. return IsRevisionSupported(4, user_revision);
  67. }
  68. bool BehaviorInfo::IsAudioRenererProcessingTimeLimit70PercentSupported() const {
  69. return IsRevisionSupported(1, user_revision);
  70. }
  71. bool BehaviorInfo::IsElapsedFrameCountSupported() const {
  72. return IsRevisionSupported(5, user_revision);
  73. }
  74. bool BehaviorInfo::IsMemoryPoolForceMappingEnabled() const {
  75. return (flags & 1) != 0;
  76. }
  77. } // namespace AudioCore