
/*
 * --- GSMP-COPYRIGHT-NOTE-BEGIN ---
 * 
 * This copyright note is auto-generated by ./scripts/Create-CopyPatch.
 * Please add additional copyright information _after_ the line containing
 * the GSMP-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
 * the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
 * 
 * GSMP: pcm/include/BasicStream.hh
 * General Sound Manipulation Program is Copyright (C) 2000 - 2004
 *   Valentin Ziegler and René Rebe
 * 
 * This program 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; version 2. A copy of the GNU General
 * Public License can be found in the file LICENSE.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT-
 * ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 * 
 * --- GSMP-COPYRIGHT-NOTE-END ---
 */

/* Short Description:
 *   A class to group simple one-channel PcmBuffers into a multi-channel
 *   buffer, surrounded by some helper functions ...
 */

#ifndef LOWLEVEL___BASICSTREAM_HH__
#define LOWLEVEL___BASICSTREAM_HH__

#include "Types.hh"
#include "PcmBuffer.hh"

#include <string>
#include <vector>

namespace GSMP
{
  class BasicStream
  {
  public:
    
    typedef int32_t pcm_type;
    typedef HostEndianessTraits endianess_type;

    typedef PcmBuffer<pcm_type, endianess_type> BufferType;
    
    BasicStream (channel_index i_channels,
		 local_index i_size);
    virtual ~BasicStream ();
    
    channel_index Channels () const { return channels; };
    
    // obtain the wohle buffer length
    local_index Size () const { return size; };
    
    // should only clear the used_size
    void Clear ();
    // obtain the used size
    local_index UsedSize () const;
    // obtain the free size
    local_index FreeSize () const;

    // only for use with direct data access!!
    void SetUsedSize (local_index new_used_size);
    
    BufferType* operator[] (channel_index channel);
    
  private:
    channel_index channels;
    local_index size;
    
    std::vector <BufferType*> buffers;
  };

} // end namespace GSMP

#endif // LOWLEVEL__BASICSTREAM_HH__
