yuzu/src/audio_core/adsp/mailbox.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

61 lines
1.2 KiB
C++
Raw Normal View History

2023-08-31 15:09:15 +01:00
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
2023-08-31 15:09:15 +01:00
#include <span>
2023-08-31 15:09:15 +01:00
#include "common/bounded_threadsafe_queue.h"
#include "common/common_types.h"
namespace AudioCore::ADSP {
enum class AppMailboxId : u32 {
Invalid = 0,
AudioRenderer = 50,
AudioRendererMemoryMapUnmap = 51,
};
enum class Direction : u32 {
Host,
DSP,
};
class Mailbox {
public:
void Initialize(AppMailboxId id_) {
Reset();
id = id_;
}
AppMailboxId Id() const noexcept {
return id;
}
2023-08-31 15:09:15 +01:00
void Send(Direction dir, u32 message) {
2023-08-31 15:09:15 +01:00
auto& queue = dir == Direction::Host ? host_queue : adsp_queue;
2023-08-31 15:09:15 +01:00
queue.EmplaceWait(message);
2023-08-31 15:09:15 +01:00
}
2023-08-31 15:09:15 +01:00
u32 Receive(Direction dir, std::stop_token stop_token = {}) {
2023-08-31 15:09:15 +01:00
auto& queue = dir == Direction::Host ? host_queue : adsp_queue;
2023-08-31 15:09:15 +01:00
return queue.PopWait(stop_token);
2023-08-31 15:09:15 +01:00
}
void Reset() {
id = AppMailboxId::Invalid;
2023-08-31 15:09:15 +01:00
u32 t{};
2023-08-31 15:09:15 +01:00
while (host_queue.TryPop(t)) {
}
while (adsp_queue.TryPop(t)) {
}
}
private:
AppMailboxId id{0};
2023-08-31 15:09:15 +01:00
Common::SPSCQueue<u32> host_queue;
Common::SPSCQueue<u32> adsp_queue;
2023-08-31 15:09:15 +01:00
};
} // namespace AudioCore::ADSP