mailbox.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/bounded_threadsafe_queue.h"
  5. #include "common/common_types.h"
  6. namespace AudioCore::ADSP {
  7. enum class AppMailboxId : u32 {
  8. Invalid = 0,
  9. AudioRenderer = 50,
  10. AudioRendererMemoryMapUnmap = 51,
  11. };
  12. enum class Direction : u32 {
  13. Host,
  14. DSP,
  15. };
  16. struct MailboxMessage {
  17. u32 msg;
  18. std::span<u8> data;
  19. };
  20. class Mailbox {
  21. public:
  22. void Initialize(AppMailboxId id_) {
  23. Reset();
  24. id = id_;
  25. }
  26. AppMailboxId Id() const noexcept {
  27. return id;
  28. }
  29. void Send(Direction dir, MailboxMessage&& message) {
  30. auto& queue = dir == Direction::Host ? host_queue : adsp_queue;
  31. queue.EmplaceWait(std::move(message));
  32. }
  33. MailboxMessage Receive(Direction dir, bool block = true) {
  34. auto& queue = dir == Direction::Host ? host_queue : adsp_queue;
  35. MailboxMessage t;
  36. if (block) {
  37. queue.PopWait(t);
  38. } else {
  39. queue.TryPop(t);
  40. }
  41. return t;
  42. }
  43. void Reset() {
  44. id = AppMailboxId::Invalid;
  45. MailboxMessage t;
  46. while (host_queue.TryPop(t)) {
  47. }
  48. while (adsp_queue.TryPop(t)) {
  49. }
  50. }
  51. private:
  52. AppMailboxId id{0};
  53. Common::SPSCQueue<MailboxMessage> host_queue;
  54. Common::SPSCQueue<MailboxMessage> adsp_queue;
  55. };
  56. } // namespace AudioCore::ADSP