CircularBuffer.cs
2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/// 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);
}
}