20template <
typename SampleType>
26 : audioBufferQueue(queueToUse)
30 bufferSize = buffer.size();
43 void process(
const SampleType *data,
size_t numSamples)
47 int numBuffersToPush = numSamples / bufferSize;
48 int numSamplesExceeding = numSamples % bufferSize;
49 int numEmptyBuffers = 0;
50 int additionalSamples = 0;
53 if (state == State::waitingForTrigger)
55 std::fill(buffer.begin(), buffer.end(), 0);
57 if (std::all_of(data, data + numSamples, [](SampleType i)
58 {
return i < triggerLevel; }))
60 for (
size_t i = 0; i < numBuffersToPush; i++)
62 audioBufferQueue.push(buffer.data(), bufferSize);
64 numCollected = numSamplesExceeding;
70 while (*result < triggerLevel)
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++)
81 audioBufferQueue.push(buffer.data(), bufferSize);
83 numCollected = additionalSamples;
89 if (state == State::collecting)
91 while (index++ < numSamples)
93 buffer[numCollected++] = *data++;
95 if (numCollected == buffer.size())
97 audioBufferQueue.push(buffer.data(), buffer.size());
107 std::vector<SampleType> buffer;
110 SampleType prevSample = SampleType(100);
112 static constexpr auto triggerLevel = SampleType(0);
121 } state{State::waitingForTrigger};
ScopeDataCollector(AudioBufferQueue< SampleType > &queueToUse)
void process(const SampleType *data, size_t numSamples)