253 lines
8.4 KiB
C++
253 lines
8.4 KiB
C++
/*************************************************************************/
|
|
/* File : CKWaveSound.h */
|
|
/* Author : Aymeric Bard */
|
|
/* */
|
|
/* Virtools SDK */
|
|
/* Copyright (c) Virtools 2000, All Rights Reserved. */
|
|
/*************************************************************************/
|
|
#ifndef CKWAVESOUND_H
|
|
|
|
#define CKWAVESOUND_H "$Id:$"
|
|
|
|
#include "CKSound.h"
|
|
|
|
class CKSoundReader;
|
|
|
|
/**************************************************************************
|
|
{filename:CKWaveSound}
|
|
Summary: Wave sound.
|
|
|
|
Remarks:
|
|
+ CKWaveSound provides methods for playing a wave sound file (Wav,etc..)
|
|
|
|
+ The sound can be played using 3D , stero , frequency control ,
|
|
panning and volume control.
|
|
+ Sound file are not loaded but read from disk by a separate thread.
|
|
|
|
+ Its class id is CKCID_WAVESOUND
|
|
See also: CKMidiSound,CKSoundManager
|
|
******************************************************************************/
|
|
class CKWaveSound : public CKSound {
|
|
friend class CKSoundManager;
|
|
public :
|
|
#ifdef DOCJETDUMMY // DOCJET secret macro
|
|
#else
|
|
|
|
//-----------------------------------------------------
|
|
// Sound Duplication for Instance Playing
|
|
CKSOUNDHANDLE PlayMinion(CKBOOL Background=TRUE,CK3dEntity* Ent=NULL,VxVector* Position=NULL,VxVector* Direction=NULL,float MinDelay = 0.0f,float gain=1.0f);
|
|
|
|
//---------------------------------------------------------
|
|
// Associated filename
|
|
CKERROR SetSoundFileName(const CKSTRING FileName);
|
|
CKSTRING GetSoundFileName();
|
|
|
|
//----------------------------------------------------------
|
|
// Parameter PCM
|
|
int GetSoundLength();
|
|
CKERROR GetSoundFormat(CKWaveFormat &Format);
|
|
//----------------------------------------------------------
|
|
// Sound Type
|
|
CK_WAVESOUND_TYPE GetType();
|
|
void SetType(CK_WAVESOUND_TYPE Type);
|
|
//----------------------------------------------------------
|
|
// Sound State
|
|
CKDWORD GetState();
|
|
void SetState(CKDWORD State);
|
|
|
|
//----------------------------------------------------------
|
|
// Priority of the sound : between 0.0(lowest) and 1.0(highest). Default is 0.5
|
|
void SetPriority(float Priority);
|
|
float GetPriority();
|
|
|
|
//----------------------------------------------------------
|
|
// Activation of the loop mode : TOSETUP
|
|
void SetLoopMode(CKBOOL Enabled);
|
|
CKBOOL GetLoopMode();
|
|
|
|
|
|
//----------------------------------------------------------
|
|
// File Streaming
|
|
CKERROR SetFileStreaming(CKBOOL Enabled,BOOL RecreateSound=FALSE);
|
|
CKBOOL GetFileStreaming();
|
|
|
|
//-----------------------------------------------------
|
|
// PlayBack Control
|
|
// plays the sound with a faded
|
|
void Play(float FadeIn=0,float FinalGain=1.0f);
|
|
void Resume();
|
|
void Rewind();
|
|
|
|
//----------------------------------------------------------
|
|
// Stops the sound with a fade
|
|
void Stop(float FadeOut=0);
|
|
|
|
void Pause();
|
|
|
|
//----------------------------------------------------------
|
|
CKBOOL IsPlaying();
|
|
CKBOOL IsPaused();
|
|
|
|
//------------------------------------------------
|
|
// 2D/3D Members Functions
|
|
|
|
// Sets and gets the playback gain of a source. 0.....1.0
|
|
void SetGain(float Gain);
|
|
float GetGain();
|
|
//----------------------------------------------------------
|
|
// Sets and gets the playback pitch bend of a source. 0.5....2.0
|
|
void SetPitch(float Rate);
|
|
float GetPitch();
|
|
//----------------------------------------------------------
|
|
// Sets the gains for multi-channel, non-spatialized sources. -1.0....1.0 default(0.0)
|
|
void SetPan(float Pan);
|
|
float GetPan();
|
|
|
|
|
|
CKSOUNDHANDLE GetSource();
|
|
//----------------------------------------------------------
|
|
// 3D Members Functions
|
|
|
|
//----------------------------------------------------------
|
|
// Attach the sound to an object : TOSETUP
|
|
void PositionSound(CK3dEntity* Object,VxVector* Position=NULL,VxVector* Direction=NULL,CKBOOL Commit=FALSE);
|
|
CK3dEntity* GetAttachedEntity();
|
|
void GetPosition(VxVector& Pos);
|
|
void GetDirection(VxVector& Dir);
|
|
void GetSound3DInformation(VxVector& Pos,VxVector& Dir,float& DistanceFromListener);
|
|
|
|
|
|
//----------------------------------------------------------
|
|
// Sets the directionality of a source cone. 0.....180 for the angles, gain 0....1.0 : TOSETUP
|
|
void SetCone(float InAngle, float OutAngle, float OutsideGain);
|
|
void GetCone(float* InAngle, float* OutAngle, float* OutsideGain);
|
|
//----------------------------------------------------------
|
|
// Distance min/maximum de perception (maxdbehavior = 1(mute) ou 0(audible)), distances form 0.....n with max>min : TOSETUP
|
|
void SetMinMaxDistance(float MinDistance,float MaxDistance,CKDWORD MaxDistanceBehavior = 1);
|
|
void GetMinMaxDistance(float* MinDistance,float* MaxDistance,CKDWORD* MaxDistanceBehavior);
|
|
|
|
// These functions are for direct access to the source : You don't have to use them normally.
|
|
//----------------------------------------------------------
|
|
// Velocity of the Source
|
|
void SetVelocity(VxVector& Pos);
|
|
void GetVelocity(VxVector& Pos);
|
|
//----------------------------------------------------------
|
|
// Orientation of the source
|
|
void SetOrientation(VxVector& Dir,VxVector& Up);
|
|
void GetOrientation(VxVector& Dir,VxVector& Up);
|
|
|
|
//----------------------------------------------------------
|
|
// Write Data in the sound buffer
|
|
CKERROR WriteData(BYTE* Buffer,int Buffersize);
|
|
|
|
//----------------------------------------------------------
|
|
// Buffer access
|
|
CKERROR Lock(CKDWORD WriteCursor,CKDWORD NumBytes,void **Ptr1,CKDWORD *Bytes1,void **Ptr2,CKDWORD *Bytes2,CK_WAVESOUND_LOCKMODE Flags);
|
|
CKERROR Unlock(void *Ptr1,CKDWORD Bytes1,void *Ptr2,CKDWORD Bytes2);
|
|
|
|
//----------------------------------------------------------
|
|
// Position in the sound buffer
|
|
CKDWORD GetPlayPosition();
|
|
|
|
int GetPlayedMs();
|
|
|
|
//----------------------------------------------------------
|
|
// Creation of the buffer and
|
|
CKERROR Create(CKBOOL FileStreaming,CKSTRING Filename);
|
|
CKERROR Create(CK_WAVESOUND_TYPE Type,CKWaveFormat* Format,int Size);
|
|
CKERROR SetReader(CKSoundReader* Reader);
|
|
CKSoundReader* GetReader();
|
|
|
|
void SetDataToRead(int Size);
|
|
|
|
CKERROR Recreate(BOOL Safe = FALSE);
|
|
void Release();
|
|
|
|
|
|
CKERROR TryRecreate();
|
|
|
|
//----------------------------------------------------------
|
|
// Update the position, according to the attached object
|
|
|
|
void UpdatePosition(float deltaT);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Internal functions
|
|
|
|
void UpdateFade();
|
|
CKERROR WriteDataFromReader();
|
|
void FillWithBlanks(CKBOOL IncBf = FALSE);
|
|
void InternalStop();
|
|
|
|
|
|
CKWaveSound(CKContext *Context,CKSTRING Name=NULL);
|
|
virtual ~CKWaveSound();
|
|
virtual CK_CLASSID GetClassID();
|
|
|
|
virtual CKStateChunk* Save(CKFile *File,CKDWORD Flags);
|
|
virtual CKERROR Load(CKStateChunk *Chunk,CKFile* File);
|
|
|
|
virtual CKERROR RemapDependencies(CKDependenciesContext& context);
|
|
virtual CKERROR Copy(CKObject& o,CKDependenciesContext& context);
|
|
|
|
virtual void CheckPostDeletion();
|
|
|
|
virtual int GetMemoryOccupation();
|
|
//--------------------------------------------
|
|
// Class Registering
|
|
static CKSTRING GetClassName();
|
|
static int GetDependenciesCount(int Mode);
|
|
static CKSTRING GetDependencies(int i,int Mode);
|
|
static void Register();
|
|
static CKWaveSound* CreateInstance(CKContext *Context);
|
|
static void ReleaseInstance(CKContext* iContext,CKWaveSound*);
|
|
static CK_CLASSID m_ClassID;
|
|
|
|
// Dynamic Cast method (returns NULL if the object can't be casted)
|
|
static CKWaveSound* Cast(CKObject* iO)
|
|
{
|
|
return CKIsChildClassOf(iO,CKCID_WAVESOUND)?(CKWaveSound*)iO:NULL;
|
|
}
|
|
|
|
// protected:
|
|
CKSoundManager* m_SoundManager;
|
|
void* m_Source;
|
|
CKDWORD m_State;
|
|
CK_ID m_AttachedObject;
|
|
VxVector m_OldPosition;
|
|
VxVector m_Position;
|
|
VxVector m_Direction;
|
|
float m_FinalGain;
|
|
float m_FadeTime;
|
|
float m_CurrentTime;
|
|
int m_BufferPos;
|
|
int m_BufferSize;
|
|
CKSoundReader* m_SoundReader;
|
|
int m_DataRead;
|
|
int m_DataToRead;
|
|
int m_DataPlayed;
|
|
int m_OldCursorPos;
|
|
int m_Duration; // Duration in milliseconds
|
|
CKWaveFormat m_WaveFormat;
|
|
|
|
int GetDistanceFromCursor();
|
|
void InternalSetGain(float Gain);
|
|
|
|
void SaveSettings();
|
|
void RestoreSettings();
|
|
|
|
|
|
void * ReallocSource(void *oSource,int alreadyWritten,int newSize);
|
|
|
|
|
|
// Save Information From Current source
|
|
CKWaveSoundSettings m_2DSetting;
|
|
CKWaveSound3DSettings m_3DSetting;
|
|
|
|
#endif // Docjet secret macro
|
|
|
|
};
|
|
|
|
#endif
|
|
|