#pragma once template class ScopeDataCollector { public: //============================================================================== ScopeDataCollector(AudioBufferQueue& 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& audioBufferQueue; std::array::bufferSize> buffer; size_t numCollected; SampleType prevSample = SampleType(100); static constexpr auto triggerLevel = SampleType(0.05); enum class State { waitingForTrigger, collecting } state{ State::waitingForTrigger }; };