aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs')
-rw-r--r--src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs b/src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs
new file mode 100644
index 00000000..35c71ae3
--- /dev/null
+++ b/src/Ryujinx.Audio/Renderer/Utils/Mailbox.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Concurrent;
+
+namespace Ryujinx.Audio.Renderer.Utils
+{
+ /// <summary>
+ /// A simple generic message queue for unmanaged types.
+ /// </summary>
+ /// <typeparam name="T">The target unmanaged type used</typeparam>
+ public class Mailbox<T> : IDisposable where T : unmanaged
+ {
+ private BlockingCollection<T> _messageQueue;
+ private BlockingCollection<T> _responseQueue;
+
+ public Mailbox()
+ {
+ _messageQueue = new BlockingCollection<T>(1);
+ _responseQueue = new BlockingCollection<T>(1);
+ }
+
+ public void SendMessage(T data)
+ {
+ _messageQueue.Add(data);
+ }
+
+ public void SendResponse(T data)
+ {
+ _responseQueue.Add(data);
+ }
+
+ public T ReceiveMessage()
+ {
+ return _messageQueue.Take();
+ }
+
+ public T ReceiveResponse()
+ {
+ return _responseQueue.Take();
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ _messageQueue.Dispose();
+ _responseQueue.Dispose();
+ }
+ }
+ }
+} \ No newline at end of file