#ifndef __MIXER_IFACE_H
#define __MIXER_IFACE_H

#include <dcopobject.h>

class MixerIface : virtual public DCOPObject
{
   K_DCOP

k_dcop:
   /**
    Sets the volume of the device with index deviceidx to the percentage
    specified in the second parameter. The deviceidx is got from the array
    at the start of mixer_oss.cpp .
    */
   virtual void setVolume( int deviceidx, int percentage )=0;
   /**
    A simpler way to access the master volume (which is deviceidx 0).
    */
   virtual void setMasterVolume( int percentage )=0;

   /**
    Increase the volume of the given device by a given percentage.
    */
   virtual void increaseVolume( int deviceidx, int percentage )=0;
   /**
    Decrease the volume of the given device by a a given percentage.
    */
   virtual void decreaseVolume( int deviceidx, int percentage )=0;

   /**
    Returns the volume of the device (as a percentage, 0..100).
    */
   virtual int volume( int deviceidx )=0;
   /**
    Returns the volume of the master device (as a percentage, 0..100).
    */
   virtual int masterVolume()=0;


   /**
    Sets the absolute volume of the device. Lower bound is absoluteVolumeMin(),
    upper bound is absoluteVolumeMax().
    */
   virtual void setAbsoluteVolume( int deviceidx, long absoluteVolume )=0;
   /**
    Returns the absolute volume of the device. The volume is in the range of
    absoluteVolumeMin() <= absoluteVolume() <= absoluteVolumeMax()
    */
   virtual long absoluteVolume( int deviceidx )=0;
   /**
    Returns the absolute maximum volume of the device.
    */
   virtual long absoluteVolumeMin( int deviceidx )=0;
   /**
    Returns the absolute minimum volume of the device.
    */
   virtual long absoluteVolumeMax( int deviceidx )=0;

   /**
    Mutes or unmutes the specified device.
    */
   virtual void setMute( int deviceidx, bool on )=0;
   /**
    Mutes or unmutes the master device.
    */
   virtual void setMasterMute( bool on )=0;
   /**
    Toggles mute-state for the given device.
    */
   virtual void toggleMute( int deviceidx )=0;
   /**
    Toggles mute-state for the master device.
    */
   virtual void toggleMasterMute()=0;
   /**
    Returns if the given device is muted or not. If the device is not
    available in this mixer, it is reported as muted.
    */
   virtual bool mute( int deviceidx )=0;
   /**
    Returns if the master device is muted or not. If the device is not
    available in this mixer, it is reported as muted.
    */
   virtual bool masterMute()=0;
   
   /**
    Returns the index of the master device
    */
   virtual int masterDeviceIndex()=0;

   /**
    Makes the given device a record source.
    */
   virtual void setRecordSource( int deviceidx, bool on )=0;

   /**
    Returns if the given device is a record source.
    */
   virtual bool isRecordSource( int deviceidx )=0;
       
   /**
    Sets the balance of the master device (negative means balanced to the left
    speaker and positive to the right one)
    */
   virtual void setBalance( int balance )=0;

   /**
    Returns true if the given device is available in the current mixer
    and false if it's not.
    */
   virtual bool isAvailableDevice( int deviceidx )=0;

   /**
    Returns the name of the mixer.
    */
   virtual TQString mixerName()=0;

    /**
     * Open/grab the mixer for further intraction
     * You should use this method after a prior call of close(). See close() for usage directions.
     */
    virtual int open()=0;

    /**
     * Close/release the mixer
     * This method SHOULD NOT be used via DCOP. You MAY use it if you really need to close the mixer device,
     * for example when a software suspend action (ACPI) takes place, and the soundcard driver
     * doesn't handle this situation gracefully.
     */
    virtual int close()=0;

};

#endif
