168 lines
9.7 KiB
C
168 lines
9.7 KiB
C
|
// Copyright (C) 2002-2018 Nikolaus Gebhardt
|
||
|
// This file is part of the "irrKlang" library.
|
||
|
// For conditions of distribution and use, see copyright notice in irrKlang.h
|
||
|
|
||
|
#ifndef __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__
|
||
|
#define __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__
|
||
|
|
||
|
#include "ik_IVirtualRefCounted.h"
|
||
|
#include "ik_vec3d.h"
|
||
|
#include "ik_EStreamModes.h"
|
||
|
#include "ik_SAudioStreamFormat.h"
|
||
|
|
||
|
|
||
|
namespace irrklang
|
||
|
{
|
||
|
|
||
|
//! A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings.
|
||
|
/** It provides some informations about the sound source like the play lenght and
|
||
|
can have default settings for volume, distances for 3d etc. There is some example code on how
|
||
|
to use Sound sources at @ref soundSources.*/
|
||
|
class ISoundSource : public IVirtualRefCounted
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//! Returns the name of the sound source (usually, this is the file name)
|
||
|
virtual const ik_c8* getName() = 0;
|
||
|
|
||
|
//! Sets the stream mode which should be used for a sound played from this source.
|
||
|
/** Note that if this is set to ESM_NO_STREAMING, the engine still might decide
|
||
|
to stream the sound if it is too big. The threashold for this can be
|
||
|
adjusted using ISoundSource::setForcedStreamingThreshold(). */
|
||
|
virtual void setStreamMode(E_STREAM_MODE mode) = 0;
|
||
|
|
||
|
//! Returns the detected or set type of the sound with wich the sound will be played.
|
||
|
/** Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the
|
||
|
sound has been played the first time. */
|
||
|
virtual E_STREAM_MODE getStreamMode() = 0;
|
||
|
|
||
|
//! Returns the play length of the sound in milliseconds.
|
||
|
/** Returns -1 if not known for this sound for example because its decoder
|
||
|
does not support lenght reporting or it is a file stream of unknown size.
|
||
|
Note: If the sound never has been played before, the sound engine will have to open
|
||
|
the file and try to get the play lenght from there, so this call could take a bit depending
|
||
|
on the type of file. */
|
||
|
virtual ik_u32 getPlayLength() = 0;
|
||
|
|
||
|
//! Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc.
|
||
|
/** \return Returns the structure filled with 0 or negative values if not known for this sound for example because
|
||
|
because the file could not be opened or similar.
|
||
|
Note: If the sound never has been played before, the sound engine will have to open
|
||
|
the file and try to get the play lenght from there, so this call could take a bit depending
|
||
|
on the type of file. */
|
||
|
virtual SAudioStreamFormat getAudioFormat() = 0;
|
||
|
|
||
|
//! Returns if sounds played from this source will support seeking via ISound::setPlayPosition().
|
||
|
/* If a sound is seekable depends on the file type and the audio format. For example MOD files
|
||
|
cannot be seeked currently.
|
||
|
\return Returns true of the sound source supports setPlayPosition() and false if not.
|
||
|
Note: If the sound never has been played before, the sound engine will have to open
|
||
|
the file and try to get the information from there, so this call could take a bit depending
|
||
|
on the type of file. */
|
||
|
virtual bool getIsSeekingSupported() = 0;
|
||
|
|
||
|
//! Sets the default volume for a sound played from this source.
|
||
|
/** The default value of this is 1.0f.
|
||
|
Note that the default volume is being multiplied with the master volume
|
||
|
of ISoundEngine, change this via ISoundEngine::setSoundVolume().
|
||
|
//! \param volume 0 (silent) to 1.0f (full volume). Default value is 1.0f. */
|
||
|
virtual void setDefaultVolume(ik_f32 volume=1.0f) = 0;
|
||
|
|
||
|
//! Returns the default volume for a sound played from this source.
|
||
|
/** You can influence this default volume value using setDefaultVolume().
|
||
|
Note that the default volume is being multiplied with the master volume
|
||
|
of ISoundEngine, change this via ISoundEngine::setSoundVolume().
|
||
|
//! \return 0 (silent) to 1.0f (full volume). Default value is 1.0f. */
|
||
|
virtual ik_f32 getDefaultVolume() = 0;
|
||
|
|
||
|
//! sets the default minimal distance for 3D sounds played from this source.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
See ISound::setMinDistance() for details about what the min distance is.
|
||
|
This method only influences the initial distance value of sounds. For changing the
|
||
|
distance while the sound is playing, use ISound::setMinDistance() and ISound::setMaxDistance().
|
||
|
\param minDistance: Default minimal distance for 3D sounds from this source. Set it to a negative
|
||
|
value to let sounds of this source use the engine level default min distance, which
|
||
|
can be set via ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing
|
||
|
the default min distance of the sound engine to take effect. */
|
||
|
virtual void setDefaultMinDistance(ik_f32 minDistance) = 0;
|
||
|
|
||
|
//! Returns the default minimal distance for 3D sounds played from this source.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
See ISound::setMinDistance() for details about what the minimal distance is.
|
||
|
\return Default minimal distance for 3d sounds from this source. If setDefaultMinDistance()
|
||
|
was set to a negative value, it will return the default value set in the engine,
|
||
|
using ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing
|
||
|
the default min distance of the sound engine to take effect. */
|
||
|
virtual ik_f32 getDefaultMinDistance() = 0;
|
||
|
|
||
|
//! Sets the default maximal distance for 3D sounds played from this source.
|
||
|
/** Changing this value is usually not necessary. Use setDefaultMinDistance() instead.
|
||
|
Don't change this value if you don't know what you are doing: This value causes the sound
|
||
|
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||
|
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||
|
minimal distance (using for example setDefaultMinDistance()) to influence this.
|
||
|
See ISound::setMaxDistance() for details about what the max distance is.
|
||
|
This method only influences the initial distance value of sounds. For changing the
|
||
|
distance while the sound is played, use ISound::setMinDistance()
|
||
|
and ISound::setMaxDistance().
|
||
|
\param maxDistance Default maximal distance for 3D sounds from this source. Set it to a negative
|
||
|
value to let sounds of this source use the engine level default max distance, which
|
||
|
can be set via ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing
|
||
|
the default max distance of the sound engine to take effect. */
|
||
|
virtual void setDefaultMaxDistance(ik_f32 maxDistance) = 0;
|
||
|
|
||
|
//! returns the default maxmial distance for 3D sounds played from this source.
|
||
|
/** This value influences how loud a sound is heard based on its distance.
|
||
|
Changing this value is usually not necessary. Use setDefaultMinDistance() instead.
|
||
|
Don't change this value if you don't know what you are doing: This value causes the sound
|
||
|
to stop attenuating after it reaches the max distance. Most people think that this sets the
|
||
|
volume of the sound to 0 after this distance, but this is not true. Only change the
|
||
|
minimal distance (using for example setDefaultMinDistance()) to influence this.
|
||
|
See ISound::setMaxDistance() for details about what the max distance is.
|
||
|
\return Default maximal distance for 3D sounds from this source. If setDefaultMaxDistance()
|
||
|
was set to a negative value, it will return the default value set in the engine,
|
||
|
using ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing
|
||
|
the default max distance of the sound engine to take effect. */
|
||
|
virtual ik_f32 getDefaultMaxDistance() = 0;
|
||
|
|
||
|
//! Forces the sound to be reloaded at next replay.
|
||
|
/** Sounds which are not played as streams are buffered to make it possible to
|
||
|
replay them without much overhead. If the sound file is altered after the sound
|
||
|
has been played the first time, the engine won't play the changed file then.
|
||
|
Calling this method makes the engine reload the file before the file is played
|
||
|
the next time.*/
|
||
|
virtual void forceReloadAtNextUse() = 0;
|
||
|
|
||
|
//! Sets the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
|
||
|
/** When specifying ESM_NO_STREAMING for playing back a sound file, irrKlang will
|
||
|
ignore this setting if the file is bigger than this threshold and stream the file
|
||
|
anyway. Please note that if an audio format loader is not able to return the
|
||
|
size of a sound source and returns -1 as length, this will be ignored as well
|
||
|
and streaming has to be forced.
|
||
|
\param threshold: New threshold. The value is specified in uncompressed bytes and its default value is
|
||
|
about one Megabyte. Set to 0 or a negative value to disable stream forcing. */
|
||
|
virtual void setForcedStreamingThreshold(ik_s32 thresholdBytes) = 0;
|
||
|
|
||
|
//! Returns the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
|
||
|
/** The value is specified in uncompressed bytes and its default value is
|
||
|
about one Megabyte. See setForcedStreamingThreshold() for details. */
|
||
|
virtual ik_s32 getForcedStreamingThreshold() = 0;
|
||
|
|
||
|
//! Returns a pointer to the loaded and decoded sample data.
|
||
|
/** \return Returns a pointer to the sample data. The data is provided in decoded PCM data. The
|
||
|
exact format can be retrieved using getAudioFormat(). Use getAudioFormat().getSampleDataSize()
|
||
|
for getting the amount of bytes. The returned pointer will only be valid as long as the sound
|
||
|
source exists.
|
||
|
This function will only return a pointer to the data if the
|
||
|
audio file is not streamed, namely ESM_NO_STREAMING. Otherwise this function will return 0.
|
||
|
Note: If the sound never has been played before, the sound engine will have to open
|
||
|
the file and decode audio data from there, so this call could take a bit depending
|
||
|
on the type of the file.*/
|
||
|
virtual void* getSampleData() = 0;
|
||
|
};
|
||
|
|
||
|
} // end namespace irrklang
|
||
|
|
||
|
|
||
|
#endif
|