62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
#pragma once
|
|
|
|
template <typename SampleType>
|
|
class ScopeDataCollector
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
ScopeDataCollector(AudioBufferQueue<SampleType>& queueToUse)
|
|
: audioBufferQueue(queueToUse)
|
|
{
|
|
}
|
|
|
|
//==============================================================================
|
|
void process(const SampleType* data, size_t numSamples)
|
|
{
|
|
size_t index = 0;
|
|
|
|
if (state == State::waitingForTrigger)
|
|
{
|
|
while (index++ < numSamples)
|
|
{
|
|
auto currentSample = *data++;
|
|
|
|
if (currentSample >= triggerLevel && prevSample < triggerLevel)
|
|
{
|
|
numCollected = 0;
|
|
state = State::collecting;
|
|
break;
|
|
}
|
|
|
|
prevSample = currentSample;
|
|
}
|
|
}
|
|
|
|
if (state == State::collecting)
|
|
{
|
|
while (index++ < numSamples)
|
|
{
|
|
buffer[numCollected++] = *data++;
|
|
|
|
if (numCollected == buffer.size())
|
|
{
|
|
audioBufferQueue.push(buffer.data(), buffer.size());
|
|
state = State::waitingForTrigger;
|
|
prevSample = SampleType(100);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
//==============================================================================
|
|
AudioBufferQueue<SampleType>& audioBufferQueue;
|
|
std::array<SampleType, AudioBufferQueue<SampleType>::bufferSize> buffer;
|
|
size_t numCollected;
|
|
SampleType prevSample = SampleType(100);
|
|
|
|
static constexpr auto triggerLevel = SampleType(0.05);
|
|
|
|
enum class State { waitingForTrigger, collecting } state{ State::waitingForTrigger };
|
|
}; |