behavior_info.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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(AudioCommon::CURRENT_PROCESS_REVISION) {}
  10. BehaviorInfo::~BehaviorInfo() = default;
  11. bool BehaviorInfo::UpdateOutput(std::vector<u8>& buffer, std::size_t offset) {
  12. if (!AudioCommon::CanConsumeBuffer(buffer.size(), offset, sizeof(OutParams))) {
  13. LOG_ERROR(Audio, "Buffer is an invalid size!");
  14. return false;
  15. }
  16. OutParams params{};
  17. std::memcpy(params.errors.data(), errors.data(), sizeof(ErrorInfo) * errors.size());
  18. params.error_count = static_cast<u32_le>(error_count);
  19. std::memcpy(buffer.data() + offset, &params, sizeof(OutParams));
  20. return true;
  21. }
  22. void BehaviorInfo::ClearError() {
  23. error_count = 0;
  24. }
  25. void BehaviorInfo::UpdateFlags(u64_le dest_flags) {
  26. flags = dest_flags;
  27. }
  28. void BehaviorInfo::SetUserRevision(u32_le revision) {
  29. user_revision = revision;
  30. }
  31. u32_le BehaviorInfo::GetUserRevision() const {
  32. return user_revision;
  33. }
  34. u32_le BehaviorInfo::GetProcessRevision() const {
  35. return process_revision;
  36. }
  37. bool BehaviorInfo::IsAdpcmLoopContextBugFixed() const {
  38. return AudioCommon::IsRevisionSupported(2, user_revision);
  39. }
  40. bool BehaviorInfo::IsSplitterSupported() const {
  41. return AudioCommon::IsRevisionSupported(2, user_revision);
  42. }
  43. bool BehaviorInfo::IsLongSizePreDelaySupported() const {
  44. return AudioCommon::IsRevisionSupported(3, user_revision);
  45. }
  46. bool BehaviorInfo::IsAudioRendererProcessingTimeLimit80PercentSupported() const {
  47. return AudioCommon::IsRevisionSupported(5, user_revision);
  48. }
  49. bool BehaviorInfo::IsAudioRendererProcessingTimeLimit75PercentSupported() const {
  50. return AudioCommon::IsRevisionSupported(4, user_revision);
  51. }
  52. bool BehaviorInfo::IsAudioRendererProcessingTimeLimit70PercentSupported() const {
  53. return AudioCommon::IsRevisionSupported(1, user_revision);
  54. }
  55. bool BehaviorInfo::IsElapsedFrameCountSupported() const {
  56. return AudioCommon::IsRevisionSupported(5, user_revision);
  57. }
  58. bool BehaviorInfo::IsMemoryPoolForceMappingEnabled() const {
  59. return (flags & 1) != 0;
  60. }
  61. bool BehaviorInfo::IsFlushVoiceWaveBuffersSupported() const {
  62. return AudioCommon::IsRevisionSupported(5, user_revision);
  63. }
  64. bool BehaviorInfo::IsVoicePlayedSampleCountResetAtLoopPointSupported() const {
  65. return AudioCommon::IsRevisionSupported(5, user_revision);
  66. }
  67. bool BehaviorInfo::IsVoicePitchAndSrcSkippedSupported() const {
  68. return AudioCommon::IsRevisionSupported(5, user_revision);
  69. }
  70. bool BehaviorInfo::IsMixInParameterDirtyOnlyUpdateSupported() const {
  71. return AudioCommon::IsRevisionSupported(7, user_revision);
  72. }
  73. bool BehaviorInfo::IsSplitterBugFixed() const {
  74. return AudioCommon::IsRevisionSupported(5, user_revision);
  75. }
  76. void BehaviorInfo::CopyErrorInfo(BehaviorInfo::OutParams& dst) {
  77. dst.error_count = static_cast<u32>(error_count);
  78. std::copy(errors.begin(), errors.begin() + error_count, dst.errors.begin());
  79. }
  80. } // namespace AudioCore