110 lines
2.9 KiB
C#
110 lines
2.9 KiB
C#
/// Copyright (c) 2024 Xiaomi Corporation (authors: Fangjun Kuang)
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace SherpaOnnx
|
|
{
|
|
public class CircularBuffer : IDisposable
|
|
{
|
|
public CircularBuffer(int capacity)
|
|
{
|
|
IntPtr h = SherpaOnnxCreateCircularBuffer(capacity);
|
|
_handle = new HandleRef(this, h);
|
|
}
|
|
|
|
public void Push(float[] data)
|
|
{
|
|
SherpaOnnxCircularBufferPush(_handle.Handle, data, data.Length);
|
|
}
|
|
|
|
public float[] Get(int startIndex, int n)
|
|
{
|
|
IntPtr p = SherpaOnnxCircularBufferGet(_handle.Handle, startIndex, n);
|
|
|
|
float[] ans = new float[n];
|
|
Marshal.Copy(p, ans, 0, n);
|
|
|
|
SherpaOnnxCircularBufferFree(p);
|
|
|
|
return ans;
|
|
}
|
|
|
|
public void Pop(int n)
|
|
{
|
|
SherpaOnnxCircularBufferPop(_handle.Handle, n);
|
|
}
|
|
|
|
public int Size
|
|
{
|
|
get
|
|
{
|
|
return SherpaOnnxCircularBufferSize(_handle.Handle);
|
|
}
|
|
}
|
|
|
|
public int Head
|
|
{
|
|
get
|
|
{
|
|
return SherpaOnnxCircularBufferHead(_handle.Handle);
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
SherpaOnnxCircularBufferReset(_handle.Handle);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Cleanup();
|
|
// Prevent the object from being placed on the
|
|
// finalization queue
|
|
System.GC.SuppressFinalize(this);
|
|
}
|
|
|
|
~CircularBuffer()
|
|
{
|
|
Cleanup();
|
|
}
|
|
|
|
private void Cleanup()
|
|
{
|
|
SherpaOnnxDestroyCircularBuffer(_handle.Handle);
|
|
|
|
// Don't permit the handle to be used again.
|
|
_handle = new HandleRef(this, IntPtr.Zero);
|
|
}
|
|
|
|
private HandleRef _handle;
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern IntPtr SherpaOnnxCreateCircularBuffer(int capacity);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern void SherpaOnnxDestroyCircularBuffer(IntPtr handle);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern void SherpaOnnxCircularBufferPush(IntPtr handle, float[] p, int n);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern IntPtr SherpaOnnxCircularBufferGet(IntPtr handle, int startIndex, int n);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern void SherpaOnnxCircularBufferFree(IntPtr p);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern void SherpaOnnxCircularBufferPop(IntPtr handle, int n);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern int SherpaOnnxCircularBufferSize(IntPtr handle);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern int SherpaOnnxCircularBufferHead(IntPtr handle);
|
|
|
|
[DllImport(Dll.Filename)]
|
|
private static extern void SherpaOnnxCircularBufferReset(IntPtr handle);
|
|
}
|
|
}
|