#ifndef VOLUME_H
#define VOLUME_H

#include <fstream>

#include <kdebug.h>

class Volume
{
 public:
  enum ChannelMask { MNONE     = 0,
                     MLEFT     = 1, MRIGHT     =   2, MCENTER =  4,
                     MMAIN     = 3, MFRONT    = 7,
                     MREARLEFT = 8, MREARRIGHT =  16, MWOOFER = 32,
                     MREAR     = 56,
                     MLEFTREC  = 64, MRIGHTREC = 128,
                     MREC      =192,
                     MCUSTOM1  =256, MCUSTOM2  = 512,
                     MALL=65535 };


 enum ChannelID { CHIDMIN  = 0,
                  LEFT     = 0, RIGHT     = 1, CENTER = 2,
                  REARLEFT = 3, REARRIGHT = 4, WOOFER = 5,
                  LEFTREC  = 6, RIGHTREC  = 7,
                  CUSTOM1  = 8, CUSTOM2   = 9, CHIDMAX  = 9 };


  Volume( ChannelMask chmask = MALL, long maxVolume = 100, long minVolume=0, bool isCapture=false );
  Volume( const Volume &v );
  Volume( int channels, long maxVolume );



  // Set all volumes as given by vol
  void setAllVolumes(long vol);
  // Set all volumes to the ones given in vol
  void setVolume(const Volume &vol );
  // Set volumes as specified by the channel mask
  void setVolume( const Volume &vol, ChannelMask chmask);
  void setVolume( ChannelID chid, long volume);

  long getVolume(ChannelID chid);
  long getAvgVolume(ChannelMask chmask);
  long getTopStereoVolume(ChannelMask chmask);
  long operator[](int);
  long maxVolume();
  long minVolume();
  int  count();

  void setMuted( bool val ) { _muted = val; };
  bool isMuted()      { return _muted; };
  bool isCapture() { return _isCapture; };

  friend std::ostream& operator<<(std::ostream& os, const Volume& vol);
  friend kdbgstream& operator<<(kdbgstream& os, const Volume& vol);

    // _channelMaskEnum[] and the following elements moved to public seection. operator<<() could not
    // access it, when private. Strange, as operator<<() is declared friend.
  static int _channelMaskEnum[10];
  bool          _muted;
  bool          _isCapture; // true, when the Volume represents capture/record levels
  long          _chmask;
  long          _volumes[CHIDMAX+1];
  long          _maxVolume;
  long          _minVolume;

private:
  void init( ChannelMask chmask, long, long, bool );

  long volrange( int vol );
  long volrangeRec( int vol );
};

std::ostream& operator<<(std::ostream& os, const Volume& vol);
kdbgstream& operator<<(kdbgstream &os, const Volume& vol);

#endif // VOLUME

