/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** 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, either version 3 of the License, or
** (at your option) any 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.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : WWAudio *
* *
* $Archive:: /Commando/Code/WWAudio/AudibleSound.h $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 12/13/01 2:24p $*
* *
* $Revision:: 25 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef __SOUNDOBJ_H
#define __SOUNDOBJ_H
#pragma warning (push, 3)
#include "mss.h"
#pragma warning (pop)
//#include
#include "vector3.h"
#include "matrix3d.h"
#include "refcount.h"
#include "rawfile.h"
#include "soundsceneobj.h"
#include "vector.h"
#include "wwstring.h"
#include "definition.h"
/////////////////////////////////////////////////////////////////////////////////
// Forward declarations
/////////////////////////////////////////////////////////////////////////////////
class SoundBufferClass;
class RenderObjClass;
class LogicalSoundClass;
class AudibleSoundDefinitionClass;
class Sound3DClass;
class SoundPseudo3DClass;
class FilteredSoundClass;
class Listener3DClass;
class SoundHandleClass;
/////////////////////////////////////////////////////////////////////////////////
//
// Typedefs
//
typedef unsigned long MILES_HANDLE;
typedef enum
{
INFO_OBJECT_PTR = 0,
INFO_MAX
} HANDLE_USER_INDEX;
/////////////////////////////////////////////////////////////////////////////////
//
// Constants
//
/////////////////////////////////////////////////////////////////////////////////
const MILES_HANDLE INVALID_MILES_HANDLE = (MILES_HANDLE)-1;
const int INFINITE_LOOPS = 0;
/////////////////////////////////////////////////////////////////////////////////
//
// AudibleSoundClass
//
// Base class defining a common interface to all sound object types.
//
/////////////////////////////////////////////////////////////////////////////////
class AudibleSoundClass : public SoundSceneObjClass
{
public:
//////////////////////////////////////////////////////////////////////
// Friend classes
//////////////////////////////////////////////////////////////////////
friend class WWAudioClass;
//////////////////////////////////////////////////////////////////////
// Public data types
//////////////////////////////////////////////////////////////////////
typedef enum
{
TYPE_MUSIC = 0,
TYPE_SOUND_EFFECT,
TYPE_DIALOG,
TYPE_CINEMATIC,
TYPE_COUNT
} SOUND_TYPE;
typedef enum
{
STATE_STOPPED = 0,
STATE_PLAYING,
STATE_PAUSED,
STATE_COUNT
} SOUND_STATE;
//////////////////////////////////////////////////////////////////////
// Public constructors/destructors
//////////////////////////////////////////////////////////////////////
AudibleSoundClass (const AudibleSoundClass &src);
AudibleSoundClass (void);
virtual ~AudibleSoundClass (void);
//////////////////////////////////////////////////////////////////////
// Public operators
//////////////////////////////////////////////////////////////////////
const AudibleSoundClass &operator= (const AudibleSoundClass &src);
//////////////////////////////////////////////////////////////////////
// Identification methods
//////////////////////////////////////////////////////////////////////
virtual SOUND_CLASSID Get_Class_ID (void) const { return CLASSID_2D; }
virtual SOUND_TYPE Get_Type (void) const { return m_Type; }
virtual void Set_Type (SOUND_TYPE type) { m_Type = type; }
//////////////////////////////////////////////////////////////////////
// Conversion methods
//////////////////////////////////////////////////////////////////////
virtual AudibleSoundClass * As_AudibleSoundClass(void) { return this; }
//////////////////////////////////////////////////////////////////////
// Update methods
//////////////////////////////////////////////////////////////////////
virtual bool On_Frame_Update (unsigned int milliseconds = 0);
//////////////////////////////////////////////////////////////////////
// State control methods
//////////////////////////////////////////////////////////////////////
virtual bool Play (bool alloc_handle = true);
virtual bool Pause (void);
virtual bool Resume (void);
virtual bool Stop (bool remove_from_playlist = true);
virtual void Seek (unsigned long milliseconds);
virtual SOUND_STATE Get_State (void) const { return m_State; }
virtual void Fade_Out (int time_in_ms);
virtual void Fade_In (int time_in_ms);
// The timestamp represents when the sound started playing
virtual unsigned long Get_Timestamp (void) const { return m_Timestamp; }
//////////////////////////////////////////////////////////////////////
// Virtual channel support
//////////////////////////////////////////////////////////////////////
virtual int Get_Virtual_Channel (void) const { return m_VirtualChannel; }
virtual void Set_Virtual_Channel (int channel) { m_VirtualChannel = channel; }
//////////////////////////////////////////////////////////////////////
// Informational methods
//////////////////////////////////////////////////////////////////////
virtual LPCTSTR Get_Filename (void) const;
virtual bool Is_Playing (void) const {return(Get_State() == STATE_PLAYING);}
//////////////////////////////////////////////////////////////////////
// Pan control
//////////////////////////////////////////////////////////////////////
//
// Note: Pan values are normalized values from 0 (hard left) to
// 1.0F (hard right). Dead center is 0.5F.
//
virtual float Get_Pan (void);
virtual void Set_Pan (float pan = 0.5F);
//////////////////////////////////////////////////////////////////////
// Volume control
//////////////////////////////////////////////////////////////////////
virtual float Get_Volume (void);
virtual void Set_Volume (float volume = 1.0F);
virtual void Update_Volume (void) { Set_Volume (m_Volume); }
//////////////////////////////////////////////////////////////////////
// Loop control
//////////////////////////////////////////////////////////////////////
virtual int Get_Loop_Count (void) const { return m_LoopCount; }
virtual int Get_Loops_Left (void) const;
// Note: Use the INFINITE_LOOPS constant for an infinite number of loops. (i.e. for use w/ music)
virtual void Set_Loop_Count (int count = 1);
//////////////////////////////////////////////////////////////////////
// Priority control
//////////////////////////////////////////////////////////////////////
virtual float Get_Priority (void) const { return m_Priority; }
virtual float Peek_Priority (void) const { return m_Priority; }
virtual void Set_Priority (float priority = 0.5F);
virtual float Get_Runtime_Priority (void) const { return m_RuntimePriority; }
virtual void Set_Runtime_Priority (float priority) { m_RuntimePriority = priority; }
//////////////////////////////////////////////////////////////////////
// Playback rate control
//////////////////////////////////////////////////////////////////////
virtual int Get_Playback_Rate (void);
virtual void Set_Playback_Rate (int rate_in_hz);
virtual float Get_Pitch_Factor (void) { return m_PitchFactor; }
virtual void Set_Pitch_Factor (float factor);
//////////////////////////////////////////////////////////////////////
// Buffer position manipulation
//////////////////////////////////////////////////////////////////////
//
// Note: The duration is in milliseconds. The play position
// can either be set as a normalized value from 0 to 1 or a millisecond
// offset from the start of the sound.
//
virtual unsigned long Get_Duration (void) const { return m_Length; }
virtual unsigned long Get_Play_Position (void) const { return m_CurrentPosition; }
virtual void Set_Play_Position (float position) { Seek (position * m_Length); }
virtual void Set_Play_Position (unsigned long milliseconds) { Seek (milliseconds); }
virtual void Set_Start_Offset (float offset) { m_StartOffset = offset; }
virtual float Get_Start_Offset (void) const { return m_StartOffset; }
//////////////////////////////////////////////////////////////////////
// Position/direction methods
//////////////////////////////////////////////////////////////////////
virtual void Set_Position (const Vector3 &position);
virtual Vector3 Get_Position (void) const { return m_Transform.Get_Translation (); }
virtual void Set_Listener_Transform (const Matrix3D &tm) { m_ListenerTransform = tm; }
virtual void Set_Transform (const Matrix3D &transform);
virtual Matrix3D Get_Transform (void) const { return m_Transform; }
//////////////////////////////////////////////////////////////////////
// Culling methods
//////////////////////////////////////////////////////////////////////
virtual void Cull_Sound (bool culled = true);
virtual bool Is_Sound_Culled (void) const { return m_IsCulled; }
//////////////////////////////////////////////////////////////////////
// Scene integration
//////////////////////////////////////////////////////////////////////
virtual void Add_To_Scene (bool start_playing = true);
virtual void Remove_From_Scene (void);
//////////////////////////////////////////////////////////////////////
// Attenuation settings
//////////////////////////////////////////////////////////////////////
//
// This is the distance where the sound can not be heard any longer. (its vol is 0)
//
virtual void Set_DropOff_Radius (float radius = 1);
virtual float Get_DropOff_Radius (void) const { return m_DropOffRadius; }
//////////////////////////////////////////////////////////////////////
// Update methods
//////////////////////////////////////////////////////////////////////
virtual void Set_Dirty (bool dirty = true) { m_bDirty = dirty; }
virtual bool Is_Dirty (void) const { return m_bDirty; }
//////////////////////////////////////////////////////////////////////
// Definition managmenent
//////////////////////////////////////////////////////////////////////
virtual void Set_Definition (AudibleSoundDefinitionClass *def) { m_Definition = def; }
virtual AudibleSoundDefinitionClass * Get_Definition (void) { return m_Definition; }
//////////////////////////////////////////////////////////////////////
// Conversion methods
//////////////////////////////////////////////////////////////////////
virtual void Re_Sync (AudibleSoundClass &src);
virtual void Free_Conversion (void);
virtual void Convert_To_Filtered (void);
virtual AudibleSoundClass *As_Converted_Format (void);
//////////////////////////////////////////////////////////////////////
// From PersistClass
//////////////////////////////////////////////////////////////////////
const PersistFactoryClass & Get_Factory (void) const;
bool Save (ChunkSaveClass &csave);
bool Load (ChunkLoadClass &cload);
protected:
//////////////////////////////////////////////////////////////////////
// Protected methods
//////////////////////////////////////////////////////////////////////
virtual float Determine_Real_Volume (void) const;
virtual void Internal_Set_Volume (float volume = 1.0F);
virtual void Update_Fade (void);
bool Verify_Playability (void);
//////////////////////////////////////////////////////////////////////
// Handle information
//////////////////////////////////////////////////////////////////////
virtual SoundHandleClass * Get_Miles_Handle (void) const { return m_SoundHandle; }
virtual void Set_Miles_Handle (MILES_HANDLE handle = INVALID_MILES_HANDLE);
virtual void Free_Miles_Handle (void);
virtual void Initialize_Miles_Handle (void);
virtual void Allocate_Miles_Handle (void);
//////////////////////////////////////////////////////////////////////
// Buffer information
//////////////////////////////////////////////////////////////////////
virtual SoundBufferClass * Get_Buffer (void) const;
virtual SoundBufferClass * Peek_Buffer (void) const;
virtual void Set_Buffer (SoundBufferClass *buffer);
//////////////////////////////////////////////////////////////////////
// Loop methods
//////////////////////////////////////////////////////////////////////
virtual void Restart_Loop (void) {}
virtual void Update_Play_Position (void);
//////////////////////////////////////////////////////////////////////
// Event handling
//////////////////////////////////////////////////////////////////////
virtual void On_Loop_End (void);
//////////////////////////////////////////////////////////////////////
// Protected constants
//////////////////////////////////////////////////////////////////////
typedef enum
{
FADE_NONE = 0,
FADE_IN,
FADE_OUT,
} FADE_TYPE;
//////////////////////////////////////////////////////////////////////
// Protected member data
//////////////////////////////////////////////////////////////////////
SoundHandleClass * m_SoundHandle;
unsigned long m_Timestamp;
SOUND_STATE m_State;
SOUND_TYPE m_Type;
FADE_TYPE m_FadeType;
int m_FadeTimer;
int m_FadeTime;
int m_VirtualChannel;
// Buffer information
SoundBufferClass * m_Buffer;
// Cached settings
float m_RuntimePriority;
float m_Priority;
float m_Volume;
float m_RealVolume;
float m_Pan;
int m_LoopCount;
int m_LoopsLeft;
// Offset and length information (in milliseconds)
unsigned long m_Length;
unsigned long m_CurrentPosition;
float m_StartOffset;
float m_PitchFactor;
// 3D scene information
Matrix3D m_ListenerTransform;
Matrix3D m_Transform;
Matrix3D m_PrevTransform;
bool m_IsCulled;
bool m_bDirty;
float m_DropOffRadius;
// Conversion data
AudibleSoundClass * m_pConvertedFormat;
// Definition pointer
AudibleSoundDefinitionClass * m_Definition;
// Logical sound information
LogicalSoundClass * m_LogicalSound;
};
//////////////////////////////////////////////////////////////////////////////////
//
// AudibleSoundDefinitionClass
//
//////////////////////////////////////////////////////////////////////////////////
class AudibleSoundDefinitionClass : public DefinitionClass
{
public:
/////////////////////////////////////////////////////////////////////
// Editable interface requirements
/////////////////////////////////////////////////////////////////////
DECLARE_EDITABLE(AudibleSoundDefinitionClass, DefinitionClass);
//////////////////////////////////////////////////////////////
// Public constructors/destructors
//////////////////////////////////////////////////////////////
AudibleSoundDefinitionClass (void);
virtual ~AudibleSoundDefinitionClass (void) { }
// From DefinitionClass
virtual uint32 Get_Class_ID (void) const;
// From PersistClass
virtual const PersistFactoryClass & Get_Factory (void) const;
virtual bool Save (ChunkSaveClass &csave);
virtual bool Load (ChunkLoadClass &cload);
virtual PersistClass * Create (void) const;
virtual AudibleSoundClass * Create_Sound (int classid_hint) const;
// Initialization
virtual void Initialize_From_Sound (AudibleSoundClass *sound);
// Accessors
virtual const StringClass & Get_Filename (void) const { return m_Filename; }
virtual const StringClass & Get_Display_Text (void) const { return m_DisplayText; }
virtual float Get_Max_Vol_Radius (void) const { return m_MaxVolRadius; }
virtual float Get_DropOff_Radius (void) const { return m_DropOffRadius; }
virtual const Vector3 & Get_Sphere_Color (void) const { return m_AttenuationSphereColor; }
virtual float Get_Volume (void) const { return m_Volume; }
virtual float Get_Volume_Randomizer (void) const { return m_VolumeRandomizer; }
virtual float Get_Start_Offset (void) const { return m_StartOffset; }
virtual float Get_Pitch_Factor (void) const { return m_PitchFactor; }
virtual float Get_Pitch_Factor_Randomizer (void) const { return m_PitchFactorRandomizer; }
virtual int Get_Virtual_Channel (void) const { return m_VirtualChannel; }
virtual void Set_Volume (float volume) { m_Volume = volume; }
virtual void Set_Volume_Randomizer (float value) { m_VolumeRandomizer = value; }
virtual void Set_Max_Vol_Radius (float radius) { m_MaxVolRadius = radius; }
virtual void Set_DropOff_Radius (float radius) { m_DropOffRadius = radius; }
virtual void Set_Start_Offset (float offset) { m_StartOffset = offset; }
virtual void Set_Pitch_Factor (float factor) { m_PitchFactor = factor; }
virtual void Set_Pitch_Factor_Randomizer (float value) { m_PitchFactorRandomizer = value; }
virtual void Set_Virtual_Channel (int channel) { m_VirtualChannel = channel; }
// Logical sound creation
virtual LogicalSoundClass * Create_Logical (void);
protected:
/////////////////////////////////////////////////////////////////////
// Private methods
/////////////////////////////////////////////////////////////////////
bool Save_Variables (ChunkSaveClass &csave);
bool Load_Variables (ChunkLoadClass &cload);
//////////////////////////////////////////////////////////////
// Private member data
//////////////////////////////////////////////////////////////
float m_Priority;
float m_Volume;
float m_VolumeRandomizer;
float m_Pan;
int m_LoopCount;
int m_VirtualChannel;
float m_DropOffRadius;
float m_MaxVolRadius;
bool m_Is3D;
StringClass m_Filename;
int m_Type;
StringClass m_DisplayText;
float m_StartOffset;
float m_PitchFactor;
float m_PitchFactorRandomizer;
int m_LogicalTypeMask;
float m_LogicalNotifyDelay;
float m_LogicalDropOffRadius;
bool m_CreateLogical;
// Misc UI info
Vector3 m_AttenuationSphereColor;
};
#endif //__SOUNDOBJ_H