Pascal API for VAD (#1249)
This commit is contained in:
106
pascal-api-examples/vad/circular_buffer.pas
Normal file
106
pascal-api-examples/vad/circular_buffer.pas
Normal file
@@ -0,0 +1,106 @@
|
||||
{ Copyright (c) 2024 Xiaomi Corporation }
|
||||
program circular_buffer;
|
||||
{
|
||||
This file shows how to use the CircularBuffer API of sherpa-onnx
|
||||
}
|
||||
|
||||
{$mode objfpc}
|
||||
{$ASSERTIONS ON}
|
||||
|
||||
uses
|
||||
sherpa_onnx;
|
||||
|
||||
var
|
||||
Buffer: TSherpaOnnxCircularBuffer;
|
||||
Samples: TSherpaOnnxSamplesArray;
|
||||
begin
|
||||
{The initial capacity is 5. It will be resized automatically if needed.}
|
||||
Buffer := TSherpaOnnxCircularBuffer.Create(5);
|
||||
Assert(Buffer.Size = 0);
|
||||
Assert(Buffer.Head = 0);
|
||||
Buffer.Push([0, 10, 20]);
|
||||
|
||||
{Push() changes Size. Head is not changed.}
|
||||
Assert(Buffer.Size = 3);
|
||||
Assert(Buffer.Head = 0);
|
||||
|
||||
Samples := Buffer.Get(0, 1);
|
||||
Assert(Length(Samples) = 1);
|
||||
Assert(Samples[0] = 0);
|
||||
|
||||
{ Get() does not change Size or Head}
|
||||
Assert(Buffer.Size = 3);
|
||||
Assert(Buffer.Head = 0);
|
||||
|
||||
Samples := Buffer.Get(0, 2);
|
||||
Assert(Length(Samples) = 2);
|
||||
Assert(Samples[0] = 0);
|
||||
Assert(Samples[1] = 10);
|
||||
|
||||
{ The buffer will be resized since its initial capacity is 5 but we have
|
||||
pushed 7 elements into it.
|
||||
|
||||
No data is lost during the resize.
|
||||
}
|
||||
Buffer.Push([30, 40, 50, 60]);
|
||||
|
||||
Assert(Buffer.Size = 7); {There are now 7 elements}
|
||||
Assert(Buffer.Head = 0);
|
||||
|
||||
{Remove the first 4 elements}
|
||||
Buffer.Pop(4);
|
||||
|
||||
Assert(Buffer.Size = 3); {There are only 3 elements left}
|
||||
Assert(Buffer.Head = 4);
|
||||
|
||||
Samples := Buffer.Get(Buffer.Head, 2);
|
||||
Assert(Length(Samples) = 2);
|
||||
Assert(Samples[0] = 40);
|
||||
Assert(Samples[1] = 50);
|
||||
|
||||
Buffer.Pop(1);
|
||||
|
||||
Assert(Buffer.Size = 2); {There are only 2 elements left}
|
||||
Assert(Buffer.Head = 5);
|
||||
|
||||
Samples := Buffer.Get(Buffer.Head, 2);
|
||||
Assert(Length(Samples) = 2);
|
||||
Assert(Samples[0] = 50);
|
||||
Assert(Samples[1] = 60);
|
||||
|
||||
Buffer.Pop(2);
|
||||
Assert(Buffer.Size = 0); {There are no elements left}
|
||||
Assert(Buffer.Head = 7);
|
||||
|
||||
Buffer.Push([100, 200, 300, 400, 500]);
|
||||
Assert(Buffer.Size = 5);
|
||||
Assert(Buffer.Head = 7);
|
||||
|
||||
Buffer.Pop(4);
|
||||
Assert(Buffer.Size = 1);
|
||||
|
||||
{Head can be larger than the Capacity!
|
||||
This is what circular means. It points to Buffer.Head / Capacity.
|
||||
}
|
||||
Assert(Buffer.Head = 11);
|
||||
Buffer.Push([600, 700]);
|
||||
|
||||
Assert(Buffer.Size = 3);
|
||||
Assert(Buffer.Head = 11);
|
||||
|
||||
Samples := Buffer.Get(Buffer.Head, 3);
|
||||
Assert(Length(Samples) = 3);
|
||||
Assert(Samples[0] = 500);
|
||||
Assert(Samples[1] = 600);
|
||||
Assert(Samples[2] = 700);
|
||||
|
||||
Buffer.Pop(3);
|
||||
Assert(Buffer.Size = 0);
|
||||
Assert(Buffer.Head = 14);
|
||||
|
||||
Buffer.Reset();
|
||||
|
||||
Assert(Buffer.Size = 0);
|
||||
Assert(Buffer.Head = 0);
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user