Oscilloscope 0.5.0
A simple oscilloscope VST
Loading...
Searching...
No Matches
ScopeDataCollector.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 ScopeDataCollector.h
5 Created: 24 Feb 2023 6:49:28pm
6 Author: wadda
7
8 ==============================================================================
9*/
10
11#pragma once
12#include "AudioBufferQueue.h"
13#include <cstdlib>
14
20template <typename SampleType>
22{
23public:
24 //==============================================================================
26 : audioBufferQueue(queueToUse)
27 {
28 // resize buffer
29 buffer.resize(queueToUse.getBufferSize());
30 bufferSize = buffer.size();
31
32 // reset num collected
33 numCollected = 0;
34 }
35
36 //==============================================================================
43 void process(const SampleType *data, size_t numSamples)
44 {
45 // declare variables
46 size_t index = 0;
47 int numBuffersToPush = numSamples / bufferSize;
48 int numSamplesExceeding = numSamples % bufferSize;
49 int numEmptyBuffers = 0;
50 int additionalSamples = 0;
51
52 // if no samples still collected
53 if (state == State::waitingForTrigger)
54 {
55 std::fill(buffer.begin(), buffer.end(), 0);
56 // If no sample over treshold push silence.
57 if (std::all_of(data, data + numSamples, [](SampleType i)
58 { return i < triggerLevel; }))
59 {
60 for (size_t i = 0; i < numBuffersToPush; i++)
61 {
62 audioBufferQueue.push(buffer.data(), bufferSize);
63 }
64 numCollected = numSamplesExceeding;
65 }
66 // Else setup collecting stage
67 else
68 {
69 auto result = data;
70 while (*result < triggerLevel)
71 {
72 result++;
73 }
74 prevSample = *result;
75 state = State::collecting;
76 int firstSample = result - data;
77 numEmptyBuffers = firstSample / bufferSize;
78 additionalSamples = firstSample % bufferSize;
79 for (size_t i = 0; i < numEmptyBuffers; i++)
80 {
81 audioBufferQueue.push(buffer.data(), bufferSize);
82 }
83 numCollected = additionalSamples;
84 index = firstSample;
85 }
86 }
87
88 // if already collecting
89 if (state == State::collecting)
90 {
91 while (index++ < numSamples)
92 {
93 buffer[numCollected++] = *data++;
94
95 if (numCollected == buffer.size())
96 {
97 audioBufferQueue.push(buffer.data(), buffer.size());
98 numCollected = 0;
99 }
100 }
101 }
102 }
103
104private:
105 //==============================================================================
106 AudioBufferQueue<SampleType> &audioBufferQueue;
107 std::vector<SampleType> buffer;
108 int bufferSize;
109 size_t numCollected;
110 SampleType prevSample = SampleType(100);
112 static constexpr auto triggerLevel = SampleType(0);
117 enum class State
118 {
119 waitingForTrigger,
120 collecting
121 } state{State::waitingForTrigger};
122};
ScopeDataCollector(AudioBufferQueue< SampleType > &queueToUse)
void process(const SampleType *data, size_t numSamples)