This repository has been archived on 2025-08-26. You can view files and clone it, but cannot push or open issues or pull requests.
Files
enginex-mr_series-sherpa-onnx/scripts/dotnet/CircularBuffer.cs
东风破 00de2bd00b Refactor .Net example project (#1049)
Co-authored-by: 东风破 <birdfishs@163.com>
2024-06-24 10:10:13 +08:00

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);
}
}