diff --git a/src/stream.h b/src/stream.h
new file mode 100644
--- /dev/null
+++ b/src/stream.h
@@ -0,0 +1,82 @@
+/*
+ Copyright © 2017 Hasan Yavuz Özderya
+
+ This file is part of serialplot.
+
+ serialplot is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ serialplot is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with serialplot. If not, see .
+*/
+
+#ifndef STREAM_H
+#define STREAM_H
+
+#include
+#include
+#include
+#include
+
+#include "sink.h"
+#include "source.h"
+#include "channelinfomodel.h"
+#include "streamchannel.h"
+
+/**
+ * Main waveform storage class. It consists of channels. Channels are
+ * synchronized with each other.
+ *
+ * Implements `Sink` class for data entry. It's expected to be
+ * connected to a `Device` source. Also implements a `Source` class
+ * for data that exists the buffers.
+ */
+class Stream : public Sink, public Source, public QObject
+{
+public:
+ /**
+ * @param nc number of channels
+ * @param ns number of samples
+ */
+ Stream(unsigned ns);
+ ~Stream();
+
+ // implementations for `Source`
+ virtual bool hasX() const;
+ virtual unsigned numChannels();
+
+ // implementations for `Sink`
+ virtual void setNumChannels(unsigned nc, bool x);
+
+ unsigned numSamples() const;
+ const StreamChannel* channel(unsigned index) const;
+ /// Saves channel information
+ void saveSettings(QSettings* settings) const;
+ /// Load channel information
+ void loadSettings(QSettings* settings);
+
+signals:
+ void numChannelsChanged(unsigned value);
+ void numSamplesChanged(unsigned value);
+ void channelAdded(const StreamChannel* chan);
+ void channelNameChanged(unsigned channel, QString name); // TODO: does it stay?
+ void dataAdded(); ///< emitted when data added to channel man.
+
+public slots:
+ // TODO: these won't be public
+ void setNumChannels(unsigned number);
+ void setNumSamples(unsigned number);
+
+ /// When paused `addData` does nothing.
+ void pause(bool paused);
+};
+
+
+#endif // STREAM_H
diff --git a/src/streamchannel.cpp b/src/streamchannel.cpp
new file mode 100644
--- /dev/null
+++ b/src/streamchannel.cpp
@@ -0,0 +1,43 @@
+/*
+ Copyright © 2017 Hasan Yavuz Özderya
+
+ This file is part of serialplot.
+
+ serialplot is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ serialplot is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with serialplot. If not, see .
+*/
+
+#include "streamchannel.h"
+
+StreamChannel::StreamChannel(unsigned i, const FrameBuffer* x,
+ FrameBuffer* y, ChannelInfoModel* info)
+{
+ _index = i;
+ _x = x;
+ _y = y;
+ _info = info;
+}
+
+StreamChannel::~StreamChannel()
+{
+ delete _y;
+}
+
+unsigned StreamChannel::index() const {return _index;}
+QString StreamChannel::name() const {return _info->name(_index)};
+QColor StreamChannel::color() const {return _info->color(_index)};
+bool StreamChannel::visible() const {return _info->isVisible(_index)};
+const FrameBuffer* StreamChannel::xData() const {return _x;}
+const FrameBuffer* StreamChannel::yData() const {return _y;}
+FrameBuffer* StreamChannel::yData() {return _y;}
+const ChannelInfoModel* StreamChannel::info() const {return _info;}
diff --git a/src/streamchannel.h b/src/streamchannel.h
new file mode 100644
--- /dev/null
+++ b/src/streamchannel.h
@@ -0,0 +1,62 @@
+/*
+ Copyright © 2017 Hasan Yavuz Özderya
+
+ This file is part of serialplot.
+
+ serialplot is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ serialplot is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with serialplot. If not, see .
+*/
+
+#ifndef STREAMCHANNEL_H
+#define STREAMCHANNEL_H
+
+// IMPORTANT TODO: rename to "framebuffer.h" when stream work is done.
+#include "framebuffer2.h"
+
+#include "channelinfomodel.h"
+
+class StreamChannel
+{
+public:
+ /**
+ * Creates a stream channel.
+ *
+ * @param i index of the channel
+ * @param x x axis buffer
+ * @param y data buffer of this channel, takes ownership
+ * @param info channel info model
+ */
+ StreamChannel(unsigned i,
+ const FrameBuffer* x,
+ FrameBuffer* y,
+ ChannelInfoModel* info);
+ ~StreamChannel();
+
+ unsigned index() const;
+ QString name() const;
+ QColor color() const;
+ bool visible() const;
+ const FrameBuffer* xData() const;
+ FrameBuffer* yData();
+ const FrameBuffer* yData() const;
+ const ChannelInfoModel* info() const;
+
+
+private:
+ unsigned _index;
+ const FrameBuffer* _x;
+ FrameBuffer* _y;
+ ChannelInfoModel* _info;
+};
+
+#endif // STREAMCHANNEL_H