/* Blinker
   Copyright 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
   Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
   a blinkenarea.org project */

#ifndef BLINKER_STREAM_H
#define BLINKER_STREAM_H

#include <set>
#include <string>

#include <BlinkenLib/BlinkenFrame.h>

#include "StreamRecv.h"

namespace Blinker {

/// a video stream
class Stream
{
protected:
  /// set of receivers of this stream
  typedef std::set<StreamRecv *> Recvs;

public:
  /// constructor
  Stream();

  /// destructor
  ~Stream();

public:
  /**
   * @brief attach a stream receiver
   * @param[in] recv stream receiver to attach
   */
  void attach(StreamRecv *recv);

  /**
   * @brief detach a stream receiver
   * @param[in] recv stream receiver to detach
   */
  void detach(StreamRecv *recv);

  /**
   * @brief set current frame
   * @param[in] pFrame current frame (NULL for none)
   */
  void setFrame(stBlinkenFrame *pFrame);

  /**
   * @brief get current frame
   * @return current frame (NULL for none)
   */
  stBlinkenFrame * getCurFrame() const;

protected:
  /// stream name
  std::string m_name;
  /// current frame (or NULL if no frame)
  stBlinkenFrame *m_pFrame;
  /// receivers of this stream
  Recvs m_recvs;

friend class StreamMgr;
}; // class Stream

} // namespace Blinker

#endif // #ifndef BLINKER_STREAM_H

