65 lines
1.6 KiB
C#

using UnityEngine;
using System.Runtime.InteropServices;
using IntPtr = System.IntPtr;
namespace Klak.Spout {
//
// Wrapper class for sender instances on the native plugin side
//
sealed class Sender : System.IDisposable
{
#region Private objects
IntPtr _plugin;
EventKicker _event;
#endregion
#region Object lifecycle
public Sender(string target, Texture texture)
{
// Plugin object allocation
_plugin = Plugin.CreateSender(target, texture.width, texture.height);
if (_plugin == IntPtr.Zero) return;
// Event kicker (heap block for interop communication)
_event = new EventKicker
(new EventData(_plugin, texture.GetNativeTexturePtr()));
// Initial update event
_event.IssuePluginEvent(EventID.UpdateSender);
}
public void Dispose()
{
if (_plugin != IntPtr.Zero)
{
// Isssue the closer event to destroy the plugin object from the
// render thread.
_event.IssuePluginEvent(EventID.CloseSender);
// Event kicker (interop memory) deallocation:
// The close event above will refer to the block from the render
// thread, so we actually can't free the memory here. To avoid this
// problem, EventKicker uses MemoryPool to delay the memory
// deallocation by the end of the frame.
_event.Dispose();
_plugin = IntPtr.Zero;
}
}
#endregion
#region Frame update method
public void Update()
=> _event?.IssuePluginEvent(EventID.UpdateSender);
#endregion
}
} // namespace Klak.Spout