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,6 +28,10 @@ Stream::Stream(unsigned nc, bool x, unsi _numSamples = ns; _paused = false; + xAsIndex = true; + xMin = 0; + xMax = 1; + // create xdata buffer _hasx = x; if (x) @@ -36,7 +41,7 @@ Stream::Stream(unsigned nc, bool x, unsi } else { - xData = new IndexBuffer(ns); + xData = makeXBuffer(); } // create channels @@ -124,7 +129,7 @@ void Stream::setNumChannels(unsigned nc, } else { - xData = new IndexBuffer(_numSamples); + xData = makeXBuffer(); } for (auto c : channels) @@ -144,6 +149,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()); @@ -241,6 +258,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);