//--------------------------------------------------------------------------------------
// Copyright (C) 2008 http://shift.delblanco.es
//--------------------------------------------------------------------------------------
// SHIFT Videogame 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, either version 3 of the License, or later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
//--------------------------------------------------------------------------------------
/// \file 3DSound.h
/// Clase para manejar los sonidos 3D de los objetos de la escena.
/// Cada objeto de la escena puede tener asociado un sonido, todas las
/// operaciones relacionadas con los sonidos se manejan desde este módulo
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __C3DSOUND_H__
#define __C3DSOUND_H__


//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
class C3DObject;

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
/// Directorio donde se deben buscar los ficheros de sonido
#define     SOUND3D_DIR                 L".\\sounds\\"

/// Nivel del efecto doppler del sonido 3D
#define     SOUND3D_DOPPLER_FACTOR      0.0f
/// Nivel de decaimiento del sonido 3D con la distancia
#define     SOUND3D_ROLL_OFF_FACTOR     0.2f
/// Distancia mínima de decaimiento del sonido 3D
#define     SOUND3D_MIN_DISTANCE        5.0f
/// Distancia máxima de decaimiento del sonido 3D
#define     SOUND3D_MAX_DISTANCE        150.0f

//--------------------------------------------------------------------------------------
/// Clase para manejar los sonidos 3D de los objetos de la escena.
//--------------------------------------------------------------------------------------
class C3DSound
{
friend class C3DSoundMng;

protected:  // Campos miembro

    CSound                  *m_pSound;            ///< Instancia del sonido a reproducir
    LPDIRECTSOUND3DBUFFER   m_pDS3DBuffer;        ///< Buffer 3D para el sonido
    DWORD                   m_lInitFrequency;     ///< Frecuencia base para el sonido emitido
    DWORD                   m_lLastFrequency;     ///< Frecuencia actual para el sonido emitido
    bool                    m_bLoop;              ///< Looping o no en la reproducción del sonido

    C3DObject               *m_pObject;           ///< Objeto asociado a este sonido

    /// Constructor
    C3DSound(C3DObject *pOwner, CSound *pSound, LPDIRECTSOUND3DBUFFER pDS3DBuffer,
             long lFrequency, long lVolume);
    /// Destructor
    ~C3DSound();

    /// Libera los sonidos
    void Release();

public: // Métodos públicos

    /// Actualiza el sonido
    void update();

    /// Reproduce el sonido, se puede indicar una reproducción en bucle cerrado
    void Play(bool loop = false);
    /// Pausa y Despausa la reproducción del sonido
    void Pause(bool enabled);
    /// Detiene la reproducción del sonido
    void Stop(void);

    /// Cambia el volumen de reproducción del sonido
    void setVolume(long lVolume);
    /// Cambia la frecuencia de reproducción del sonido
    void setFrecuency(long lFrequency);
    /// Toma la frecuencia actual de reproducción del sonido
    long getFrecuency(void)                     {return m_lLastFrequency;}
    /// Toma la frecuencia inicial de reproducción del sonido
    long getInitFrecuency(void)                 {return m_lInitFrequency;}

    /// Retorna si está o no en ejecución el sonido
    bool isPlaying(void)                        {return (m_pSound && m_pSound->IsSoundPlaying());}

    /// Función observadora del objeto asociado
    C3DObject *getObject(void)					{return m_pObject;}
};

#endif
