diff --git a/src/stream.cpp b/src/stream.cpp --- a/src/stream.cpp +++ b/src/stream.cpp @@ -20,6 +20,7 @@ #include "stream.h" #include "ringbuffer.h" #include "indexbuffer.h" +#include "linindexbuffer.h" Stream::Stream(unsigned nc, bool x, unsigned ns) : _infoModel(nc) @@ -27,15 +28,20 @@ Stream::Stream(unsigned nc, bool x, unsi _numSamples = ns; _paused = false; + xAsIndex = true; + xMin = 0; + xMax = 1; + // create xdata buffer _hasx = x; if (x) { - xData = new RingBuffer(ns); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); } else { - xData = new IndexBuffer(ns); + xData = makeXBuffer(); } // create channels @@ -81,6 +87,16 @@ StreamChannel* Stream::channel(unsigned return const_cast(static_cast(*this).channel(index)); } +QVector Stream::allChannels() const +{ + QVector result(numChannels()); + for (unsigned ci = 0; ci < numChannels(); ci++) + { + result[ci] = channel(ci); + } + return result; +} + const ChannelInfoModel* Stream::infoModel() const { return &_infoModel; @@ -118,11 +134,12 @@ void Stream::setNumChannels(unsigned nc, { if (x) { - xData = new RingBuffer(_numSamples); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); } else { - xData = new IndexBuffer(_numSamples); + xData = makeXBuffer(); } for (auto c : channels) @@ -142,6 +159,18 @@ void Stream::setNumChannels(unsigned nc, Sink::setNumChannels(nc, x); } +XFrameBuffer* Stream::makeXBuffer() const +{ + if (xAsIndex) + { + return new IndexBuffer(_numSamples); + } + else + { + return new LinIndexBuffer(_numSamples, xMin, xMax); + } +} + const SamplePack* Stream::applyGainOffset(const SamplePack& pack) const { Q_ASSERT(infoModel()->gainOrOffsetEn()); @@ -191,7 +220,9 @@ void Stream::feedIn(const SamplePack& pa unsigned ns = pack.numSamples(); if (_hasx) { - static_cast(xData)->addSamples(pack.xData(), ns); + // TODO: implement XRingBuffer (binary search) + Q_ASSERT(false); + // static_cast(xData)->addSamples(pack.xData(), ns); } // modified pack that gain and offset is applied to @@ -237,6 +268,24 @@ void Stream::setNumSamples(unsigned valu } } +void Stream::setXAxis(bool asIndex, double min, double max) +{ + xAsIndex = asIndex; + xMin = min; + xMax = max; + + // Note that x axis scaling is ignored when X is provided from source as data + // TODO: assert (UI options for x axis should be disabled) + if (!hasX()) + { + xData = makeXBuffer(); + for (auto c : channels) + { + c->setX(xData); + } + } +} + void Stream::saveSettings(QSettings* settings) const { _infoModel.saveSettings(settings);