/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#ifndef SOUND3D_HH
#define SOUND3D_HH

#include "sound/sound_types.hh"
#include "init/init.hh"
#include "math/vector.hh"

class i4_3d_sound_parameters
//{{{
{
protected:
  i4_3d_sound_parameters() {}
public:
  static i4_3d_vector null;

  i4_frequency frequency;
  i4_volume volume;
  i4_3d_vector position, velocity;
  i4_bool looping, reverb;
  
  i4_3d_sound_parameters(i4_frequency freq,
                         i4_volume vol = I4_SOUND_VOLUME_LEVELS-1,
                         const i4_3d_vector& pos = null,
                         const i4_3d_vector& vel = null,
                         i4_bool looping = i4_F,
                         i4_bool reverb = i4_F)
    : frequency(freq), 
      volume(vol), 
      position(pos),
      velocity(vel),
      looping(looping), 
      reverb(reverb) {}

  void set(const i4_3d_sound_parameters ¶m)
  //{{{
  {
    frequency = param.frequency;
    volume = param.volume;
    position = param.position; 
    velocity = param.velocity;
    looping = param.looping; 
    reverb = param.reverb;
  }
  //}}}
};
//}}}

class i4_3d_voice_class : public i4_3d_sound_parameters
{
protected:
  i4_3d_voice_class() : i4_3d_sound_parameters() {}
public:
  i4_3d_voice_class(const i4_3d_sound_parameters ¶m)
    : i4_3d_sound_parameters(param.frequency, 
                             param.volume, 
                             param.position, 
                             param.velocity,
                             param.looping, 
                             param.reverb) {}

  typedef i4_bool (*completion_function_type)(void *_context);

  virtual void set_completer(completion_function_type completer, void *_context) = 0;
  virtual void play() = 0;
  virtual void update() = 0;
};

class i4_3d_sound_manager_class;
extern i4_3d_sound_manager_class *i4_3d_sound_man;

class i4_3d_sound_manager_class : public i4_init_class
{
protected:
public:
  virtual void init() { i4_3d_sound_man = this; }
  virtual void load_sounds(w32 max_sounds) = 0;
  virtual i4_3d_voice_class *alloc(i4_sound_id sound_id, const i4_3d_sound_parameters& param) = 0;
  i4_3d_voice_class *play(i4_sound_id sound_id, const i4_3d_sound_parameters& param)
  //{{{
  {
    i4_3d_voice_class *voc = alloc(sound_id,param);
    
    if (voc)
      voc->play();

    return voc;
  }
  //}}}

#ifndef I4_RETAIL
  virtual char *name() const = 0;
#endif
};

class i4_null_3d_sound_class;
extern class i4_null_3d_sound_class i4_null_3d_sound;

#endif

//{{{ Emacs Locals
// Local Variables:
// folded-file: t
// End:
//}}}